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

Появилась необходимость реализовать отдельную сортировку по умолчанию в Grid'е детали.

Итак немного отсылки о детали. Деталь содержит в себе записи относящиеся к справочной колонке "Объект администрирования". Грубо говоря есть 4ре отдела и есть неограниченное количество пользователей, которые так или иначе входят в эти отделы (отдел - организационный юнит).

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

После этого происходит стандартное добавление выбранных записей в деталь.

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

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

Так же что-то удалось найти в diff на BaseGridDetail который соответствует сортировке, но как-то это тоже ни к чему не привело.

Есть мысль что при загрузке коллекции в методе onGridDataLoaded получать коллекцию и при помощи underscore.js сортировать её как угодно, но вроде как это накладно и производительней было бы получить уже отсортированную коллекцию.

У кого какие предложения/идеи будут по данному посту?

Нравится

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

Добрый день. Не очень понял, а почему "я уперся в GridUtilites и решил дальше не лезть"? Можно же функцию из миксина переопределить в схеме самой детали, сославшись на родительскую, если нужно, через this.mixins.GridUtilitiesV2.... . На вскидку, вроде надо "допилить" initQuerySorting ???

типа такого:

 

initQuerySorting: function(esq) {

    this.mixins.GridUtilitiesV2.initQuerySorting(esq);

    /* далее какие-то ваши действия с esq */

}

 

Или наоборот, сначала - ваша сортировка, потом - родительский метод.

Иванов Александр А.,

Да, спасибо. Мы уже разрешили проблему. Если интересно могу поделиться кодом.

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

initQuerySorting: function(esq) {
	var createdOnColumn = esq.addColumn("KmName", "Name");
	createdOnColumn.orderDirection = this.Terrasoft.OrderDirection.ASC;
}

Всё свелось к тому что такой путь посоветовала Тех. поддержка. А у меня там уже простынка такая строчек на 100 была как коллекцию грида сортироватьlaugh

Кисловский Михаил Андреевич,

Ну да, только тут остальная сортировка "идёт лесом". Поддержка, как всегда, короче... smiley

Иванов Александр А.,

Ну с остальной сортировкой да. Но в целом можно выкрутиться думаю если захотеть) 

Я, наверное, тогда промолчу про 

getGridDataColumns: function() {
	return {
		"Id": {path: "Id"},
		"TmName": {path: "TmName"},
		"TmStartDate": {path: "TmStartDate", orderPosition: 0, orderDirection: Terrasoft.OrderDirection.DESC},
		"TmStudios": {path: "TmStudios", orderPosition: 1, orderDirection: Terrasoft.OrderDirection.DESC}
	};
},

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

Варфоломеев Данила,

спасибо, что не промолчал ;)

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

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

Программно вызываю открытие модального окна(Контрагенты).

Задача: по клику на элемент, вернуть данные(Например "название" или "ID") в вызывающий код.

Вот мой код:

 

//Выводим модальное окно
viewModal:function(){
var config = {
                    entitySchemaName: "Account",
                     multiSelect: false,
                     columns: ["Name","UsrINN"],
                     hideActions: false,//Скрываем кнопку "Добавить"
                     filters: contactFiler
                    };
               this.openLookup(config, this.myCallBack, this);
},

//Колбэк
 myCallBack:function(args){
                
                 args.???????????????????????????????(Что должно быть здесь?)
                 this.showInformationDialog("Callback");
  }

 

Нравится

2 комментария
myCallBack:function(args){
   debugger;
   //args.???????????????????????????????(Что должно быть здесь?)
   this.showInformationDialog("Callback");
}

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

По теме: в args вроде как хранится коллекция selectedRows, её уже перебирать через terrasoft.each

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

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

7.11(OnSite)

Задача вывести, значение агригирующей функции COUNT.(Т.е тупо - кол-во записей из таблицы) по правильному

Щас делаю по топорному(count++ при переборе коллекции):

 var esq = this.Ext.create(Terrasoft.EntitySchemaQuery, {rootSchemaName: "Lead" });
				  
                  esq.addColumn("Id");
                  esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "ID", Terrasoft.AggregationEvalType.ALL);
                  var esqFirstFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrINN", INN);
                  esq.filters.add("esqFirstFilter", esqFirstFilter);
                  
                  // this.showInformationDialog("message");
                     esq.getEntityCollection(function (result) {
                     	     window.console.log("Ответ сервера: "+result);
                     	  	 window.console.log(result);
                            if (!result.success) {
                              // обработка/логирование ошибки, например
                               this.showInformationDialog("Ошибка запроса данных");
                              
                               return;
                            }
                     
                             var count = 0;
                             result.collection.each(function (item) {
                               count++;
                             });
                               this.showInformationDialog(count);
                     }, this);

 

Также работает вот такой способ:

 this.showInformationDialog(result.collection.collection.length);

 

Нравится

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

либо

esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "CountAll");

и никакие столбцы больше не добавлять.

Вернётся 1 запись, result.collection.collection.items[0].get("CountAll")



либо

result.collection.getCount() в вашем варианте

Спасибо

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

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

И это делается только запросом к БД?

Нравится

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

7.11(OnSite)

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

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

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

Пример:

Справочник{значение:Квалификация}

Кейс {значение:Квалификация}

Т.е не важно, где произошел клик, должна выполняться одна и та же функция.

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

Кейс(Клик)-->Справочник-->Атрибут-->Дествие

Справочник(Клик)-->Атрибут-->Действие

