API
javascript
действие
раздел
Технические вопросы
7.x

Собственно, нужно получить некие данные с внешнего API, и потом нарисовать их на странице раздела. Прошу подсказки, в какую сторону смотреть и двигаться. В Академии есть пример с добавлением строки-приветствия. Однако, совсем не понятен принцип работы кода с примера. Документация по Terrasoft Javascript API так же не понятна. Прошу подсказки, куда смотреть и в какую сторону двигаться.

Нравится

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

Если сервер API предоставляет специализированные заголовки CORS то в Вашем распоряжении вся мощь JavaScript в клиентской схеме, делайте запросы (н/п используя инструментарий используемой библиотеки Ext.JS AJAX), обрабатывайте ответы - устанавливайте атрибуты для заполнения полей и т.д.

Если сервер API не предоставляет специализированные заголовки CORS то в данном случае Вам придется писать код C# (Здесь я сильно не подскажу что да как, веб-сервис что-то там такое есть)
После чего можете например по websocket протоколу пробросить события с данными в клиентские карточки (как это сделать обсуждалось вот здесь)

"Севостьянов Илья Сергеевич" написал:Если сервер API не предоставляет специализированные заголовки CORS то в данном случае Вам придется писать код C#

Из js вызываете сервис. В сервисе обычные post/get запросы с помощь System.Web. Получаете ответ от сервера, делаете return, в js-коллбеке проходит ответ в json-строке. Сериализуете, обрабатываете далее как угодно

Показать все комментарии
scope
Terrasoft.controls.Datadrid
Технические вопросы
7.x

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

Возник простейший, но очень важный вопрос.

Я создал деталь (от FileDetailV2) и добавил в нее новый Grid путем объявления в diff. Эта часть сработала корректно. Новый грид называется Datagrid1.

Теперь хочу добавить в этот грид индикаторы сортировки. Но не понял, как мне попасть в скоп моего нового грида и оттуда вызвать этот метод addSortColumnIndicator? Отсюда два вопроса, как корректно вызвать этот метод и как его переопределить(например) для данного грида?

Нравится

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

1) Можно заглянуть в метод sortColumn. Вот описание сортировки в типичном гриде:

"sortColumn": {"bindTo": "sortColumn"},
"sortColumnDirection": {"bindTo": "GridSortDirection"},
"sortColumnIndex": {"bindTo": "SortColumnIndex"},

"Шумков Виталий" написал:переопределить(например) для данного грида?

2) Если метод из GridUtils, то можно прям в схеме детали переопределять метод (скопировать код и изменить или callParent-ом вызвать родителя)

"sortColumn": {"bindTo": "sortColumn"},
"sortColumnDirection": {"bindTo": "GridSortDirection"},
"sortColumnIndex": {"bindTo": "SortColumnIndex"},

Насколько я понимаю, это свойства, а мне нежно вызвать метод.
Метод принадлежит самому гриду
https://academy.terrasoft.ru/jscoresdk/#!/api/Terrasoft.controls.Grid

Как создать грид с уже имеющимися сортировочными колонками тоже неясно.

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

...
sortColumnIndex: {
changeEvent: "sortColumn",
changeMethod: "setSortColumnIndex"
},
...

Следовательно если вы привяжите как указано выше:
"sortColumnIndex": {"bindTo": "SortColumnIndex"},

то установке и изменении этого самого атрибута SortColumnIndex вызовется метод базового грида
setSortColumnIndex а он вызовет метод updateSortColumn а он в свою очередь вызовет addSortColumnIndicator вот ответ на ваш первый вопрос, как вызвать этот addSortColumnIndicator,

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

Спасибо, за ответ!

много чего попробовал, но ничего не подходит.

Сейчас код детали такой
new_3.txt

При изменении SortColumnIndex ничего не происходит. Может в коде что-то не так.

Также заметил, что при инициализации грида вызывается из GridUtilitiesV2 метод

initSortActionItems: function() {
				var collection = this.Ext.create("Terrasoft.BaseViewModelCollection");
				var gridColumns = this.mixins.GridUtilities.getProfileColumns.call(this);
				this.Terrasoft.each(gridColumns, function(column, columnName) {
					collection.addItem(this.getButtonMenuItem({
						Caption: {bindTo: this.name + columnName + "_SortedColumnCaption"},
						Tag: columnName,
						Click: {bindTo: "sortGrid"}
					}));
				}, this);
				this.set("SortColumns", collection);
				this.updateSortColumnsCaptions(this.get("Profile"));
			},

this.updateSortColumnsCaptions(this.get("Profile"));

но this.get("Profile") возвращает пустой DataGrid. Может в этом загвоздка? Как думаете?

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

Пробовал =)

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

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

