Вопрос

Добрый день.

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

Подскажите где генерируются данные кнопки?

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

У меня такой же вопрос

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

Все намного проще, обычно определяется (меняется в diff)

{
        "operation": "merge",
        "name": "DataGrid",
        "values": {
                "activeRowAction": {"bindTo": "onActiveRowAction"},
                "activeRowActions": [
                        {
                                "className": "Terrasoft.Button",
                                "style":this.Terrasoft.controls.ButtonEnums.style.BLUE,
                                "markerValue": "myButtonAction",
                                "tag": "myAction",
                                "caption": "MyButton"
                        }
                ]
        }
}

Подробнее тут

Григорий Чех пишет:

Григорий Чех у меня нет цели засорять код дифтами.

У меня будет 100 секций в которой будет такая же задача и я буду в каждой дифт делать? 

Мне проще заместить схему и внести свою логику.

Казанцев, 

см в ConfigurationGrid метод renderRowActions

Но его нет при генерации секции

Этот метод перебирает значения из массива activeRowActions:

  renderRowActions: function(renderTo, id) {
   var rowActions = Ext.clone(this.activeRowActions);
   var self = this;
   var isGridEnabled = this.model.get("IsEnabled");
 
   function actionHandler() {
    self.onActionItemClick(this.tag, id);
   }
 
   for (var i = 0, c = rowActions.length; i < c; i += 1) {
    var action = rowActions[i];
    if (isGridEnabled === false && action.tag !== "card") {
     continue;
    }
    action = Ext.apply({}, action, {
     renderTo: renderTo,
     handler: actionHandler,
     classes: {
      wrapperClass: ["configuration-grid-action-button"]
     }
    });
    var actionItem = Ext.create(action.className, action);
    var selectedViewModel = this.getActiveRowViewModel(id);
    actionItem.bind(selectedViewModel);
    actionItem.setEnabled(this.enabled);
    this.actionItems.push(actionItem);
   }
  },

Соответственно, в схемах с дополнительными кнопками в него добавляются элементы. Например, в схеме ContactOpenCasesDetail:

{
	"operation": "merge",
	"name": "DataGrid",
	"values": {
		"activeRowAction": {"bindTo": "onActiveRowAction"},
		"activeRowActions": []
	}
},
{
	"operation": "insert",
	"name": "OpenRecordButton",
	"parentName": "DataGrid",
	"propertyName": "activeRowActions",
	"values": {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.BLUE,
		//TODO localizablestring
		"caption": "Open",//{ "bindTo": "Resources.Strings.OpenButtonCaption"},
		"tag": "open"
	}
},
{
	"operation": "insert",
	"name": "MergeRecordButton",
	"parentName": "DataGrid",
	"propertyName": "activeRowActions",
	"values": {
		"className": "Terrasoft.Button",
		"style": Terrasoft.controls.ButtonEnums.style.GREY,
		//TODO localizablestring
		"caption": "Merge doubles",//{ "bindTo": "Resources.Strings.MergeCaption"},
		"tag": "merge"
	}
}

 

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

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

 

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

Подскажите, пожалуйста, где это делается

У меня такой же вопрос

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

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

Спасибо. Кажется раньше этой вкладки не было? Еще в процессе разработки нашими кастомизаторами со страницы Обращения была убрана страница "Обработка", нет детали, где заказчик и обработчик заявки общаются. Точнее у заказчика она есть:

 

А у обработчика ее нет. Как можно ее вернуть?

Разверните на отдельном сервере вашу версию bpmonline и заберите оттуда все что вам нужно востановить....

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

Коллеги, добрый день. 

Подскажите, пожалуйста, как в системе реализовано 2 задачи:

 

1) Шаблоны ответов представлены на английском(почему только на нём?), как сменить язык пакетно? Почему при добавлении русской локализации шаблон не переводится или не предоставляется аналог ? 

2) Если первая функция не реализована, почему нельзя выбрать весь пул ответов и сменить локализацию(пусть и пустую)? 

У меня такой же вопрос

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

Стандартные шаблоны предоставлены на обоих языках. Нужно открыть шаблон на редактирование и сверху будет переключение в виде двух вкладок:

chapter_content_designer.png

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

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

BPMO Service Enterprise, версия 7.14.0.597

У меня такой же вопрос

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

Логика интеграции конкретных полей реализована в схеме LDAPUtilities, там есть структуры LdapUser и LdapGroup:

public struct LdapUser
{
	#region Fields: Public
 
	public string Id;
	public string Name;
	public string FullName;
	public string Company;
	public string Email;
	public string Phone;
	public string JobTitle;
	public bool IsActive;
	public string Dn;
	public DateTime ModifiedOn;
 
	#endregion
}
 
