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

Нравится

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

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

Данную информацию можно получить из таблицы SysUserSession следующим запросом:

declare @userName varchar(50)
set @userName = 'Supervisor' /*Здесь должно быть имя пользователя*/
IF EXISTS
(select SysUserSession.Id from SysUserSession
inner join SysAdminUnit
on SysAdminUnit.Id = SysUserSession.SysUserId
where SessionEndDate is NULL and SysAdminUnit.Name = @userName)
print('Пользователь '+@userName+' сейчас в системе')
ELSE print ('Пользователь '+@userName+' оффлайн')

Добрый день!

В разделе "Пользователи" на странице пользователя небходимо перейти на вкладку "Правила доступа":

http://prntscr.com/etibd0

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

С уважением,
Валерия

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

Добрый день.
Подскажите как на кнопку детали свой метод сделать.
Смотрел деталь "график поставок" нашел как добавить свою кнопку...но как убрать стандартную?

Нравится

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

"Юсупов Марат" написал:Подскажите как на кнопку детали свой метод сделать.

переопределить метод addRecord
"Юсупов Марат" написал:но как убрать стандартную?

в диффе remove->addRecordButton

"Варфоломеев Данила" написал:Юсупов Марат пишет:

но как убрать стандартную?

в диффе remove->addRecordButton

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

"Назыров Михаил" написал:Хотелось бы добавить, что если по нажатию на плюс появляется несколько вариантов добавления записи

Юзкейз интересный, если найдете решение в каком либо виде - обязательно отпишитесь для страждующих.
От себя могу предложить "костыль" в виде:
замещаем стандартный AddRecord метод, в котором перед родительской логикой (callParent)
делаем openLookup (открываем окно выбора) наполняя его само собой своей коллекцией вариантов,
ну а далее в коллбеке реагируем, в каких-то случаях идем по callParent варианту, в каих-то по своему кастомному. Вот...

"Назыров Михаил" написал:Хотелось бы добавить, что если по нажатию на плюс появляется несколько вариантов добавления записи

Юзкейз интересный, если найдете решение в каком либо виде - обязательно отпишитесь для страждующих.
От себя могу предложить "костыль" в виде:
замещаем стандартный AddRecord метод, в котором перед родительской логикой (callParent)
делаем openLookup (открываем окно выбора) наполняя его само собой своей коллекцией вариантов,
ну а далее в коллбеке реагируем, в каких-то случаях идем по callParent варианту, в каих-то по своему кастомному. Вот...

"Назыров Михаил" написал:Хотелось бы добавить, что если по нажатию на плюс появляется несколько вариантов добавления

"Севостьянов Илья Сергеевич" написал:если найдете решение в каком либо виде - обязательно отпишитесь для страждующих.

А в чём сложность-то? По кофигурации полно примеров.

{
	"operation": "merge",
	"name": "AddRecordButton",
	"values": {
		"click": Terrasoft.emptyFn, //перетираем стандартный обработчик клика
		"menu": {
			"items": [
				{
					"caption": "Нафига",
					"tag": "why",
					"click": {"bindTo": "onMyFuncClick"}
				},
				{
					"caption": "козе",
					"tag": "goat",
					"click": {"bindTo": "onMyFuncClick"}
				},
				{
					"caption": "баян?",
					"tag": "needs accordion",
					"click": {"bindTo": "onMyFuncClick"}
				}
			]
		}
	}
}

ну и дальше как угодно:
или биндим на каждый пункт свою функцию,
или делаем одну, отлавливаем tag через arguments,
или вообще items биндим на коллекцию и генерим её как делает террасофт с toolsMenu (+можно ещё присобачить bindConfig).
pic

"Варфоломеев Данила" написал:А в чём сложность-то? По конфигурации полно примеров.

Ну я просто не сталкивался с реализацией в UI, по этому не мог строить дедуктивное предположение о том, что это, где-то там есть, фактически я не знал что искать :) потому и не искал.
Спасибо, за пример - пригодиться.

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

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

Версия 7.9 sales.