Вот мой код:

    methods: {

            onSearchButtonClick :function(){

                this.showInformationDialog("Click");

            },

            setDisqualification:function(){

                view = "UsrStage";//Справочник стадий

                data = this.get(view)

                

                if(data!==undefined){

                 value = data.Name;

                  switch (value) {

                        case 'Квалификация':

                             this.showInformationDialog(value);

                            break;

                        case 'Переговоры':

                             this.showInformationDialog(value);

                            break;

                        case 'Взращивание':

                            this.showInformationDialog(value);

                            break;

                         case 'Продажа':

                            this.showInformationDialog(value);

                           break;

                        case 'Потребность отсутствует':

                            this.showInformationDialog(value);

                           break;

                        case 'Потребность удовлетворена':

                            this.showInformationDialog(value);

                           break;

                        case 'Дисквалифицирован':

                          this.showInformationDialog(value);

                             break;

                    default:

                        // code

                    }

                }

            }

        },

        rules: {},

        businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,

        attributes: {

                   "LinkForStage": {

                    // Определение зависимости колонки.

                     "dependencies": [

                                       {

                                         // Зависит от колонки Stage.

                                        "columns": [ "UsrStage" ],

                                         // Имя метода-обработчика изменения колонки Stage.

                                         // Метод setProbabilityByStage() определен в свойстве methods

                                         // объекта схемы.

                                        "methodName": "setDisqualification"

                                       }

                                     ]

                                 }

        }

    };

 

Нравится

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

Роман, добрый день!

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

С уважением,

Дмитрий Тёскин

У меня задача обработать нажатие на элемент кейса через код.

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

Вот я и пытаюсь узнать есть ли такая возможность? 

SectionActionsDashboard, метод onActiveStageClick

Варфоломеев Данила,

Спасибо идею понял)

Только получается дублирование кода(

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

При попытке выбрать активности по Ответственному используя Http-запрос выбрасывает ошибку.

Делаю запрос:

https://dev-goldcoachcrm.bpmonline.com/0/ServiceModel/EntityDataService…'

 

и получаю в браузере ошибку: http://prntscr.com/h9v8l8

"Элемент коллекции с именем OwnerId не найден" - Но такое поле есть в Активности.

В чем проблема тогда? 

Нравится

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

Добрый день, без данных самого запроса сложно определить причину ошибки. Рекомендую вам ознакомиться с документацией по ссылке https://academy.terrasoft.ru/documents/technic-sdk/7-7-0/rabota-s-obekt…

В документации есть примеры выборки записей по ответственному.

Показать все комментарии
Добавить действие
Деталь
7.10
studio

У меня не получается добавить действие НА ДЕТАЛЬ. Инструкций как это делается я не нашел. Попробовал переопределить метод addToolsButtonMenuItems, но это не помогло(возможно я что-то делаю не так?). Способ решения проблемы описанный в теме https://community.terrasoft.ru/questions/dobavlenie-novoi-detali-bpm-73 не работает.

addToolsButtonMenuItems: function() {

                this.callParent(arguments);

                var tbm = this.get("ToolsButtonMenu"); 

                tbm.addItem(this.getButtonMenuSeparator());

                tbm.addItem(this.getButtonMenuItem({                    

                    "caption": "Approve",

                    "tag": "approveAction",

                    //Click: {"bindTo": "test"},

                    "visible": "true"

                }));

            }

Хотелось бы узнать, как добавлять действие НА ДЕТАЛЬ

Нравится

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

Добрый день. Тут два момента: 1) этот метод имеет сигнатуру addToolsButtonMenuItems: function(toolsButtonMenu) 2) вы get сделали, а вот set обратно - нет. В итоге локально в методе объект изменен, но на детали ничего не видно. Если указанные места поправить - все работает.

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

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

Здравствуйте. Есть тестовая разработка. Как выяснилось потом, в тестовой разработке есть портал самообслуживания, он был настроен кем-то, хотя я лично сам туда не лез, чтобы что-то настраивать. Проблема в следующем (ниже привёл скриншот). Как сделать так, чтобы я мог спокойно зайти в конфигурацию системы под Supervisor? Раньше я мог туда заходить спокойно и делать какие-то разработки (мог заходить именно НЕ НА портал самообслуживания, а в то место системы, где есть базовые разделы BPM'Online)? И как выйти из режима перехода на портал самообслуживания при авторизации пользователя?

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

Нравится

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

У пользователя Supervisor скорее всего указан тип пользователя = Пользователь портала.

Проверить можно запросом select * from Sysadminunit where name = 'Supervisor'

см. ConnectionType, где 0 - сотрудник компании, 1 - пользователь портала.

Если указано значение 1, то нужно выполнить апдейт.

 

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

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

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

Нравится

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

Здравствуйте, Денис!

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

Необходимо в схеме детали в секции diff написать:

diff

diff: /**SCHEMA_DIFF*/[
{
   "operation": "merge",
   "name": "Detail",
   "values": {
      "caption": {"bindTo": "getDetailCaption"}
   }
}
]/**SCHEMA_DIFF*/

А в методе уже анализировать имя карточки, в которую загружена деталь, и менять caption на необходимый, к примеру, так:

methods

getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "ActivityPageV2") {
      return "Name 1";
   }
   return "Name 2";
}

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

В типовых конфигурациях, аналогичный пример есть в схеме «OpportunityContactDetailV2»

OpportunityContactDetailV2

/**
 * Устанавливает заголовок детали в зависимости от открытой страницы.
 * @protected
 * @return {String}
 */
getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "OpportunityPageV2") {
      return this.get("Resources.Strings.InOpportunityCaption");
   }
   return this.get("Resources.Strings.InContactCaption");
},

Юлия, спасибо.

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

Всем привет, есть ли возможность скрыть контейнер элементов.

Сейчас приходится удалять каждую кнопку по отдельность

Если есть то подскажите как

Нравится

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