Народ помогите

Нужно поменять цвет ссылок в задачах, в схеме "ReminderNotificationsSchema"

Беру конкретную ссылку и пытаюсь впендюрить стиль:

                        "styles": {
                            "wrapStyles": {
                                "color": "orange"
                                }
                        },
 

Но ничего не получается:

Нравится

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

Роман, здравствуйте! 

Правильно ли понимаем, Вы хотите поменять цвет в уведомлениях, которые всплывают в окне браузера? Укажите, пожалуйста, конкретную область приложения (желательно скриншот).

Вильшанский Дмитрий,

Задача за счет изменения цвета ссылки визуально разделить элементы. 

Ссылки - это элементы в секции diff, модуля  ReminderNotificationsSchema.

В DOM структуре элемент ссылка выглядит так:

<a id="ReminderNotificationsSchemaNotificationSubjectCaptionHyperlink-b65f0b81-b776-4ee6-a44a-5b2ff3d2652f-ReminderTabModule" name="" href="" target="_blank" class="t-label label-link" style="" title="" type="" data-item-marker="NotificationSubjectCaption">ООО Ромашка</a>

Ну и задача тупо заполнить в элементе style="color:orange"

 

 

Роман,

А почему "wrapStyles"? Посмотрите в доках - свойство styles должно совпадать с тем, что прописано в шаблоне (tpl) класса компонента.

Попробуйте вместе wrapStyles прописать hyperlinkStyle - должно заработать.

Роман, а в чем собственно проблема?

В runtime получается реализовать? Наверное да. В этом случае вам нужно просто написать свой css с нужными селекторами. И более ничего.

К примеру selector для reindings

label[id^="VisaNotificationsSchemaNotificationSubjectCaptionLabel"][id$="VisaNotificationsTabModule"] {
  color: red;
}

 

Спасибо за ответы

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

Добрый день.

При попытке отправки письма из кастомного раздела http://prntscr.com/ihb4m0 возникает ошибка: "Не удалось отправить письмо. Значение с именем "UsrSectionTitleId" не найдено", где UsrSectionTitle - название раздела.

Id в разделе естественно присутствует, но называется не "UsrSectionTitleId" а просто "Id".

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

Нравится

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

Здравствуйте Станислав,

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

Спасибо!

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

Приветы,

 

Подскажите как получать данные в 