Ситуация такая: имеется деталь с редактируемым реестром. При добавлении новой записи на деталь необходимо копировать туда часть значений из колонок основной страницы (на которой расположена деталь).

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

У детали с редактируемым реестром onEntityInitialized не срабатывает. render и init - тоже. Как правильно поступить в этом случае?

Важно, чтобы эти данные подставлялись до сохранения записи. То есть нажал "+", появилась новая строка - и чтобы там уже были данные, примерно так.

Нравится

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

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

"UsrProduct": {
    lookupListConfig: {
     columns: ["Price", "Currency"]
    },
    dependencies: [
     {
      columns: ["UsrProduct"],
      methodName: "setProductPrice"
     }
    ]
   },

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

Максим, здравствуйте.

Попробовал воспользоваться Вашим методом - сама деталь расположена на странице Счёта (фактически - это замена детали Продукт в счёте), соответственно для связи используется колонка Invoice объекта InvoiceProduct. В схеме InvoiceProductPageV2 добавил атрибут

"Invoice":{
				dependencies: [
					{
						columns: ["Invoice"],
						methodName: "setCurrency"
					}
				]
			},

Метод не срабатывает. Как я понимаю, эта колонка Invoice заполнена по умолчанию, и её изменения не происходит.

Для сравнения, методы, которые добавлены через атрибуты на колонки валюты, продукта - работают, при изменении значений все функции срабатывают.

Вам подойдет паттерн с событием-запросом и событием-ответом,

1)В основной карточке объявляете событие-запрос (подписку), событие-ответ (публикация) и осуществляете подписку на событие-запрос, в обработчике которого генерируете событие ответ передавая туда все необходимые поля и данные из текущего контекста.
2)В схеме детали, наборот: событие-запрос (публикация), событие-ответ (подписка) и осуществляете подписку на событие-ответ, в обработчике которого реализуете Вашу логику.
(Если вам необходимо прервать асинхронный процесс, то можете его заместить его в вашей схеме, где в chain вызвать функцию событием, и this.callParent)
3)По событию сохранения из детали публикуете событие запрос.

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

Илья, здравствуйте.

Можете немного подробнее пояснить?

Например, в карточке детали UsrInvoiceProductDetail я добавляю публикацию сообщения, переопределив для этого метод addRecord. По идее это именно то, что надо, осталось только передать это куда-то...

На это сообщение я могу, например, подписаться из общей карточки страницы InvoicePageV2, на которой размещена деталь. А как подписаться на него же внутри InvoiceProductPageV2 - карточки объекта, на основе которого создана деталь? init не работает.

Примерно представляю вариант с подпиской на сообщение из общей карточки страницы InvoicePageV2. И далее записывать нужный параметр напрямую в объект InvoiceProduct запросом. Других вариантов точно нет?

"Смородинов Денис" написал:- карточки объекта, на основе которого создана деталь? init не работает.

В данном случае трюк сработает только если пользователь "прошел" через карточку объекта в карточку на которой размещена деталь.
(В таком случае схема InvoiceProductPageV2 будет предварительно загружена, подписчики объявлены и событие будет поймано).
Если же пользователь может попасть в карточку с деталью минуя загрузку страницы объекта. - У вас остается только один способ манипуляции с данными - это работа с базой через ESQ.

Илья, а других способов, как я понимаю, нет?

Так, чтобы в InvoiceProductPageV2 отловить момент добавления новой строки, аналог onEntityInitialized для детали с редактируемым реестром.

"Смородинов Денис" написал:Илья, а других способов, как я понимаю, нет?

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

Так... я немного потерял суть:
InvoiceProductPageV2 - это схема
UsrInvoiceProductDetail - это деталь с реестром на ней
так ?
Вам при добавлении записи в деталь необходимо получать некие значения из карточки (InvoiceProductPageV2) ?