public struct LdapGroup
{
	#region Fields: Public
 
	public string Id;
	public string Name;
	public string Dn;
	public DateTime ModifiedOn;
 
	#endregion
 
	#region Constructors: Public
 
	public LdapGroup(string id, string name, string dn) {
		Id = id;
		Name = name;
		Dn = dn;
		ModifiedOn = DateTime.MinValue;
	}
 
#endregion
}

 И дальше есть методы, с ними работающие. Например:

private LdapUser CreateLdapUser(SearchResultEntry entry, string attributeDefValue) {
	LdapUser ldapUser = new LdapUser();
	ldapUser.Id = GetEntryIdentityAttribute(entry, _ldapUserIdentityAttribute);
	ldapUser.Name = GetEntryRequiredAttributeStringValue(entry, _ldapUserLoginAttribute);
	ldapUser.FullName = GetEntryAttributeStringValue(entry, _ldapUserFullNameAttribute, attributeDefValue);
	ldapUser.Company = GetEntryAttributeStringValue(entry, _ldapUserCompanyAttribute, attributeDefValue);
	ldapUser.Email = GetEntryAttributeStringValue(entry, _ldapUserEmailAttribute, attributeDefValue);
	ldapUser.Phone = GetEntryAttributeStringValue(entry, _ldapUserPhoneAttribute, attributeDefValue);
	ldapUser.JobTitle = GetEntryAttributeStringValue(entry, _ldapUserJobTitleAttribute, attributeDefValue);
	string accountControlAttributeValue =
		GetEntryAttributeStringValue(entry, LdapUserAccountControlAttributeName, string.Empty);
	ldapUser.IsActive = string.IsNullOrEmpty(accountControlAttributeValue) ||
		IsActive(accountControlAttributeValue);
	bool useLoginUserLDAPEntryDN = _userConnection.AppConnection.UseLoginUserLDAPEntryDN;
	ldapUser.Dn = useLoginUserLDAPEntryDN ? entry.DistinguishedName : attributeDefValue;
	ldapUser.ModifiedOn = GetEntryDateTimeAttributeValue(entry, _ldapEntryModifiedOnAttribute);
	return ldapUser;
}
 
private LdapGroup CreateLdapGroup(SearchResultEntry entry) {
	LdapGroup ldapGroup = new LdapGroup();
	ldapGroup.Id = GetEntryIdentityAttribute(entry, _ldapGroupIdentityAttribute);
	ldapGroup.Name = GetEntryRequiredAttributeStringValue(entry, _ldapGroupNameAttribute);
	ldapGroup.Dn = entry.DistinguishedName;
	ldapGroup.ModifiedOn = GetEntryDateTimeAttributeValue(entry, _ldapEntryModifiedOnAttribute);
	return ldapGroup;
}

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

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

Добрый день.

Есть такой запрос:

SELECT * FROM [dbo].[Case] 
INNER JOIN [dbo].[SysUserInRole] on [SysUserInRole].[SysRoleId]=[Case].[GroupId]
INNER JOIN [dbo].[SysAdminUnit] on [SysAdminUnit].[Id]=[SysUserInRole].[SysUserId]
where [SysAdminUnit].[ContactId]='01B62D91-8738-40C2-AAE5-C9E7E934EA65';

Который нужно интерпретировать на C# для построения костомного отчета в DevExpress.

И у меня никак не получается с join'ить эти таблицы.

Открываю статью: Использование присоединенных таблиц

Там пример:

esqResult.AddColumn("=Country.Name");

Пытаюсь присоединить по этому примеру таблицу SysUserInRole:

esqResult.AddColumn("=SysUserInRole.SysRoleId");

Система возвращает отчет с ошибкой.

Подскажите как присоединить эти таблицы. Они все коробочные.

У меня такой же вопрос

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

Григорий Чех пишет:

См документацию

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

 

Добрый день!
В вашем случае присоединение не работает, т.к. у Case нет колонки SysUserInRole, а используется другая колонка.
Подробнее здесь

Создайте свое представление на sql с нужными связями и потом его используйте для построения нужной выборки на C#.

Сидоров Александр В. пишет:

Добрый день!
В вашем случае присоединение не работает, т.к. у Case нет колонки SysUserInRole, а используется другая колонка.
Подробнее здесь

Добрый день.

Да я пробовал и этот метод.

esqQuery.AddColumn("[SysUserInRole:Case:GroupId].GroupId");

Пожалуйста пришлите пример одного joina таким методом буду очень признателен. 

 

Казанцев Андрей Юрьевич пишет:
Пожалуйста пришлите пример одного joina таким методом буду очень признателен

 Sql-запрос:             