onActiveRowAction: function(buttonTag, Id, parentOnActiveRowAction) {

                switch (buttonTag) {

                    // замещение базового метода для правильной обработки нажатия по тэгу

                    case "tagBnBackCall":

                        alert('QBackCall! = ' + Id);

Пару вопросов:

Дано Id данных есть - выбранной строки 

Как получить данные из других столбцов грида через запрос к БД

Как через this добраться к jquery желательно? 

Нравится

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

Привет,



если есть айди записи, то получение данных из бд есть на академии https://academy.terrasoft.ru/documents/technic-sdk/7-11/ispolzovanie-en…;



на примере что то вроде такого:

 

var id = Id; // Айди выбранной записи
var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "Contact" }); // Таблица куда запрос
esq.addColumn("Name");//К примеру имя, можно добавить остальные колонки, подробнее по ссылке
esq.getEntity(id, function (result) {
    if (!result.success) {
        this.showInformationDialog("Ошибка запроса данных"); 
        return;
    }
    // Какие либо действия 
    this.showInformationDialog(result.entity.get("Name");//Например вывести имя
}, this);

Тут показал пример getEntity так же рекомендую посмотреть на реализацию getEntityCollection и добавление колонок в запрос.

"Как через this добраться к jquery желательно? " не понял, что имеется ввиду

Сериков Асхат Кайратович,

Привет, этот пример видел, но есть нюансы, может что-то не настроил или версия не та. По клиентской части вижу в require что jquery есть но не вызывается и в консоли хрома ее как нет, вот код:

                  onActiveRowAction: function(buttonTag, Id, parentOnActiveRowAction) {

                switch (buttonTag) {

                    /*

                    case "edit":

                        alert('Нельзя открыть кандидата!');

                        break;

                    case "copy":

                        alert('Нельзя копировать кандидата!');

                        break;

                    case "delete":

                        alert('Нельзя удалить кандидата!');

                        break;

                    */

                    // замещение базового метода для правильной обработки нажатия по тэгу

                    case "tagBnBackCall":

                        alert('QBackCall! = ' + Id);

                        alert(jQuery.fn.jquery);

                        alert($.fn.jquery);

                        var userId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;

                        var uId = "#SxCandidateSectionDataGridGrid-item-" + Id;//SxCandidateSectionDataGridGrid-item-5713f1f2-7ac2-4970-a3b6-d1ad822335ee

                        alert(uId);

                        var mobNumber = this.JQ(uId).find('a').attr('title');

                        alert(mobNumber);

О JQuery: ни один из алертов где есть jquery не работает, каждый из них по отдельности комментировал, т. е. исключено что ошибка в одном и другие просто не идут. Пробовал просто с $(uId).find('a').attr('title'); and this.JQ(uId).find('a').attr('title'); and this.$(uId).find('a').attr('title'); - в общем у меня в строке грида есть Id и рядом идут нужные данные т. е. по факту мне запрос делать - лишнее. Но попробую с ним тк надо учиться и все такое

QArt,

понял, так глубоко я не копал, надобности использовать jquery как таковой не было. 

Вообще получить значения в гриде можно если пройтись по гриду, сам не пробовал, но думаю это то что вам нужно https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-dobavit-dey…; особенно метод 

showOrderInfo 

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

Сериков Асхат Кайратович,

Спасибо! Cделал, получилось без JQuery.

Учусь, составил себе план:

1) Подменить ViewModel

2) Все-таки, разобраться с JQuery

3) Попробовать сделать тоже самое через var esq = Ext.Create(...

Посоветуй ссылками или кусками кода :)

QArt,

Не за что, сам тоже продолжаю учиться

Для меня Академия лучший источник,

куски кода подходят только по ситуации,

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

По JQuery и ViewModel не имею идей к сожалению

Сериков Асхат Кайратович,

Спасибо. Вот вопросы по запросам к данным в БД. Если нужно читать и писать данные то как и где это делать? Прямо в замещающем клиентском модуле или лучше что-то создавать если создавать то как все это подключать, какие практики?

QArt,

Думаю зависит от ситуации, можешь привести пример в каком контексте будешь писать и читать? 

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

Сериков Асхат Кайратович,

Сейчас сделал кнопку позвонить в кандидатах, он выросли из контактов. Сделал кнопку "позвонить", убрал лишние кнопки. Теперь нужно считать сколько раз звонили кандидату, на кнопке выводить "позвонить (2, 3, ...)". Для реализации создал объект - он стал таблицей, 

AACandCall - idcand, callcount, calltime, calldate наследуется от базового объекта

            //0 если первый раз звонят, -1 if Error

            getCallCount: function (candId) {

                // Создаем экземпляр класса Terrasoft.EntitySchemaQuery с корневой схемой [Contact].

                var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

                    rootSchemaName: "AACandCall"

                });

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

                esq.addColumn("CallCount");

                // Получаем одну запись из выборки по [Id] объекта карточки и отображаем ее

                // в информационном окне.

                esq.getEntity(candId, function(result) {

                if (!result.success) {

                    // обработка/логирование ошибки, например

                    //this.showInformationDialog("Ошибка запроса данных");

                    return -1;

                }

                return result.entity.get("CallCount");

                }, this);

            },


пока это все что смог написать, возвращает undefined т. е. без ошибки работает, еще надо вот такое написать

            updateCount: function (candId, callCount) {

                return -1;      

            },

            //всегда пишет 1 в callCount

            insertCount: function (candId) {

                return -1;      

            },

Вопрос там ли я это вообще делаю и теми ли инструментами???