Да. Колонки ему необходимо заполнить. Сделать это можно в InvoiceProductPageV2, но событие добавления новой строки можно словить в UsrInvoiceProductDetail, вот и выходит что писать код нужно и там и там, в UsrInvoiceProductDetail ловить событие добавление записи, пушить сообщение, в InvoiceProductPageV2 слушать это сообщение, деать esq к объекту карточки, и заполнять колонки через this.set(...

"Севостьянов Илья Сергеевич" написал:Вам при добавлении записи в деталь необходимо получать некие значения из карточки (InvoiceProductPageV2) ?

Да, всё верно. Вопрос в том, как в этом случае

"Максим Шевченко" написал:в InvoiceProductPageV2 слушать это сообщение

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

"Смородинов Денис" написал:Обычно подписывались через init, который здесь не срабатывает.

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

То есть подписаться на такое сообщение в InvoiceProductPageV2 в случае детали с РР нельзя?

И добавление происходит без открытия страницы или миникарточки ?

"Севостьянов Илья Сергеевич" написал:И добавление происходит без открытия страницы или миникарточки ?

Да, это деталь с редактируемым реестром.

Есть в типовой поставке пример такой детали ? Чего-то с наскока не найти.
Детали с редактируемым реестром, как раз зачастую, при добавлении записи - открывают карточку ("например Продукты в Счетах" или "Адреса" в "Контрагентах") или миникарточку (например "Контакты контрагента" в "Контрагенты"), это РЕДАКТИРУЮТСЯ уже добавленные записи без открытия карточек, так чтобы совсем без карточки я что-то не найду просто примера даже.
Если есть пример я быстро отдебажу событийную модель, и скажу ченго куда пихать.

Илья, сейчас попробую найти, по моему, были.

Речь идёт вот о такой детали: https://academy.terrasoft.ru/documents/technic-sdk/7-8/sozdanie-detali-…

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

Для примера - хотя бы добавление пункта в типовой справочник.

Вот например, справочник Типы договоров - жмём "Добавить", появилась строчка. Это конечно не совсем то, но близко.

"Смородинов Денис" написал:то конечно не совсем то, но близко.

Визуально - да, по факту - совсем не то.
Ну если у вас есть схема с реализацией Вашей детали - дайте MD файл и редакцию на которой разрабатываете.
"Смородинов Денис" написал:Но хотелось бы уж разобраться, возможно ли вообще такое.

Мне тоже интересно, давайте разберемся.

"Севостьянов Илья Сергеевич" написал:Ну если у вас есть схема с реализацией Вашей детали - дайте MD файл и редакцию на которой разрабатываете.

Сделайте любую деталь, мастером детали, разместите в любом разделе, и после внесите следующие доработки:

- Добавить зависимости от модулей ConfigurationGrid (Конфигурационный реестр), ConfigurationGridGenerator, ConfigurationGridUtilities;
- Подключить "миксин" ConfigurationGridUtilites;
- Установить атрибут IsEditable в значение true;
- Базовому реестру указать свойства:
className: "Terrasoft.ConfigurationGrid",
generator: "ConfigurationGridGenerator.generatePartial",
generateControlsConfig: {bindTo: "generateActiveRowControlsConfig"},
changeRow: {bindTo: "changeRow"},
unSelectRow: {bindTo: "unSelectRow"},
onGridClick: {bindTo: "onGridClick"},
initActiveRowKeyMap: {bindTo: "initActiveRowKeyMap"},
для добавления действий активной записи добавить:
activeRowActions: [...],
activeRowAction: {bindTo: "onActiveRowAction"}

Итоговый код простейшей редактируемой детали будет выглядеть следующим образом:

define("UsrSchema1Detail", ["ConfigurationGrid", "ConfigurationGridGenerator",
   "ConfigurationGridUtilities"], function() {
   return {
      entitySchemaName: "Contact",
      attributes: {
         "IsEditable": {
            dataValueType: Terrasoft.DataValueType.BOOLEAN,
            type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
            value: true
         }
      },
      details: {},
      diff: [
         {
            "operation": "merge",
            "name": "DataGrid",
            "values": {
               "className": "Terrasoft.ConfigurationGrid",
               "generator": "ConfigurationGridGenerator.generatePartial",
               "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
               "changeRow": {"bindTo": "changeRow"},
               "unSelectRow": {"bindTo": "unSelectRow"},
               "onGridClick": {"bindTo": "onGridClick"},
               "activeRowActions": [
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "save",
                     "markerValue": "save",
                     "imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "cancel",
                     "markerValue": "cancel",
                     "imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
                  },
                  {
                     "className": "Terrasoft.Button",
                     "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
                     "tag": "remove",
                     "markerValue": "remove",
                     "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
                  }
               ],
               "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
               "activeRowAction": {"bindTo": "onActiveRowAction"},
               "multiSelect": false
            }
         }
      ],
      mixins: {
         ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities"
      },
      methods: {}
   };
});