Не раз уже сталкивался с такой ошибкой http://prntscr.com/flgkb0, может кто-нибудь пояснить куда смотреть и в чем разбираться, когда возникает такая проблема?

Нравится

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

Добрый день, Михаил!

Как следует из названия, ошибка связана с тем, что Вы повторно пытаетесь добавить элемент, который уже есть, допустим, на странице. Такое чаще всего происходит после копирования участков кода, из-за чего он дублируется в нескольких местах. Самый верный способ найти ошибку - поискать данный ключ в консоли через Ctrl+Shift+F(речь о Chrome).

Спасибо, попробуем.

Показать все комментарии
cron
trigger
Технические вопросы
7.x

Добрый день! Нужен триггер, который запускается 1 раз в неделю по вс в 1:00:00. Создан процесс, первым элементом котрого идет элемент скрипт, в котором следующее:

IJobDetail job = AppScheduler.CreateProcessJob("MoveDemoActivitiesJob", "TestCronGroup", "MoveDemoActivitiesProcess",
    "CurrentWorkspace", "CurrentUserName");
ICronTrigger trigger = new CronTriggerImpl("MoveDemoActivitiesTrigger", "TestCronGroup", "0 0 1 ? * SUN *");
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

далее идет обычный процесс с нужной логикой. Результат:

1. В таблице QRTZ_CRON_TRIGGERS он есть
2. В таблице QRTZ_JOB_DETAILS он есть
3. В таблице QRTZ_TRIGGERS он есть

Регулярное выражение делали на http://www.cronmaker.com
вот оно: 0 0 1 ? * SUN *

Вот только ничего не работает. Почему?

Нравится

3 комментария
string schedulerJobGroupName = "CheckOtkJob";
string jobProcessName = "CheckOtkProcess";
string schedulerJobName = "CheckOtkProcessGroup";
 
DateTime startDate = currentDateTime;
startDate = startDate.AddDays(-currentDateTime.Day + MonthDay);
if(currentDateTime.Day > MonthDay)
    startDate = startDate.AddMonths(1);
 
int startOffset = 60;
currentDateTime = startDate; 
 
