Вот как в функции вернуть не undefined ? :)

proc: function(Id)

{

  return getCallCountForButtonCaption(Id);

Вот как сделать чтобы возвращать не undefined, а результат асинхронного вызова который

аяксом вернется из getCallCountForButtonCaption т. е. синхронизировать асинхронный вызов

}

            getCallCountForButtonCaption: function (candId) {

                this.logStep('getCallCountForButtonCaption started...');

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

                

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

                    rootSchemaName: "AACandCall"

                });

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

                esq.addColumn("CallCount");

                esq.filters.add("filterByIdCand",

                    esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,

                        "IdCand", candId));

                esq.getEntityCollection(function (response) {

                       this.logStep('ForButtonCaption callCount request has started!');

                    if (response.success) {

                        this.logStep('ForButtonCaption callCount response.success is true');

                        if (response.collection.getCount() > 0) {

                            var firstItem = response.collection.getByIndex(0);

                            var callCount = firstItem.values.CallCount;

                            //this.setButtonCaption(callCount);

                            return callCount;

                        }

                        else {

                            this.logStep('ForButtonCaption response.collection.getCount() is ZERO');

                            return -1;

                        }

                        return -1;

                    }

                    else {

                        this.logStep('ForButtonCaption callCount response.success is false');

                        return -1;

                    }

                }, this);

                this.logStep('getCallCount finished...');

            },

 

Нравится

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

Добрый день

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

Пример:

diff: [
   {
    ... 
    "caption": {"bindTo": "MyAttribute"}
    ...
   }]
...
methods: {
   someFunction: function() {
       var callback = function(value) {
          this.set("MyAttribute", value);
       }.bind(this);
       this.callAsync(callback);
   }
}

 

Артем Гура,

Спасибо! Смотрится интересно, буду пробовать. Мне интересно как делать в платформе подряд два асинхронных вызова, когда вызов второго зависит от ответа первого. Конкретная задача: юзар нажимает кнопку "позвонить", запросом проверяем в бд первый звонок если да то делаем вызов инсерт иначе апдейт - это уже сделано, но как далее в методе клик кнопки еще и каптион ее поменять с "позвонить" на "позвонить (1, 2, 3)" Вроде ваш ответ поможет, спасибо. Какая практика по подобным сценариям, ща осваиваю фронтэнд, в основном на c# писал и куча приколов...

Артем Гура,

Попробую спросить в более точной форме. 

Дано:

        attributes: {

            "IsButtonVisible": {

                "dataValueType": Terrasoft.DataValueType.BOOLEAN,

                "value": false

            },

            "ButtonCaption": {

                "dataValueType": Terrasoft.DataValueType.TEXT,

                "value": "Позвонить"            

            }

        },

        diff: [{

            "operation": "insert",

            "name": "bnBackCall",

            "parentName": "DataGrid",

            "propertyName": "activeRowActions",

            "index": 111,

            "values": {

                "className": "Terrasoft.Button",

                "style": Terrasoft.controls.ButtonEnums.style.GREY,

                "caption": { "bindTo": "ButtonCaption" },

                "tag": "tagBnBackCall"

            }

        },

Где мне нужно менять каптион кнопки моей, по логике в 

rowSelected: function(Id) 

            {

                //this.setButtonCaption(Id);

                this.set("ButtonCaption", "КАПТИОН");

            },

Но так не работает, при этом мне нужно устанавливать каптион в зависимости от значения прочитанного с БД (это умею), но эта функция чтения асинхронная, как это нормально сделать???

QArt,

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

Demchenko Olha,

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

QArt,

Почитайте документацию 

https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-knop…, там и примеры есть реализации. Попробуйте сделать как там, просто вывести кнопку с caption через привязку к локализируемой строке схемы, не делая значение изменяемым. А когда уже получится стандартную кнопку вывести, тогда и пробуйте экспериментировать.

Demchenko Olha,

Хорошо, спасибо :) Все-таки, кнопка выводится - ок, ее каптион биндится к атрибуту, меняя атрибут сам каптион не меняется. 

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

Приветы,

Учусь, читал всякое, например, https://academy.terrasoft.ru/documents/technic-sdk/7-8/rabota-s-filtram… не разобрался, подскажите плиз???

 

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

т. е. нужен Exists, Insert, Update

Как сделать запрос:

select CallCount from 

AACandCall a,

SxCandidate c

where

a.IdCand = c.Id

Нравится

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

Добрый день

Ну во-первых следует избегать декартовых произведений (* from a, b)

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

Далее, на community есть много статей, к примеру https://community.terrasoft.ru/articles/opisanie-osnovnyh-metodov-entityschemaquery-cast-1