declare @DistrictId uniqueidentifier
declare @WisProductId uniqueidentifier = 'de990d31-dccd-42c0-bd87-005b28db680f'
 
select @DistrictId = Id from WisDistrict where Name = N'Татарбунарский'
 
select
	P.WisRailwayDelivery,
	P.WisAutoShippingContainer,
	P.WisAutoDeliveryAwning
from WisDistrict D
    left join WisDistrict D1 on D1.WisRegionId = D.WisRegionId
        left join WisPriceInRegion P on P.WisDistrictId = D1.Id
where D.Id = @DistrictId
    and D1.WisRegionalCenter = 1
    and P.WisProductId = @WisProductId

Ниже код на JavaScript, но на С# принцип присоединения тот же:

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "WisDistrict"});
esq.addColumn("[WisDistrict:WisRegion:WisRegion].[WisPriceInRegion:WisDistrict:Id].WisRailwayDelivery",
	"WisRegionalRailwayDelivery");
esq.addColumn("[WisDistrict:WisRegion:WisRegion].[WisPriceInRegion:WisDistrict:Id].WisAutoShippingContainer",
	"WisRegionalAutoShippingContainer");
esq.addColumn("[WisDistrict:WisRegion:WisRegion].[WisPriceInRegion:WisDistrict:Id].WisAutoDeliveryAwning",
	"WisRegionalAutoDeliveryAwning");
esq.filters.add("DistrictId", esq.createColumnFilterWithParameter(
	Terrasoft.ComparisonType.EQUAL, "Id", district.value));
esq.filters.add("IsRegionalCenter", esq.createColumnFilterWithParameter(
	Terrasoft.ComparisonType.EQUAL, "[WisDistrict:WisRegion:WisRegion].WisRegionalCenter", true));
esq.filters.add("ProductId", esq.createColumnFilterWithParameter(
	Terrasoft.ComparisonType.EQUAL,
		"[WisDistrict:WisRegion:WisRegion].[WisPriceInRegion:WisDistrict:Id].WisProduct.Id",
		this.get("WisProduct").value));