Почистить кеш, перезайти, и все, деталь редактируемая.
Дальше можете эксперементировать со страницей редактирования, которая конечно открыватся не будет. Но часть логики с нее работать будет ;) О чем я писал выше.

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

Подскажите, пожалуйста, в итоге мы можем заполнить поля объекта детали с редактируемым реестром значениями полей записи,в которой расположена деталь?
почитала здесь обсуждение и не поняла, к чему в итоге пришли :smile:
у меня есть объект UsrObj, его деталь UsrUsrObjDetail на странице продаж, его страница UsrUsrObj1Page1. деталь с ред. реестром. я добавляла публикацию сообщения в UsrUsrObjDetail на addRecord и подписку UsrUsrObj1Page1 в методе initEntity. но initEntity срабатывает позже, чем addRecord и у меня выходила след.ошибка в консоли
UnsupportedTypeException: Message addRecordOOP cannot be subscribed in DetailModuleV2 (CardModuleV2_66ac4481-f753-41fd-bd33-80df01c99ed1_OpportunityPageV2_detail_UsrUsrObjDetailcb3382b4ICLIndButch), message direction set as publish

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

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

Версия 7.9 sales.

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

Делается это стандартным запросом:

var $this = this;
var leadEsq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Lead"});
                                       
                                        leadEsq.addColumn("QualifiedContact");
                                        leadEsq.addColumn("QualifiedAccount");
                                       
                                        leadEsq.getEntity(this.get("UsrLead").value, function(result) {
                                                if (!result.success) {
                                                        console.log("Ошибка запроса данных");
                                                        return;
                                                }
                                               
                                                if (result.entity.get("QualifiedContact")){
                                                        $this.set("Contact",result.entity.get("QualifiedContact"));
                                                } else {
                                                        if (result.entity.get("QualifiedAccount")){
                                                                $this.set("Account",result.entity.get("QualifiedAccount"));
                                                        }
                                                }
                                               
                                                $this.updateDetail({
                                                        detail: "Client"
                                                });
                                               

                                        }, this);

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

$this.set("Client",result.entity.get("QualifiedAccount")); - то же самое.

Как автоматически подставлять значение Клиента?

Нравится

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

Заметил, что какая-то подстановка всё же происходит - в частности, меняется иконка у поля Клиента.

Но сохранить страницу всё равно нельзя.

Здравствуйте,
Как при программной установке обычного лукапа, что бы узнать какую структуру должен иметь объект второго параметра this.set("колонка", значение), достаточно в init закешировать скоуп, и в консоли сделать this.get("имя-колонки"), и Вы узнаете правильную структуру, вроде этой:
{ value: "a7c4c271-22e4-44b0-b037-00045bd579ae", displayValue: "Name 1" }
Так и для мультилукапа можно его значение получить через this.get к примеру клиент из продажи это мультилукап, и структура будет следующей:
{ Name: "Name 1", Email: "", Id: "a7c4c271-22e4-44b0-b037-00045bd579ae", Photo: "", value: "a7c4c271-22e4-44b0-b037-00045bd579ae", displayValue: "Name 1", column: "Contact" }

Не вся из этой информации обязательна для заполнения, к примеру, можно установить значения клиента и таким кодом:

var val = {
Id: "bb7442b1-c8a1-43fc-b5b0-004bcc91fa5b",
value: "bb7442b1-c8a1-43fc-b5b0-004bcc91fa5b",
displayValue: "Name 3",
column: "Contact"
}
document.testscope.set("Client", val);