QArt,

Первый вопрос должен быть почему он вообще возвращает undefined.

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

Если все что нужно это только обновить то как мне кажется подходит клиентская схема.

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

Сериков Асхат Кайратович,

Сделал. Столкнулся с задачей: синхронизации асинхронных вызовов. Функция getCallCount в запросе если такого нет вызывала insertCount(candId), если есть то updateCount(candId, callCount+1). Вообще мне как программисту с бэкенда не понятно как так делать вызовы к БД с клиента к тому же прямо к ОнКлик, но как фронтендер не знаю как это нормально сделать :)

Как обработать событие которое возникает при выборе строки???, когда открывается меню с кнопкой позвонить, ей надо надпись менять "позвонить" или "позвонить(номер звонка)" [важно что эта кнопка нами же добавлена по operation: insert] т. е. будет вызвана функция как getCallCount только у нее вместо insertCount and updateCount будет устанавливаться кнопке соответствующий caption. Вот мой уровень развития на фронтенде только так позволяет это сделать, а как это по нормальному делать не знаю :)

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

Коллеги, может, кто-то сталкивался.

 

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

Соответственно, селекторы у одинаковых полей тоже одинаковы.



Используя стандартный скрипт для landing из bpm'online получается захватывать данные только из первой формы.



Как можно использовать данные именно той формы, на которой произошёл Submit, не настраивая уникальные селекторы на разных формах?

Нравится

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

Добрый день, Владимир!

Если на вашей странице существует несколько форм с одинаковыми селекторами, то блок “config” будет работать только с первым найденным элементом по указанному селектору. это связанно с ограничениями языка JavaScript.

На текущий момент существует только одно решение поставленной задачи: задать к каждому полю уникальный селектор, для каждой формы задать свой блок “config” и свою функцию "create".

Более подробная инструкция находится на сайте академии в статье Как настроить один лендинг для страницы с несколькими веб-формами.

С уважением,

Татьяна

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

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

Например, когда создается файловый объект, бинарные данные в нем VARBINARY(MAX), и FileStream здесь выбрать не получается. ALTER COLUMN?

Еще сервер требует ALTER COLUMN Id ADD ROWGUIDCOL!

Плюс надо создать файловую группу FileStream и минимум 1 файл в этой группе.

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

Нравится

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

Добрый день, Алексей!

Данный вопрос стоит адресовать в поддержку Microsoft, поскольку они разрабатывали данную функциональность. 

Единственное чем могу помочь, это полезной информацией:

 https://docs.microsoft.com/ru-ru/sql/relational-databases/blob/filestream-sql-server

https://www.red-gate.com/simple-talk/sql/learn-sql-server/an-introduction-to-sql-server-filestream/

https://logicalread.com/sql-server-filestream-part1-mo01/#.WosMgKhuaUk

Майкрософт - это конечно, хорошо, но меня волнует вопрос насколько BPM совместима с этой технологией?

Ну вот я, допустим сделаю это всё на сервере разработки, но это же не перенесется через СВН!

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

Алексей-Карягин,

Проверили работу FileStream с базой bpmonline.

Необходимо включить FileStream на серевера, после в БД создать FileGroup, и добавить File, тогда будет возможность создавать в БД таблици которые MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY. 

Поскольку изменить существующие таблицы для работы с FileStream не удастся, есть возможность только в существующую БД добавить новые таблицы.

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

Тогда создав отдельно в БД таблицу с таким же именем как и у схемы, в bpm'online можно будет получить значения из этой таблицы.

В случае с существующими таблицами/схемами не получиться, поскольку необходимо изменять структуру БД, что повлияет на работоспособность базового функционала.

 

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

Добрый день!

Сотрудники отправляют письма из bpm. Зачастую при копировании текста в буфер, а затем вставка в тело email текст вставляется 6 раз. Пробовали одновременно вставлять текст на других сайтах, в документах. Текст вставляется 1 раз.

Быть может кто-то сталкивался с подобной проблемой?

 