esq.getEntityCollection(function(result) {

 

Казанцев Андрей Юрьевич,
esqQuery.AddColumn("[SysUserInRole:SysRole:Group].SysRole.Id");

Сидоров Александр В. пишет:

Казанцев Андрей Юрьевич,
esqQuery.AddColumn("[SysUserInRole:SysRoleId:GroupId].SysRoleId");

После такого соединения отчет перестает отрабатываться. 

Сидоров Александр В. пишет:

using System;
using System.Collections.Generic;
using System.Data; 
using Terrasoft.Common;
using Terrasoft.Core;
using Terrasoft.Core.DB;
using Terrasoft.Reports;
using Terrasoft.Core.Entities; 
 
private void ITReport1_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
	var report = (Report)sender;
	var userConnection=report.UserConnection;
	EntitySchemaQuery query = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Case");
	query.AddColumn("[SysUserInRole:SysRoleId:GroupId].SysRoleId");
	query.AddColumn("Category.Name");
	query.AddColumn("Contact.Name");
	query.AddColumn("Group.Name");
	query.AddColumn("ITService.ITName");
	query.AddColumn("ITServiceConsumer.Address");
	query.AddColumn("Number").OrderByDesc();
	query.AddColumn("Owner.Name");
	query.AddColumn("Owner.Id");
	query.AddColumn("Priority.Name");
	query.AddColumn("RegisteredOn");
	query.AddColumn("Status.Name");
	query.AddColumn("Subject");
	query.AddColumn("Symptoms");	
	System.Data.DataSet ds = report.CreateDataSet();
	ds.Tables["Case"].Load(userConnection, query);
	report.DataSource = ds;
}

 

Сидоров Александр В. пишет:

 Спасибо! Чуть подправил и сработало. 

query.AddColumn("[SysUserInRole:SysRole:Group].SysRole");

Добрый день! А чем не подходит использование класса CustomQuery или же класса Select, если уж проблемы с ESQ? Далее обрабатываем через IDataReader и заносим в DataSet.

 

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

Можно ли выгрузить из BPM'online все организационные и функциональные роли и связи между ними? Может быть, если кто-то такое уже делал, подскажите как?

У меня такой же вопрос

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

Все в таблице SysAdminUnit

Пример раскручивания тут

Больше о типах ролей, зашифрованных цифрами, есть тут.

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

Коллеги, добрый день. 

 

Имеется ли в системе какой-то инструмент, который позволит узнать имя объектов. 

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

В интерфейсе не нашёл информацию по данному меню. 

В реестре прав доступа не могу понять как называется объект. 

У меня такой же вопрос

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

Посмотреть названия элементов интерфейса можно через инспектор объектов в браузере.

Это меню реализовано в модуле LeftPanelTopMenuModule.

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

Алла Савельева, я правильно понимаю, что под модулем Вы понимаете "пакет" ? 

Sunrise challenge,

Не, пакет - это пакет, а модуль - это модуль. Модуль - это ClientUnitSchemaManager, скриншот ниже:

Алла Савельева, волей-неволей вспоминается - "стою на асфальте, в лыжи обутый...". Не нахожу его 

Sunrise challenge,

Проверьте, не включена ли фильтрация в нижней панели окна сервисов (на скриншоте выделила красным):

Алла Савельева,

Вы оказались правы. Как-то не очевидно, что он установлен. 

Метод я нашёл, но сохранить изменения он не даёт: 

"Невозможно сохранить изменения элемента "LeftPanelTopMenuModule", так как он создан сторонним издателем или установлен из файлового архива"

Sunrise challenge,

Вам нужно заместить модуль LeftPanelTopMenuModule.

Посмотрите вот этот пост - там описан общий подход к внесению изменений в модуль.

Алла Савельева,

Спасибо за подсказки. В дополнение - есть ли более простой способ скрыть данное всплывающее меню или убрать из списка "Дизайнер системы"  ? 

Sunrise challenge,

Я не нашла никакой системной настройки, с помощью которой можно было бы управлять этой функциональностью.

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

Зверев Александр,

Это не совсем правильно, ибо не нужно агентам и пользователям знать о лишнем функционале, во избежание путаницы. И поиска не регламентированных возможностей. 

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

Зверев Александр пишет:
Вообще, если бы такое настраивалось, то не в системных настройках, а в правах доступа на операции.

Это была описка - речь шла о правах доступа на операции.

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

Саша, а ты можешь это внести в список пожеланий от клиента? Я на 100% согласна, что такая настройка должна быть в базовой версии. 

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

Коллеги, добрый день. 

 

Столкнулся с проблемой удаления записей. 

Ситуация выглядит так, что не важно из какого раздела пытаюсь удалить запись, "выдаёт" ошибку: 

"Удаление данных произошло с ошибкой. Обратитесь к системному администратору" 

Подскажите, пожалуйста, в какую сторону смотреть?

P.s. права Supervisor'а 

У меня такой же вопрос

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

И да, ещё момент - если обновить страницу, то запись может быть удалена. Тут, уж, на усмотрение bpm :/

Проверьте что вэбсокеты настроены

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

Реализовал несколько методов, которые используют API BPM. Все отлично работает от имени пользователя Supervisor, но от любого другого пользователя, с аналогичными правами, сервер возвращает error: "Удаленный сервер возвратил ошибку: (401) Несанкционированный."

Помогите понять в чем косяк...

У меня такой же вопрос

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

У пользователя не хватает прав на работу через OData. Где добавить права, см. тут.

Зверев Александр,

добавил... не помогло.

Значит, добавили не всюду, где надо. Там несколько пунктов.

Зверев Александр,

Зверев Александр,

Судя по названию объекта, он может быть связан с какой-то интеграцией, либо иметь какую-либо ещё нестандартную логику. Если через OData нормально читаются все остальные объекты, кроме этого, лучше будет уточнить у его авторов. Проверить работу OData с другими таблицами можно в браузере.

Зверев Александр,

такая же ошибка с доступом и к разделу "Обращения" - можно предположить, что дело совсем не в кастомном справочнике...

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

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

Григорий Чех,

ничего не помогло...

Григорий Чех,

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

В при обращении к другим объектам все работает успешно от пользователей из группы сис. админов.

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

Перераздайте права на ваш кастомный справочник

например через это приложение

Григорий Чех,

Заработало! Дело не в правах.

Пересоздал справочник: на странице редактирования любого раздела (я в контактах делал) создал поле с типом справочник и сохранил схему.

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

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

Всем привет. 

Продукт bpmn SDE 7.13.2.934

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

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

У меня такой же вопрос

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

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

Зверев Александр, есть ли примеры настройки подобного(фильтрация) БП ?  

Достаточно переключиться в мастере раздела на нужную вкладку и посмотреть существующие бизнес-правила. Либо см. документацию. Их бывает 4 разновидности, в том числе и фильтрация:

scr_section_wizard_rules_designer_action.png

В целом, вопрос решён, важна была подсказка о том, что для решения кейса стоит использовать бизнес-правило в разделе "Обращения". 

Для реализации задуманного нужно сделать следующее - задать всем КЕ при импорте "тип" и добавить суррогатное поле "тип КЕ" в каталоге услуг. 

После этого сравнивать два поля. Выглядит это примерно следующим образом: 

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

Коллеги, спасибо за помощь. 

 

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