где document.testscope переменная в которой закеширован скоуп карточки. Для вас это просто this.set("Client", val); если Вы пишете код в методах карточки.
При чем, в этот момент установится и значение для колонки «Contact».

Ну или если проставляете аккаунта, то column: "Account".
Вот таким нехитрым способом можно установить програмно значение мультилукапа, чем клиент и является.

Максим, спасибо!

Помогло.

Короче, подстановка делается таким же способом, как и для обычной справочной колонки, только добавляется параметр column.

Максим, спасибо!

Помогло.

Короче, подстановка делается таким же способом, как и для обычной справочной колонки, только добавляется параметр column.

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

Доброго времени суток!
Существует лендинг с помощью которого создается в системе лид.
Так же есть бизнес-процесс в котором сигнал срабатывает на создания лида с помощью лендинга.
Этот БП не отрабатывает. Каким образом следует указать сигнал, что отлавливать момент создания лида с помощью лендинга в системе?
Так же пытались вешать сигнал на изменения поля "Лендинг" в самом Лиде. Так же 0 эффекта, БП не запускается.

Нравится

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

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

При создании лида с лендинка справочное поле “Как зарегистрирован” по умолчанию заполняется значением “Лендинг”.
Для ращения задачи необходимо в стартовом сигнале указать:
- объект Лид, после добавления записи
- условие: Как зарегистрирован = Лендинг

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



2022-02-14 09:09:36,024 ERROR NT AUTHORITY\SYSTEM ProcessEngine RunProcesses - Error while running process [b82822ff-3b39-447d-8658-c57fe5f807bf] for Lead (Id: [f2a32245-c0fa-4756-b6d0-a5049583c651])

System.InvalidOperationException: Failed to get the context for the background operation. For services without authorization it is necessary to call Terrasoft.Web.Common.SessionHelper.SpecifyWebOperationIdentity.

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

Здравствуйте, коллеги.

У меня непонятная проблема с Мастером Детали. Не удается создать новую деталь.
Сделал так:
1. Создал объект. Отнаследовал его от "Базовый объект". Разметил колонки.
2. Открыл мастер деталей. Указал название и выбрал этот объект. Настроил Страницу.
3. Нажал сохранить и.. все повисло на "регистрация страниц".

В консоли браузера:

 message: Uncaught Terrasoft.ArgumentNullOrEmptyException: Argument with name is either null or empty; argumentName: query
 stack: undefined

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

SysModuleEntity_SysModuleEntityManager_69b321a985044103944f31db7bfc135a

Как это разрулить?

Нравится

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

Добрый день, Евгений.

Скорей всего ошибка возникает по причине неправильной зависимости пакетов или же некорректно установленной системной настройки "Текущий пакет". Также Вам стоит скомпилировать конфигурацию что бы проверить наличие ошибок.

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

Добрый день, Илья.

Компиляция не возвращает ошибок.

У меня вообще полный кейс, это создание страницы редактирования записи справочника с деталью (типа "Каналы Лида").

Евгений, здравствуйте!

Обратите внимание в каком пакете был добавлен объект для детали и какой пакет указан в системной настройке "Текущий пакет". Также, проверьте корректные зависимости данного пакета.
Вероятно, что в текущем пакете у Вас указан Ваш пакет, у которого не корректная зависимость.
Для того, чтобы это проверить установите текущий пакет "Custom", перезайдите в систему(через кнопку "Выйти") и повторите процесс создания детали. Если ошибка не будет воспроизводится, то проблема в зависимостях пакета, который сейчас указан в системной настройке "Текущий пакет".

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

В исходных кодах часто встречается использование свойства initMethod, например

...
"Recommendation": {
        dataValueType: this.Terrasoft.DataValueType.MAPPING,
        type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
        caption: resources.localizableStrings.RecommendationCaption,
        initMethod: "initProperty",
        isRequired: false,
        doAutoSave: true
},
...

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

PS: Здравый смысл показывает что можно бы забиндить "value" атрибута на метод, для первичной инициализации - но

"value": {bindTo: "MyMethod"}

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