Нравится

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

Александр, здравствуйте!

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

И текст копируете с HTML форматированием? Попробуйте вставить этот же буфер в любое поле с поддержкой HTML (например, поле примечания в любом базовом разделе) и посмотрите, в каком виде сохранится значение.

Логвин Андрей Витальевич,

Добрый день!

Копируем при отправке письма вручную.

Сегодня лично у меня воспроизвелась данная проблема, вставил текст в примечание, скопировалось один раз.

Чакур Александр,

Скорее всего, проблема возникает в связи с сторонними программами, которые используют\модифицируют буфер обмена. Возможно, HTML обертка самого элемента отправить email конфликтует.

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

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

Добрый день!

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

Не мог бы кто-нибудь предоставить пошаговую инструкцию по созданию и регистрации нового раздела без использования мастера разделов?

Нравится

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

Иван, здравствуйте!

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

Ниже приведен приблизительный алгоритм реализации (объект «OrderProduct»):

1) Создать страницу раздела.

Для этого Вам необходимо создать схему AlDOrderProductSectionV2 со следующим кодом:

define("AlDOrderProductSectionV2", [],
	function() {
		return {
			entitySchemaName: "OrderProduct",
			messages: {},
            mixins: {},
            attributes: {},
            methods: {},
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
		};
	}
);

 

2) Для объекта "OrderProduct" уже есть запись в таблице SysModuleEntity (объекты разделов). Для получения Id записи необходимо выполнить скрипт:

select SysModuleEntity.Id from SysModuleEntity
join SysSchema
on SysSchema.UId = SysModuleEntity.SysEntitySchemaUId
where SysSchema.Name = 'OrderProduct'

 

3) Получив SysModuleEntity.Id необходимо зарегистрировать сам раздел.

Для регистрации раздела необходимо добавить запись в таблицу SysModule.

Запрос приблизительно следующий:

insert into SysModule
(SectionSchemaUId, Code, SysModuleEntityId, CardSchemaUid, SectionModuleSchemaUid, CardModuleUid)
values
(/*Uid созданной на первом шаге схемы*/, /*Код раздела*/, /*Результат запроса из второго пункта*/, /*UID незамещенной схемы OrderProductPageV2 из таблицы SysSchema*/, /*DF58589E-26A6-44D1-B8D4-EDF1734D02B4*/, /*4E1670DC-10DB-4217-929A-669F906E5D75*/)

Также необходимо заполнить значения полей:

Caption, Image16, Image20, ModuleHeader, Image32d, LogoId

 

4) Добавьте раздел в нужное рабочее место

В результате очистки кеша, Redis и перезахода в систему раздел будет в нужном рабочем месте, но без кнопки "Добавить".

 

5) Скрипт добавит кнопку:

update SysModuleEdit
set ActionKindCaption = 'Добавить продукт к заказу'
where SysModuleEntityId = (select SysModuleEntity.Id from SysModuleEntity
join SysSchema
on SysSchema.UId = SysModuleEntity.SysEntitySchemaUId
where SysSchema.Name = 'OrderProduct')

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

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

Add comment

Одеяненко Юлия,

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

Иван, проверила сама данную инструкцию - она работает, после выполнения всех действий раздел появляется в списке разделов для добавления в рабочее место, после добавления открывается. Также, если у Вас версия 7.11+, рекомендуем после выполнения всех действий сгенерировать исходный код и скомпилировать конфигурацию (связано с появлением статического контента в новых версиях). Также рекомендуем установить у созданной в п.1 схемы в качестве родителя BaseSectionV2

Одеяненко Юлия,

Спасибо, Юлия! Новый раздел действительно появился в списке добавления в рабочее место, в прошлый раз я этого не заметил (к своему стыду).

После добавления он долго не появлялся в основном меню и подвисал при сохранении с надписью "регистрация раздела", но в конечном итоге после перекомпиляций и сбросов редиса появился, но зависал при попытке его открыть. Отладчик показал, что сбой в загрузке происходит в схеме ProfileUtilities в методе getDefaultGridSettings() на строке:

var columnName = config.primaryDisplayColumn.name;

config.primaryDisplayColumn приходил undefined, в итоге я остановил выполнение в этом месте и в консоли вручную задал его значение:

config.primaryDisplayColumn = {

  name: "Name" //Подставил имя столбца из моего объекта

};

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

Еще раз спасибо!

Одеяненко Юлия,

Юлия, к сожалению, я столкнулся с новой проблемой:

в добавленном разделе нельзя настроить фильтры. Я добавил объект ***Folder, и унаследовал его от базовой группы. Теперь фильтрацию можно сохранить, но элемент меню "показать группы" отсутствует, они видны только после добавления новой группы, и работают не так, как хотелось бы.

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

Небеддаг Иван Владимирович,

для того, чтоб можно было настраивать группы в новом разделе, необходимо создать 2 новых объекта с названиями в БД, которые формируются определенным образом:

1) *название объекта раздела*Folder (например, ContactFolder), родитель - "Базовая группа ( Base )" (BaseFolder);

2) *название объекта раздела*InFolder (например, ContactInFolder), родитель - "Базовый элемент в группе ( Base )" (BaseItemInFolder).

Параметры объектов указывайте аналогичные тем, которые установлены у объектов группы для базовых разделов, например, у тех же ContactFolder и ContactInFolder. Также в объекте *...*InFolder необходимо указать у колонки "Folder" справочник - объект *...*Folder из п.1, а также создать справочную колонку, которая будет ссылаться на объект раздела. Пример - http://prntscr.com/jz06kf.

Примечание. Если Вы регистрируете раздел на основании объекта, в названии которого отсутствует префикс (например, Usr), то у объектов в п.1 и 2 тоже префикса не должно быть. Можно временно отключить необходимость префикса в системной настройке SchemaNamePrefix. 

Иван Небеддаг пишет:

config.primaryDisplayColumn приходил undefined, в итоге я остановил выполнение в этом месте и в консоли вручную задал его значение:config.primaryDisplayColumn = {   name: "Name" //Подставил имя столбца из моего объекта };

Подскажите пожалуйста где именно в консоли вы задали значение? И что за "имя столбца объекта" подставили?

Идрисов Артур Ильдарович,

Имя столбца объекта можете подставить любое, лишь бы оно в Вашем объекте было. Можете использовать "Id", не ошибетесь. 

А на первый вопрос даже не знаю, что ответить. Вы просто ставите точку останова перед строкой, где происходит ошибка, переходите во вкладку консоль и пишете config.primaryDisplayColumn = {   name: "Id" }, после чего продолжаете выполнение кода.

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

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

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

Нравится

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

Иван, если я Вас правильно понял, Вы имеете в виду детль Сеансы .

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

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

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

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

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

Здравствуйте, Алексей!

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

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

Имеется колонка в объекте, которая содержит html-код, которая заполняется аналогично полю "Примечания" через html-редактор. В дальнейшем содержимое данной колонки должно быть отображено в печатной форме word. Но при создании документа в него попадает просто html код без каких-либо преобразований. Возможно, я что-то упустил? Есть ли возможность отобразить его как отформатированный текст?

Нравится

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

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

К сожалению, на данный момент такой возможности нет. Поля с html-форматированием (например, Примечания) в базе данных хранятся в виде текста с html-элементами форматирования, и при добавлении их в печатную форму выводят в выгруженной форме текст вместе с html-элементами. Мы зафиксировали Ваше пожелание, аналитики продукта рассмотрят возможность реализации данной функциональности в последующих релизах.

С помощью разработчиков надо использовать парсер, например, в сторону Html Agility Pack

Добрый день! Подскажите, пожалуйста, изменилась ли ситуация по данной проблеме в текущих релизах?

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



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



С уважением, Елена.

Elena Sidko,

Спасибо за информацию

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