AppScheduler.RemoveJob(schedulerJobName, schedulerJobGroupName);
var job = AppScheduler.CreateProcessJob(schedulerJobName, schedulerJobGroupName, jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
var trigger = new SimpleTriggerImpl(schedulerJobName + "Trigger", schedulerJobGroupName, startDate.AddSeconds(startOffset));
AppScheduler.Instance.ScheduleJob(job, trigger);
return true;

Я добавляю в расписание свой БП вот таким образом. Только естественно вам нужно расчёт времени организовать согласно вашей логике.
Необходимые библиотеки:
Quartz.Impl
Quartz
Quartz.Impl.Triggers
Terrasoft.Core.Scheduler

Приветствую! Не то :( у вас там SimpleTriggerImpl. Интересно же именно с CronTriggerImpl. Хотя можно и так...

Добавьте следующие строчки кода перед строкой AppScheduler.Instance.ScheduleJob(job, trigger); :

trigger.TimeZone = TimeZoneInfo.Utc;
trigger.MisfireInstruction = MisfireInstruction.CronTrigger.FireOnceNow;

Удалите старый триггер из таблиц, после чего запустите повторное создание триггера.

P.S.
   Возможно кому-то пригодится статья.

Показать все комментарии
voip vpbx runtel
Технические вопросы
7.x

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

1. CDR

  • Как задать результат звонка(отвечен/упущен/занято и тд)? Какой аттрибут коллекции для этого использовать
  • Как добавить это аттрибут на форму в истории(если это необходимо?)?
  • В каком объекте фиксировать пропущенные от неизвестных контрагентов? Если это Лид, то какой статус предпочтительнее?

2. Файл с записью разговора.

  • Какие типы файлов может проиграть встроенные плеер?
  • Возможно ли указать ссылку на файл?

Нравится

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

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

Касательно заданных вопросов.

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

2. Касательно плеера, он точно поддерживет MP3 и WAV. Работает обычно именно получая ссылку на сервер с АТС, с которого и берет запись. Примеры можно посмотреть в схемах интеграции с Webitel или Oktell.

Добрый день, Илья.
По статусу звонка - понятно.
Что делать со звоноком с неизвестного номера?

По второму вопросу - нужен пример, тк отправка cdr осуществляется бекендом АТС.

Коллеги, есть примеры?
или хотя бы куда вставлять)

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

Посмотреть пример выбора плеера с параметрами, если не ошибаюсь, можно в CallSectionGridRowViewModel пакета CTIBase.

Илья, подскажите плз.
Плеер по идеи должен парсить звонки по integrationId (фактичческо id звонка) и показывать для них "проиграть" и скачать.
Не могу понять почему не появляются.
Возможно из за ограничения лицензии?

Спасибо

Показать все комментарии
Технические вопросы
7.x

Всем доброго времени суток.
Версия 7.10.

Возможно ли реализовать перенаправление на страницу без перезагрузки? Также, как в системе работают ссылки. Допустим, известно, что это страница контакта и известен id.

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

Нравится

2 комментария
Компиляция
Технические вопросы
7.x

Подскажите, как можно произвести отладку js-кода? Насколько я знаю, в системе это не реализовано? Может есть возможность хотя бы "грабли прикрутить"?
Народ, поделитесь опытом...

Нравится

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

Попробуйте в консоли браузера.

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

Отладить Javascript можно в консоли браузера, отдельных инструментов для этого в bpm`online не предусмотрено. Об отладке более подробно можно прочитать здесь:
https://developers.google.com/web/tools/chrome-devtools/console/
И здесь:
https://academy.terrasoft.ua/documents/technic-sdk/7-10/otladka-klients…

Показать все комментарии
модальное окно
Технические вопросы
7.x

Всем привет!

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

Нравится

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

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

Лучше не в BaseSection а BaseLookupPageV2 т.к. она и с гридом, и в модальном окне.

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

Мы воспользовались примером из BaseLookupPageV2, там используется контрол "itemType": Terrasoft.ViewItemType.GRID. В итоге мы получаем ошибку "Ошибка entitySchemaName of undefined". Если мы убираем этот контрол из схемы модального окна, то ошибка пропадает.
Возможно не совсем корректно описал проблему - мы хотим выводить в Грид не данные какого-то объекта, а произвольный набор данных, получаемый через произвольный запрос из разных объектов, возможно ли это?

Вы можете реализовать свой произвольный запрос в виде представления и указывать его, как entitySchema для этого грида

А как поступить в случае если нет возможности сфоримровать данные с помощью запроса, например если данные нужно вычислить или с провести сложное форматирование, тоесть запросом не возможно получить эти данные?

Грид умеет рабоать не только напрямую с таблицей бд. Вам стоит смотреть в сторону работы с атрибутом GridData, который отвечает за данные грида и имеет тип Terrasoft.DataValueType.COLLECTION.

Показать все комментарии
Технические вопросы
7.x

Добавил рабочее место,в него несколько разделов. Система выводит раб. место на странице "Настройка рабочих мест", но в меню его нету. Удалил рабочее место, создал новое, привязал к нему нужные разделы - ничего не изменилось, раб. место так же не выводится в меню. Буду признателен за любую помощь/подсказки!

Нравится

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

Выйти из системы, сбросить кэш (ctrl+r) и зайти снова.

"Сидоров Александр Валерьевич" написал:

Выйти из системы, сбросить кэш (ctrl+r) и зайти снова.


Чистил кешы, заходил с приватного режима браузера - не помогает

Помогает подождать часик... Наверное, что-то на сервере надо перегружать

Ну, и надо проверить, что это рабочее место доступно пользователю.

"Владимир Соколов" написал:

Помогает подождать часик... Наверное, что-то на сервере надо перегружать


Это началось вчера вечером, я тогда тоже подумал, что подождать надо, но сегодня все та же ситуация

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

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

Так же необходимо проверить настройки прав доступа к данному рабочему месту.

В случае, если данные рекомендации не привели к решению Вашей проблемы, просьба, зарегистрировать обращение с детальной информацией на службу поддержки по адресу support@terrasoft.ru

Спасибо всем за помощь, проблема была в правах доступа

Показать все комментарии
миникарточка
Технические вопросы
7.x

Добрый день!

на миникарточку были добавлены поля. 5 отображаются всегда + добавлено 8 полей, из которых отображаются одновременно только 2. то есть максимум 7 полей на форме.

первая проблема это скрытие через бизнес - правила. скрытие работает, но на форме остается "дыра", поля вставлены не через layout. Об этом я писала(https://community.terrasoft.ru/forum/topic/25552) , но результата нет, поэтому эту проблему я решила костылями - через document.getElementById("xxx").style.display = "xx"

вторая проблема: после добавления полей миникарточка стала некорректно отображаться на экранах ноутбука, а именно верхнее поле не видно. причем при открытии миникарточки скрываются ненужные поля на onEntityInitialized() . то есть при открытии миникарточки всего 5 полей, тем не менее она располагается наверху экрана, как будто в ней есть все 13 полей.

если сравнивать стиль элемента через консоль, то на большом экране top=68px , а на ноутбуке = top=-8px

как решить эту проблему? есть ли лимит на количество поле в миникарточке?

Нравится

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

Лимита нет, посмотрите как реализован RequiredColumnsContainer в BaseMiniPage, в него же как то добавляются колонки в зависимости от того какие из них обязательны, в любом количестве.

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