Нравится

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

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

Пример реализации и вызова функции указанного в атрибуте можете посмотреть в схеме ProcessFlowElementPropertiesPage.

Пример кода:

initParameters: function(element) {
	this.initDesignerType();
	Terrasoft.each(this.columns, function(columnConfig, columnName) {
		if (columnConfig.initMethod) {
			var parameter = element.findParameterByName(columnName);
			this[columnConfig.initMethod](parameter);
		}
	}, this);
},

Пример реализации метода:

initProperty: function(parameter) {
	var parameterName = parameter.name;
	this.set(parameterName, this.getParameterValue(parameter));
},

Метод initParameters вызовется в момент создании экземпляра схемы/модуля.

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

Имеется ли все таки возможность установить инлайновые стили на этапе объявления элемента в схеме ?
В исходных кодах найдено неоднократное использование аттрибута конфигурационного элемента "styles"
В который передается дочерний объект содержащий стили в виде ассоциативного массива.

...
        styles: {
                textStyle: {
                        margin: '0px 10px 0px 0px'
                }
        },
...
        styles: {
                wrapStyles: {
                        margin: "18px 0px 0px " + (35 * index) + "px"
                }
        },
...
        styles: {
              wrapperStyle: {
                        'float': 'right'
              }
         },

Причем ключ дочернего объекта мне по встречался 3-х вариантов:
wrapperStyle
wrapStyles
textStyle
Судя по всему в этом есть смысл...
А началось собственно все с найденного в исходниках модуля Switcher:
/**
* Объект для спецификации inline-стилей компонента указанных в шаблоне.
* Если в {@link #tpl шаблоне} указано имя стиля, то в объекте стилей должно быть свойство с таким же имененм.
* Если свойство со стилями не будет найдено, то атрибут со стилями будет удален из шаблона. Специфицировать
* стили компонента можно в любом из двух методов {@link #getTpl getTpl()} и {@link #getTplData getTplData()}.
* @overridden
* @type {Object}
*/

styles: {
wrapStyles: {},
innerWrapStyles: {},
trueValueStyle: {},
falseValueStyle: {}
},

Но как видно наименования ключей все же различаются...
Методом эксперимента я попробовал использовать этот атрибут конфигурационного объекта в замещающих схемах - но к сожалению они не работают.

Подскажите найденные в исходных кодах примеры - это какие-то частные случаи ?
Или я что-то делаю не так ?
Существует ли штатный способ добавления инлайновых стилей к врапперам объектов, на этапе объявления их конфигурационных объектов в схемах ?

Нравится

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

Вы про это?

{
	"operation": "insert",
	"name": "HeaderContainer",
	"parentName": "MainContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"generateId": false,
		"styles": {
			"padding-bottom": "3em",
			"min-height": "3.2em",
			"margin-left": "-8px"
		},
		"items": []
	}
}

Вроде как в styles у элемента можно что угодно прописать. Но это не точно)
Лучше смотреть, какой у элемента wrapper, добавлять в него класс, а класс описывать в отдельном модуле.
Отдельный привет ребятам из терика, по конфигурации разбросаны: wrapClass, wrapperClass, wrapClasses, wrapClassName и т.п.
У - Унификация

"Варфоломеев Данила" написал:Вроде как в styles у элемента можно что угодно прописать. Но это не точно)

Да вот что-то у меня ничего не получилось, ни так как у вас - с перечислением силей в корне, потом я нашел упоминания вот этого "styles"
а в нем в свою очередь wrapStyles
Попробовал так, было в этом какое-то рациональное зерно, т.к. элемент в конечном итоге как-бы во враппер помещается и вроде как стили надо бы ему устанавливать...
Но как я ни пробовал - по аналогии с найденными примерами использования, так у меня ни в одну схему так стили и не вывелись.

С классами - все ясно, но блин создавать целый модуль отдельный чтобы на 2 пикселя паддинг поправить, это как-то "из пушки по воробьям".
А добиться к элементу через Ext.select().setStyle - по какому ни будь Ready Event ну уж как-то "пахнет костылями"
Кстати штатные браузерные "window.onload" и "document.addEventListner('DOMContentLoaded'..." - почему-то фейлятся, штатный Ext.onReady почему-то стартует еще до отрисовки
Так что приходится подбирать подходящий метод из событийной модели самго BPMOnline.

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

