Как из действий CTI панели при запуске бизнес процесса открывать мини карточку?
Необходимо заполнить результаты звонка, но показывать оператору не всю карточку а только пару полей в ней.
 

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

Нравится

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

В самом процессе, который привязан к кнопке на панели, можно создать блок «автогенерируемая страница» и вывести на неё нужные поля. Или «Преднастроенная страница», там возможности дизайна шире: можно создать новую страницу с полями или указать интересующую мини-карточку. То есть нужно в конфигурации или библиотеке процессов найти нужный БП и доработать.

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

Автогенерируемая страница не подойдет, нужна именно миникарточка.
Если использовать "преднастроенную страницу" и туда указывать мини карточку, то из CTI панели мини карточка не открывается. Просто по нажатию проставляется url типа CallMiniPage/add/GUID и ничего больше не происходит.

А какие-то ошибки при этом пишутся в консоли?

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

Создал миникарточку, опираясь на https://academy.terrasoft.ru/documents/technic-sdk/7-16/kak-sozdat-mini-kartochku-dobavleniya. Только в моём случае это было редактирование имени существующего объекта. 
Добавил кнопку в разделе, по клику на которую открывается миникарточка.

onButtonClick: function () {
				debugger;
				var activeRowId = this.get("ActiveRow");
				if (activeRowId) {
					this.openMiniPage({
						recordId: activeRowId,
						operation: Terrasoft.ConfigurationEnums.CardOperation.EDIT,
						entitySchemaName: this.entitySchemaName,
						isFixed: true,
						showDelay: 0,
						miniPageSchemaName: "MyUsrMorpheusMiniPage",
					});
				}
			}

Вот код миникарточки, название сущности MyUsrCar2

define("MyUsrMorpheusMiniPage", [
	"terrasoft",
	"MyUsrCar2File",
	"ConfigurationConstants",
	"css!MyUsrMorpheusMiniPageCss"
], function (Terrasoft, MyUsrCar2File, ConfigurationConstants) {
	return {
		entitySchemaName: "MyUsrCar2",
		attributes: {
			"MiniPageModes": {
				"value": [this.Terrasoft.ConfigurationEnums.CardOperation.EDIT]
			}
		},
		methods: {},
		diff: [
			{
				"operation": "insert",
				"parentName": "MiniPage",
				"propertyName": "items",
				"name": "Name",
				"values": {
					"isMiniPageModelItem": true,
					"layout": {
						"column": 0,
						"row": 0,
						"colSpan": 24
					},
					"controlConfig": {
						"focused": true
					}
				}
			}
		]
	};

});

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

1. Заголовок для подписи "Name" не был найден.

2. Невозможно найти колонку по конфигурации: "{"layout":{"colSpan":24,"rowSpan":1,"column":0,"row":0},"controlConfig":{"focused":true},"name":"Name"}" .

 

3. MiniPageViewGenerator.js:308 Uncaught TypeError: Cannot read property 'name' of undefined
    at i.getNeedGenerateHyperLink (MiniPageViewGenerator.js:308)

core-base.js:704 user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:82/0/configuration/6560b43f8738c260f612822f729cc099ru-…
 line: 308
 column: 82

 4. message: Uncaught TypeError: Cannot read property 'name' of undefined 
 date: Tue Jul 07 2020 11:19:54 GMT+0300 (Москва, стандартное время)
 stack: TypeError: Cannot read property 'name' of undefined
    at i.getNeedGenerateHyperLink

 

Пытался решить, как описано тут https://community.terrasoft.ua/questions/dobavlenie-email-kontakta-v-kartocku-obrasenia - не помогло.

Нравится

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

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

Там для других случаев есть статьи Создание мини-карточки и Добавление мини-карточки к произвольному модулю.

 

Судя по сообщению, ошибка в функции getNeedGenerateHyperLink в схеме MiniPageViewGenerator. Эта схема есть в конфигурации, её код виден:

/**
 * @private
 * @param {Object} clonedConfig
 * @returns {Boolean}
 */
getNeedGenerateHyperLink: function(clonedConfig) {
	var itemDataValueType = this.getItemDataValueType(clonedConfig);
	var viewModelColumn = this.findViewModelColumn(clonedConfig);
	var primaryDisplayColumnName = this.getPrimaryDisplayColumnName();
	var isEditable = this.isSchemaEditable(viewModelColumn);
	var isLookup = itemDataValueType === Terrasoft.DataValueType.LOOKUP;
	var isSimpleLookup = viewModelColumn && viewModelColumn.isSimpleLookup;
	var isPrimaryDisplayColumnName = primaryDisplayColumnName === viewModelColumn.name;
	return isPrimaryDisplayColumnName || (isLookup && isEditable && !isSimpleLookup);
 
},

Видимо, в третьей строчке в переменную viewModelColumn попадает не объект, а пустое или объект без свойства name, из-за чего третья с конца строка падает при обращении к нему.

 

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

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

Предлагаю разработать функциональность - дизайнер страницы для мини-карточки (для всех мини-карточек). Предложение в списках на улучшение с середины прошлого года. Может быть через канал "Идеи" будет быстрее?

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

А сколько голосов надо набрать, чтобы реализовали? :)

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

Спасибо, за Ваше пожелание.

Данный функционал будет реализован в будущих версиях.

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

Добрый день!

Функциональность дизайнера миникарточек уже в работе. В одной из ближайших версий выпустим в релиз! 

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

Рада сообщить, что функциональность дизайнера миникарточек будет доступна в версии 7.12.2.

 

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

Добрый день.
Добавил в мини-карточку активности два поля:
1. справочник "Контрагент" ("contentType": 5)
Проблема: после выбора значения справочника не закрывается пустое модальное окно LookupPage
2. Дата/время
Проблема: После выбора даты из календаря мини-карточка активности закрывается без сохранения.
Данное поведение наблюдается в мини-карточке вызываемой в LeadSectionActionsDashboard по нажатию на "Завершить" во "View" Mode. В "Edit" Mode всё в порядке.

Как альтернатива хотел отключить "View" Mode и загружать сразу "Edit" Mode. Переопределил атрибут

"Mode": {
                dataValueType: this.Terrasoft.DataValueType.TEXT,
                type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                value: this.Terrasoft.ConfigurationEnums.CardOperation.EDIT
            },
            "MiniPageModes": {
                    dataValueType: this.Terrasoft.DataValueType.COLLECTION,
                    type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    value: [this.Terrasoft.ConfigurationEnums.CardOperation.VIEW, this.Terrasoft.ConfigurationEnums.CardOperation.EDIT]
                },

Но так и загружается мини-карточка в "View" Mode.
Версия 7.8.0.1681

Нравится

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

Ещё один нюанс:
Добавил в мини-карточку активности поле список "Стадии продажи"
Добавляю сортировку поля в массив attributes:

"UsrOpportunityStage": {
   dataValueType: Terrasoft.DataValueType.LOOKUP,
   columns: ["Number"],
   lookupListConfig: {
     orders: [{
       columnPath: "Number",
       direction: Terrasoft.OrderDirection.ASC,
      }]
   }
}

В итоге сортировка не отрабатывает.
Аналогичные настройки в стандартной PageV2 отрабатывают корректно.

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

Добрый день, Илья!
А что вы можете порекомендовать по поводу решения проблем, описанных в пунктах 1 и 2 и проблемой с сортировкой справочных полях?

"Мотков Илья" написал:Для переключения режимов посмотрите в сторону функции базовой мини-карточки «switchMiniPageMode», которая в свою очередь вызывает changeMiniPageMode с нужным параметром. И делайте переключение в нужный вам режим в нужный вам момент.