Поищите на community по тексту EntitySchemaQuery

 

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

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

Нужно поменять цвет ссылок в задачах, в схеме "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;
}

 

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

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

Приветы,

 

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

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. Вот мой уровень развития на фронтенде только так позволяет это сделать, а как это по нормальному делать не знаю :)

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

Добрый день!

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

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

 

Нравится

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

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

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

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

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

Добрый день!

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

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

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

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

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

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

Доброго времени суток.

Установил bpm на Windows Server 2016.

Ввожу логин и пароль на странице авторизации. Реакции никакой. Но в консоли появляются следующие ошибки:

Failed to load resource: the server responded with a status of 404 (Not Found). В ролях сервера установил все галочки для (Веб-сервер(IIS) - Веб-сервер, Веб-сервер(IIS) - Средства управления)

Точно такой же сайт прекрасно работает на Windows Server 2012, но на 2012 IIS 8, а на сервере 2016 IIS 10. Может для 10-й версии какие-то дополнительные настройки нужно указывать?

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

Нравится

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

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

Дополнительных настроек касаемо iis 10 - нету.

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

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

Показать все комментарии
Идея
Одобрена

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

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

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

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

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

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

Всем привет, столкнулся с проблемой

В лидах одна из колонок "Последний комментарий", это комментарий активностей в контексте карточки лида. В реесте все отображается, но -->

Расширенный фильтр:

Последний комментарий = заполненно

Не работает, выдает что ничего не найдено

Нравится

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

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

Могли бы Вы, пожалуйста, прислать скриншот построения данного фильтра?

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

Добрый день!

В системе мы фиксируем состояние склада. В данный момент мы можем увидеть только актуальное состояние.

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

 

Нравится

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

Можно, например загрузить с маркетплейс дополнение которое позволит журналировать разеделы.

Таким образом вы сможете видеть, кто когда что изменил. Ну например на складе остаток по товару был 100, сегодня 80, завтра будет 60. 

И вы эту динамику сможете посмотреть в отдельной детали в разделе.

 

Ну или если вас не устраивает дополнение, можно создать деталь с полями.

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

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

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

Добрый день!

На портале самообслуживания PortalMainPageModule создаем виджет Список DashboardGrid (он же блок итогов Список, он же реестр в итогах) и в него выводим, например контрагентов.

Если страницу смотреть пользователем с ролями "Все сотрудники компании"+"Системные администраторы", то в колонке Название будет ссылка, по которой можно перейти на страницу редактирования контрагента.

Если же заходить с ролью "Все пользователи портала", в колонке span, перейти никуда нельзя.

Есть ли такая возможность для пользователей с ролью "Все пользователи портала" сделать переход в страницы редактирования объектов, указанных в качестве источника данных для виджета типа список?

Нравится

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

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

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

С уважением, Антон.

Антон Малий,

Антон, доступ есть.

Регулируется раздачей прав на объекты и двумя справочниками:

  1. Список объектов, доступных пользователям портала
  2. Список полей объектов на портале

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

Выход есть, даже два:

  1. инструкция Установка+разделов+на+портале.doc, она упоминается в одном из топиков на этом сайте, например, мне ее выполнение показалось через чур трудоемкой операцией, я провел исследования и выяснил способ  2, гораздо проще.
  2. замещаем модуль DashboardListedGridViewModel, копируем из родителя весь код, метод addColumnLink модернизируем:
addColumnLink: function(item, column) {
	//return this.mixins.GridUtilities.addColumnLink.apply(this, arguments);
	this.mixins.GridUtilities.addColumnLink.apply(this, arguments);
	var isSSPUser = this.Terrasoft.CurrentUser.userType === this.Terrasoft.UserType.SSP;
	var entitySchemaName = this.getGridEntitySchemaName();
	var columnPath = column.columnPath;
	if (isSSPUser && entitySchemaName === "Наш_Раздел" && columnPath === "Наша_Колонка") {
		var scope = this;
		var onColumnLinkClickName = "on" + columnPath + "LinkClick";
		item[onColumnLinkClickName] = function() {
			var recordId = item.get("Id");
			if (!recordId) {
				return "";
			}
			var displayValue = item.get("Наша_Колонка");
			if (scope.Ext.isEmpty(displayValue)) {
				return "";
			}
 
			var editPageName = entitySchemaName + "Page";
			var url = Terrasoft.workspaceBaseUrl +
				"/Nui/ViewModule.aspx#CardModuleV2/" + editPageName + "/edit/" + recordId;
			return {
				caption: displayValue,
				target: "_self",
				title: displayValue,
				url: url
			};
		};
	}
},

 

Отдельное спасибо Варфоломеев Данила за идею!

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