Немного про style && class: При создании шаблона и использования в верстке тегов style и class надо использовать свойства styles и classes. styles - это объект в котором можно задавать набор свойств стилей для тегов style шаблона. classes - объект, свойства которого - массивы.
Например:

tpl: [
    '<div style = "{wrapStyle}" class = "{wrapClass}">',
        '<span id = "{id}" class = "{labelClass}" style = "{labelStyle}">{text}',
        '</span>',
    '</div>'
],
classes: {
    wrapClass: ['wrap', 'wrap-important', 'top-element'],
    labelClass: ['wrap-el', 'label', 'caption-el']
},
styles: {
    wrapStyle: {
        backgroundImage: this.image
    },
    labelStyle: {
        font: this.font,
        whiteSpace: this.getWrapStyle(this.wrap)
    }
}

wrapStyle, labelStyle - объекты задающие стили для конкретных елементов шаблона (напр. div, span, p, ...)
Также, при создании собственного шаблона рекомендуется указать шаблон id="{id}".
Пример: ' id="{id}">...'
В указанных случаях в объекте tplData устанавливать эти свойства не надо, перед формированием шаблона стили и классы анализируются и подменяются актуальными значениями из соответствующих свойств. Если в компоненте не будут указаны стили, атрибут style будет автоматически удален из шаблона.

Так же рекомендую почитать статью.

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

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

Нравится

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

Коллеги, добрый день!
Есть ряд вопросов, на которые я не смог найти ответов:
1. Как реализовать возможность выбора презентации из списка, при выполнении действия на визите "Показ презентации"? На текущий момент есть возможность добавить несколько статей в "Правила полевых продаж" -> "Правила визита к врачу" -> "Показ презентации", но при выполнении соответствующего действия на визите открывается презентация автоматически одна, не давая возможность выбрать. Да, остальные статьи прикрепляются в "Файлы и ссылки", но это совершенно не то, что хотелось бы. Можно с этим что-нибудь сделать?
2. Как можно сделать так, чтобы пользователь мог копировать "блоками" из раздела "Активности" свои визиты (представления реестра - "Расписание"). Пример. Пользователь добавляет активности на сегодня, 5 визитов. Он точно понимает, что ему ровно такие же визиты необходимо будет совершить завтра, через 5 дней, и еще через n-ое кол-во времени. По сути, меняется только дата начала и завершения.
Удобнее всего копировать целый день визитов, и переносить их на другую дату. По одному визиту копировать не серьезно, и не удобно.
3. Почему при создании визита, при указании времени визита случается такая ситуация - дата начала по умолчанию выставляется как "Текущая дата и время". Тут вопросов нет. А дата завершения устанавливается по умолчанию как "Текущая дата и время" +30 минут. Знаю, что эти "30 минут" устанавливаются и регулируются в справочнике, про который я писал в первом пункте. Но дело в том, что если при создании визита, ставлю, например 50 минут вручную, или 15 минут, меняю дату на "завтра", то при сохранении активности дата завершения ВСЕГДА устанавливается как "Дата начала визита" +30 минут? Как это исправить, и предоставить возможность выбора, оставив возможность устанавливать время продолжительности визита по умолчанию?

Нравится

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

Добрый день, Владимир!

Согласно Вашего комментария созданы проблемы/пожелания на команду разработки продукта по вопросам 1 и 3. Номера проблем 6543 и 6544 соответственно.
Что касается второго вопроса, то вероятно Вам подойдет функционал "Цикловых заданий", который уже реализован в версии 7.10. Для его использования необходимо обновится на последнюю версию и установить пакеты полевых продаж, в результате чего появится раздел "Цикловые задания" (к сожалению, пока еще информация про данный раздел не добавлена в руководство пользователя, но вопрос уже в проработке и статья появится в ближайшее время).

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