Сделал по Вашему совету. Вызываю switchMiniPageMode() в onRender.
По итогу мини-карточка открывается в edit Mode. Казалось бы "Ура!!!" Но нет:smile:
Т.к. у меня есть поля, которые отображаются по условию, то после выполнения условия поля появляются, высота самой мини-карточки увеличивается, а её положение не меняется.
И в итоге я получаю кнопку "Сохранить" за пределами экрана и без возможности скроллинга (http://joxi.ru/RmzbjObHllMlmO).
Положение, мини-карточки определяется стилями, применёнными к тэгу div с id = AlignableMiniPageContainer, но где расчитываются top и left не нашёл.

"Коновалов Игорь" написал:Ещё один нюанс:
Добавил в мини-карточку активности поле список "Стадии продажи"
Добавляю сортировку поля в массив attributes:
"UsrOpportunityStage": {
   dataValueType: Terrasoft.DataValueType.LOOKUP,
   columns: ["Number"],
   lookupListConfig: {
     orders: [{
       columnPath: "Number",
       direction: Terrasoft.OrderDirection.ASC,
      }]
   }
}

В итоге сортировка не отрабатывает.
Аналогичные настройки в стандартной PageV2 отрабатывают корректно.

Оказалось, что сортировка в мини-карточках не реализована.
Решение:
1. Замещаем BaseMiniPage.
2. В блок methods переносим код из BasePageV2

 applyColumnsOrderToLookupQuery: function(esq, columnName) {
                var lookupColumn = this.getColumnByName(columnName);
                var lookupListConfig = lookupColumn.lookupListConfig;
                if (!lookupListConfig || !lookupListConfig.orders) {
                    return;
                }
                var columns = esq.columns;
                this.Terrasoft.each(lookupListConfig.orders, function(order) {
                    var orderColumnPath = order.columnPath;
                    if (!columns.contains(orderColumnPath)) {
                        esq.addColumn(orderColumnPath);
                    }
                    var sortedColumn = columns.get(orderColumnPath);
                    var direction = order.direction;
                    sortedColumn.orderDirection = direction ? direction : Terrasoft.OrderDirection.ASC;
                    var position = order.position;
                    sortedColumn.orderPosition = position ? position : 1;
                    this.shiftColumnsOrderPosition(columns, sortedColumn);
                }, this);
            },
 
            shiftColumnsOrderPosition: function(columns, sortedColumn) {
                 var sortedColumnOrderPosition = sortedColumn.orderPosition;
                if (Ext.isNumber(sortedColumnOrderPosition)) {
                    columns.each(function(column) {
                        if (column !== sortedColumn && Ext.isNumber(column.orderPosition) && column.orderPosition >= sortedColumnOrderPosition) {
                            column.orderPosition += 1;
                        }
                    });
                }
            },

3. И переопределяем метод getLookupQuery

 getLookupQuery: function(filterValue, columnName) {
                var esq = this.callParent(arguments);
                this.applyColumnsOrderToLookupQuery(esq, columnName);
                return esq;
            },

4. Чистим кэш и наслаждаемся работой сортировки справочных полей в мини-карточке :smile:

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

Добрый день.
Необходимо для нового раздела с тремя типами записей добавить для каждого типа мини-страницу.
Делаю по инструкции: https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/sozdanie-mini-k...
Создал "Схему модели представления карточки". Унаследовался от BaseMiniPage.
Для каждой страницы редактирования раздела в SysModuleEdit добавил значение MiniPageSchemaUId
Добавил модуль со стилями.
В итоге при добавлении записи открывается стандартная страница редактирования.

Подскажите, что не так?

Нравится

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

Вот аналогичная тема - http://www.community.terrasoft.ru/forum/topic/16310

[quote="Мария Ватулина"]Вот аналогичная тема - http://www.community.terrasoft.ru/forum/topic/16310[/quote]

Мария, спасибо, но в этой теме ответа на мой вопрос не получил.
Меня интересует именно вызов разных мини-страниц в зависимости от выбранного типа в списке при нажатии на кнопку "Добавить".
Кстати, раньше в разделе "Активности" был выбор типа новой записи (при нажатии на "Добавить" в реестре), сейчас этого выбора нет (только "Добавить задачу"). Но что делать, если содержание мини-страниц должно формироваться в зависимости от типа?

Игорь, предположительно, должно быть в мастере настроено несколько страниц. Затем для каждого типа должна отдельно зарегестирована в БД схема (своя страница редактирования) и соотвественная для каждого MiniPageSchemaUId. После этого очистить кэш и проверрить работу. Попробуйте, также, отладить код.

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

Игорь, статья в Академии
https://academy.terrasoft.ru/documents/technic-sdk/7-8-0/sozdanie-mini-…
описывает создание мини-карточки, которая появляется при наведении курсора на ссылку на запись раздела. В примере это запись раздела "База знаний".
Но это не тот тип миникарточки, который появляется при создании новой записи раздела

Встречный вопрос, как привязать к кнопке "Добавить" мини-карточку вместо обычной?
Смотрю ActivitySectionV2, но признаков открытия minPage кроме как вызова метода this.openAddMiniPage в методе onSelectionKeyPress не нашёл, однако при нажатии на Добавить задачу debugger в этот метод не заходит.

Точной последовательности создания миникарточки, к сожалению, Вам сказать не могу пока.
Однако, укажу откуда начать
посмотрите следующий метод в BaseSectionV2
addRecord: function(typeColumnValue) {
...
if (this.hasAddMiniPage(typeColumnValue)) {
this.openAddMiniPage({
entitySchemaName: this.entitySchemaName,
valuePairs: this.getAddMiniPageDefaultValues(typeColumnValue)
});
} else {
this.openCardInChain({...
}
При создании записи в разделе, если к нему привязана миникарточка, то отладчик останавливается на точке останова, установленной в this.openAddMiniPage
А далее надо смотреть

В BaseSectionV2 в методе addRecord происходит проверка наличия мини-карточки по типу

this.hasAddMiniPage(typeColumnValue)

, где в свою очередь проверяется miniPage.hasAddMiniPage. Это свойство на данный момент у меня undefind.
Вопрос: Где устанавливается это свойство для той или иной страницы редактирования?

p.s.: Я докопал до BaseSchemaViewModel.initEditPages, где формируется конфигурация мини-страницы:

MiniPage: {
  schemaName: editPage.miniPageSchema,
  hasAddMiniPage: editPage.hasAddMiniPage
},

, но где присваивается значение editPage.hasAddMiniPage так и не нашёл.

hasAddMiniPage - всего лишь атрибут который отображает есть ли для данного раздела мини-карточка добавления записи
При глобальном поиске по приложению (F12 затем Ctrl+Shift+F) по слову miniPageSchema или hasAddMiniPage
в первых трех строках отображаются объекты Terrasoft.Configuration с идентификаторами схем миникарточек, привязанных к разным разделам. Скорее всего информация об этом занесена непосредственно в БД. Можно покопать в эту сторону

"Симута Роман Русланович" написал:hasAddMiniPage - всего лишь атрибут который отображает есть ли для данного раздела мини-карточка добавления записи
При глобальном поиске по приложению (F12 затем Ctrl+Shift+F) по слову miniPageSchema или hasAddMiniPage
в первых трех строках отображаются объекты Terrasoft.Configuration с идентификаторами схем миникарточек, привязанных к разным разделам. Скорее всего информация об этом занесена непосредственно в БД. Можно покопать в эту сторону

Тоже искал глобальным поиском + режим отладки раздела Активности (здесь MiniPage.hasAddMiniPage = true)
Но у меня MiniPage.hasAddMiniPage передаётся Undefined, хотя название схемы мини-карточки передаётся и для соответствующих записей в таблице SysModuleEdit заполнено поле MiniPageSchemaUId.

В какой таблице искать hasAddMiniPage?

В таблицах SysModuleEdit, SysModule, SysModuleEntity, SysSchema такого поля нет.
P.S.: Вообще было бы прекрасно, если бы в академии появилась статья по добавлению мини-карточки в раздел к кнопке "Добавить".

Игорь, свойство hasAddMiniPage определено в миксине MiniPageUtilities.

Миксин подключается к модели представления в классе BaseSchemaViewModel реализованном в одноименном модуле. В этом же классе есть метод initEditPages, в котором заполняется коллекция моделей представления для каждой entitySchema и там же заполняютя значениями свойства hasAddMiniPage (поищите глобальным поиском)

Поскольку вы создали новый раздел, то возможно, что это свойство у вас не инициализируется
посмотрите в глобальном объекте Terrasoft.configuration.EntityStructure (просто наберите в консоли)
пример для объекта Account - во вложении
посмотрите в объекте вашего раздела

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

Да Роман, это я уже находил и писал выше.
Но как всё же проинициализировать свойство editPage.hasAddMiniPage (НЕ miniPage.hasAddMiniPage)?

Узнал. Нужно добавить системную настройку с кодом Has[ИмяСущностиРаздела]MiniPageAddMode, например, как для раздела HasAccountMiniPageAddMode
Это системная настройка булевского типа, из нее и прилетает значение свойства hasAddMiniPage в Terrasoft.configuration.EntityStructure

Да, Роман! То, что надо. Спасибо.

В продолжении темы, страница выводится, НО одна для всех типов.
Смотрю по коду и вижу, что в

 this.openAddMiniPage({
   entitySchemaName: this.entitySchemaName,
   valuePairs: this.getAddMiniPageDefaultValues(typeColumnValue)
});

необходимо передать ещё один параметр miniPageSchemaName, передаю.

Далее в MiniPageContainerViewModel.setSchemaParametersInfo
в строке

var schemaName = this.getSchemaName(entitySchemaName) || config.miniPageSchemaName;

Т.о. в конфигурацию мини-карточки попадает название схемы первой зарегистрированной мини-карточки, хранящаяся в Terrasoft.ModuleUtils.moduleStructure[entitySchemaName].miniPageSchema, а не переданное в параметре miniPageSchemaName значение. И как следствие выводится не та мини-карточка.
Вопрос: Не было ли целесообразней поменять местами this.getSchemaName(entitySchemaName) и config.miniPageSchemaName в строке

var schemaName = this.getSchemaName(entitySchemaName) || config.miniPageSchemaName;

или передавать в this.getSchemaName(entitySchemaName) вторым аргументом тип создаваемой записи?

Решил эту проблему подменой значения Terrasoft.ModuleUtils.moduleStructure[entitySchemaName].miniPageSchema на нужное мне.
Но как-то это костыльно...
Если у кого есть другие варианты реализации, буду благодарен за подсказку

И ещё проблема, после сохранения и закрытия мини-карточки не происходит обновление реестра раздела, подскажите, что пропустил.

Добавьте в схеме раздела

        // Обновление данных реестра.
        this.reloadGridData();

Пример можно глянуть здесь
https://academy.terrasoft.ru/documents/technic-sdk/7-8/dataservice-sozd…

А какой механизм реализован в р. Активности и р. Лиды? Ведь там реестр обновляется.

Честно говоря, не знаю. Надо смотреть :)

А зачем тогда изобретать велосипед с reloadGridData?
Тоже, к сожалению, концов не нашёл в р. Активности и р. Лиды.

Вопрос решил. В sectionV2 подписался на сообщение ReloadDashboardItems.

 subscribeSandboxEvents: function() {
                this.callParent(arguments);
                this.sandbox.subscribe("ReloadDashboardItems", function(){
                    this.reloadGridData()
                }, this);
            }
Показать все комментарии