Собственно, нужно получить некие данные с внешнего 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-строке. Сериализуете, обрабатываете далее как угодно

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

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

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

Я создал деталь (от 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).

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

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

Добрый день! Нужен триггер, который запускается 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.
   Возможно кому-то пригодится статья.

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

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

1. CDR

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

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

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

Нравится

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

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

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

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

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

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

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

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

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

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

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

Спасибо

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

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

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

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

Нравится

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

Подскажите, как можно произвести отладку 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…

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

Всем привет!

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

Нравится

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

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

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

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

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

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

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

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

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

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

Нравится

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

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

Добрый день!

на миникарточку были добавлены поля. 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, в него же как то добавляются колонки в зависимости от того какие из них обязательны, в любом количестве.

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