Вопрос

Как передать информацию из модального окна?

Ответ

1) Создайте страницу модального окна - «Схема модели представления карточки», без указания родительской схемы:

define("UsrMyModalPage", ["ModalBox"], function(ModalBox) {
	return {
		attributes: {
			"TestText": {
				dataValueType: Terrasoft.DataValueType.TEXT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			}
		},
		messages: {
			"DataFromModal": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		},
		methods: {
			init: function(callback, scope) {
				this.callParent(arguments);
			},
			onRender: function() {
			},
			onCloseButtonClick: function() {
				this.sandbox.publish("DataFromModal", { test: this.get("TestText") }, [this.sandbox.id]);
				ModalBox.close();
			}
		},
		diff: [
			{
				"operation": "insert",
				"name": "MyContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyContainer",
				"propertyName": "items",
				"name": "MyGridContainer",
				"values": {
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyGridContainer",
				"propertyName": "items",
				"name": "TestText",
				"values": {
					"bindTo": "TestText",
					"caption": "Test text",
					"layout": {"column": 0, "row": 0, "colSpan": 10}
				}
			},
			{
				"operation": "insert",
				"parentName": "MyGridContainer",
				"name": "CloseButton",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"style": Terrasoft.controls.ButtonEnums.style.BLUE,
					"click": {bindTo: "onCloseButtonClick"},
					"markerValue": "CloseButton",
					"caption": "OK",
					"layout": { "column": 0, "row": 1, "colSpan": 3 }
				}
			}
		]
	};
});

2) Создайте модуль модального окна - «Модуль», с одной единственной зависимостью на вышесозданную страницу.

define("UsrMyModalModule", ["ModalBox", "BaseSchemaModuleV2"],
		function(ModalBox) {
	Ext.define("Terrasoft.configuration.UsrMyModalModule", {
		extend: "Terrasoft.BaseSchemaModule",
		alternateClassName: "Terrasoft.UsrMyModalModule",
		/**
		 * @inheritDoc Terrasoft.BaseSchemaModule#generateViewContainerId
		 * @overridden
		 */
		generateViewContainerId: false,
		/**
		 * @inheritDoc Terrasoft.BaseSchemaModule#initSchemaName
		 * @overridden
		 */
		initSchemaName: function() {
			this.schemaName = "UsrMyModalPage";
		},
		/**
		 * @inheritDoc Terrasoft.BaseSchemaModule#initHistoryState
		 * @overridden
		 */
		initHistoryState: Terrasoft.emptyFn,
	});
	return Terrasoft.UsrMyModalModule;
});

3) Создайте замещающую страницу редактирования для добавления созданного модального окна:

define("ContactPageV2", ["ContactPageV2Resources", "GeneralDetails", "ModalBox"],
function(resources, GeneralDetails, ModalBox) {
	return {
		entitySchemaName: "Contact",
		messages: {
			"DataFromModal": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		details: /**SCHEMA_DETAILS*/{
		}/**SCHEMA_DETAILS*/,
		methods: {
			subscribeSandboxEvents: function() {
				this.callParent(arguments);
				this.sandbox.subscribe("DataFromModal", function(arg) {
					console.log("msg from modal: " + arg.test);
				}, this, [this.sandbox.id + "_" + "UsrMyModalModule"]);
			},
			loadMyModal: function() {
				var sandbox = this.sandbox;
				var config = {
					heightPixels: 420,
					widthPixels: 750
				};
				var moduleName = "UsrMyModalModule";
				var moduleId = sandbox.id + "_" + moduleName;
				var renderTo = ModalBox.show(config, function() {
					sandbox.unloadModule(moduleId, renderTo);
				});
				sandbox.loadModule(moduleName, {
					id: moduleId,
					renderTo: renderTo
				});
			},
			onMyClick: function() {
				this.loadMyModal();
			},
			onEntityInitialized: function() {
				this.callParent(arguments);
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "CombinedModeActionButtonsCardContainer",
				"propertyName": "items",
				"name": "MainContactButton",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"caption": "пыщь-пыщь",
					"click": {"bindTo": "onMyClick"}
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Нравится

Поделиться

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

Очень полезная публикация, спасибо.

Хочу обратить внимание на строку "Создайте страницу модального окна - «Схема модели представления карточки», без указания родительской схемы:". У меня в 14-ой версии без указания родительской схемы схема от модуля не подгружалась. Указал зависимость от BaseEntityPage - всё заработало.

Спасибо за уточнение. Судя по упоминаниям BaseEntityPage в обзорах обновлений 7.8.1 и 7.8.2, это изменение могло произойти уже довольно давно.

Товарищи, это не работает :( Есть актуальный пример?

Надежда, ещё пример есть в комментариях к этой теме. А что именно у Вас не работает в этом?

Добрый день! Возможно создать кастомное модальное окно на портале?

Денис Суров,

 

Добрый день.

Для портальных страниц можно использовать эту же инструкцию - делаете замещение необходимой вам портальной страницы (например PortalCasePage) и добавляете код из п.3 данной публикации.

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

Задача

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

Решение

Для отключения фильтра необходимо создать замещающий обьект MobileApplicationManifestDefaultWorkplace (создается автоматически, если поменять колонки в мастере мобильного приложения) и заполнить следующим кодом:

{
    "SyncOptions": {
        "SysSettingsImportConfig": [],
        "ModelDataImportConfig": [
            {
                "Name": "Opportunity",
                "SyncFilter": null
            }
        ]    
    },
    "Modules": {},
    "Models": {}
}

После этого сохранить манифест, очистить кэш в мобильном приложении.

Необходимые условия

Права администратора, bpm'online 7.6+

Нравится

Поделиться

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

Вопрос

Как синхронизировать bpm'online 7.5 с версией мобильного приложения? У меня такая  ошибка :

Изображение удалено.

Ответ

Чтобы синхронизировать продажи bpm'online с мобильной версией, вам необходимо загрузить приложение из googlePlay или AppStore. В поле адрес сервера bpm'online вам нужно ввести имя веб-сайта вашей системы bpm'online. Например. если адрес моей системы bpm'online равен sales-omni-demo.bpmonline.com, тогда мне нужно указать точно такой же адрес в этой строке, также предоставляя мой логин и пароль.

Насколько я вижу на скриншоте, вы указали неверный адрес сервера bpm'online. Он должен всегда включать bpm'online.com. Поэтому попробуйте указать правильный адрес сервера, и вы сможете получить доступ к мобильному приложению.

Кстати, вы можете настроить Mobile App в версии bpm'online 7.5, вы можете настроить списки и страницы разделов так, как вы хотите, чтобы они отображались на мобильном устройстве. Перейдите в раздел «Конструктор системы», прокрутите страницу вниз и откройте мастер мобильных приложений, чтобы выполнить необходимые настройки.

Нравится

Поделиться

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

Скрипт:

DECLARE @TableName NVARCHAR(250)
SET @TableName = 'Activity' -- ЗДЕСЬ ВПИСЫВАЕТСЯ НАЗВАНИЕ ТАБЛИЦЫ
PRINT 'Start process ' + @TableName
EXEC ('
DELETE FROM Sys' + @TableName + 'Right;
DECLARE @TableSchemaUId UNIQUEIDENTIFIER;
SELECT top 1 @TableSchemaUId = UId FROM SysSchema WHERE [Name] = ''' + @TableName + '''
                                                        and [ExtendParent] = ''0''
/* Полный доступ автору записи */
INSERT INTO Sys' + @TableName + 'Right (CreatedOn, ModifiedOn, RecordId,
    SysAdminUnitId, Operation, RightLevel, Position, SourceId)
SELECT GETUTCDATE(), GETUTCDATE(), o.Id, au.Id, op.Id, 2, 0, ''{4220CFBA-0514-44CE-ADD0-109B54B52084}'' -- Источник: Автор
FROM ' + @TableName + ' o
JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById)
CROSS JOIN (SELECT 0 Id UNION ALL SELECT 1 UNION ALL SELECT 2) op -- Операции: Чтение, Изменение, Удаление
WHERE NOT EXISTS(SELECT * FROM Sys' + @TableName + 'Right WHERE RecordId = o.Id AND
    SysAdminUnitId = au.Id AND Operation = op.Id);
/* Копирование прав по умолчанию */
INSERT INTO Sys' + @TableName + 'Right (CreatedOn, ModifiedOn, RecordId,
    SysAdminUnitId, Operation, RightLevel, Position, SourceId)
SELECT DISTINCT GETUTCDATE(), GETUTCDATE(), o.Id, dr.GranteeSysAdminUnitId,
    dr.Operation, dr.RightLevel, 0, ''{F41E0268-E324-4228-9E9E-5CB7CC906398}'' -- Источник: По умолчанию
FROM ' + @TableName + ' o
JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById)
LEFT JOIN SysUserInRole uir ON (uir.SysUserId = au.Id)
JOIN SysEntitySchemaRecordDefRight dr ON (dr.AuthorSysAdminUnitId = uir.SysRoleId OR dr.AuthorSysAdminUnitId = au.Id OR
dr.AuthorSysAdminUnitId IN (SELECT Id FROM SysAdminUnit WHERE ParentRoleId IS NULL))
WHERE dr.SubjectSchemaUId = @TableSchemaUId AND
    NOT EXISTS(SELECT * FROM Sys' + @TableName + 'Right WHERE RecordId = o.Id AND
        SysAdminUnitId = dr.GranteeSysAdminUnitId AND Operation = dr.Operation);
')
PRINT @TableName + ' was processed'

 

Нравится

Поделиться

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

Добрый день. Спасибо. Отличный скрипт. Думаю, стоит приложить файлом, Т.к. при копировании почти все попадает в одну строку.

Я немного модифицировал скрипт.

Таким образом можно одним скриптом пробегаться по всем нужным объектам (список задается во второй строке скрипта).

DECLARE @myTableVariable TABLE (name varchar(250))
insert into @myTableVariable values('Account'),('Contact') --объекты для обновления прав добавлять сюда в аналогичном формате.
 
DECLARE @TableName VARCHAR(250)
DECLARE db_cursor CURSOR FOR SELECT name from @myTableVariable
OPEN db_cursor
 
FETCH NEXT FROM db_cursor INTO @TableName  
WHILE @@FETCH_STATUS = 0 
BEGIN 
PRINT 'Start process ' + @TableName
EXEC 
('
DELETE FROM Sys' + @TableName + 'Right;
DECLARE @TableSchemaUId UNIQUEIDENTIFIER;
SELECT @TableSchemaUId = UId FROM SysSchema WHERE [Name] = ''' + @TableName + '''
/* Полный доступ автору записи */
INSERT INTO Sys' + @TableName + 'Right (CreatedOn, ModifiedOn, RecordId,
    SysAdminUnitId, Operation, RightLevel, Position, SourceId)
SELECT GETUTCDATE(), GETUTCDATE(), o.Id, au.Id, op.Id, 2, 0, ''{4220CFBA-0514-44CE-ADD0-109B54B52084}'' -- Источник: Автор
FROM ' + @TableName + ' o
JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById)
CROSS JOIN (SELECT 0 Id UNION ALL SELECT 1 UNION ALL SELECT 2) op -- Операции: Чтение, Изменение, Удаление
WHERE NOT EXISTS(SELECT * FROM Sys' + @TableName + 'Right WHERE RecordId = o.Id AND
    SysAdminUnitId = au.Id AND Operation = op.Id);
/* Копирование прав по умолчанию */
INSERT INTO Sys'+@TableName+'Right (CreatedOn, ModifiedOn, RecordId,
    SysAdminUnitId, Operation, RightLevel, Position, SourceId)
SELECT DISTINCT GETUTCDATE(), GETUTCDATE(), o.Id, dr.GranteeSysAdminUnitId,
    dr.Operation, dr.RightLevel, 0, ''{F41E0268-E324-4228-9E9E-5CB7CC906398}'' -- Источник: По умолчанию
FROM '+@TableName+' o
JOIN SysAdminUnit au ON (au.ContactId = o.CreatedById)
LEFT JOIN SysUserInRole uir ON (uir.SysUserId = au.Id)
JOIN SysEntitySchemaRecordDefRight dr ON (dr.AuthorSysAdminUnitId = uir.SysRoleId OR dr.AuthorSysAdminUnitId = au.Id OR
dr.AuthorSysAdminUnitId IN (SELECT Id FROM SysAdminUnit WHERE ParentRoleId IS NULL))
WHERE
	exists (
		select 1 from SysSchema where Name='''+@TableName+'''
		and dr.SubjectSchemaUId=UId
	)  AND
    NOT EXISTS(SELECT * FROM Sys'+@TableName+'Right WHERE RecordId = o.Id AND
        SysAdminUnitId = dr.GranteeSysAdminUnitId AND Operation = dr.Operation);
')
PRINT @TableName + ' was processed'
FETCH NEXT FROM db_cursor INTO @TableName 
 
END
CLOSE db_cursor  
DEALLOCATE db_cursor 

 

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

Вопрос

Как реализовать подсказку (tips) на детали "Связи"

Изображение удалено.

Ответ

Для детали связей подсказки формируются основе метода onGetPageTips(), который вызывается в схеме BasePageV2:

Изображение удалено.

Для добавления пользовательских подсказок в разделе «Активности» необходимо:

  1. заместить АctivityPageV2
  2. добавить локализированную строку
  3. переопределить метод onGetPageTips()

Изображение удалено.

Изображение удалено.

В базовой конфигурации Вы можете посмотреть пример кода в схеме ContactPageV2 (UIv2):

{
    "operation": "insert",
    "parentName": "Header",
    "propertyName": "items",
    "name": "Owner",
    "values": {
        "layout": {"column": 11, "row": 2, "colSpan": 13},
        "tip": {
            "content": {"bindTo": "Resources.Strings.OwnerTip"}
        }
    }
},

 

Нравится

Поделиться

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

Вопрос

Увеличить значение параметра MaxEntityRowCount

Ответ

Для решения задачи необходимо установить значение параметра MaxEntityRowCount (по умолчанию 10000).

Параметр находится в файле Web.config (в папке Terrasoft.WebApp)

Нравится

Поделиться

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

Симптомы

При отсылке e-mail из процесса выдается следующая ошибка с продуктива. 

Этот же процесс на платформе разработки работает безукоризненно.

Terrasoft.Mail.SmtpException: Socket connection has been refused by remote host. InnerException message follows: No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:25 ---> MailBee.MailBeeSocketRefusedException: Socket connection has been refused by remote host. InnerException message follows: No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:25 ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it xxx.xxx.xxx.xxx:25

Причина

Ошибка связана с элементом "Отправка email".

Изображение удалено.

Решение

Необходимо заполнить поле "От кого". Значение необходимо выбрать из справочника "Настройка синхронизации с почтовым ящиком".

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

Также рекомендуем сделать один почтовый ящик общим. Для того, чтобы сделать почтовый ящик общим следует:

- настроить в профиле пользователя почтовый ящик. Пользователь должен входить в роль системных администраторов.

- перейти в меню [Дизайнер системы - Права доступа на операции]. Добавить права пользователю (Важно! Не роли, именно пользователю) на операции CanUseSharedMailBox, CanManageSharedMailboxes. Очистить кэш браузера и повторно выполнить авторизацию на сайте.

В результате выполнения этого пункта в настройках почтового ящика (в профиле) появится возможность установить признак "Разрешить многопользовательскую работу". Установить этот признак. 

- выбрать добавленный ящик и перейти в меню [Права доступа]. Убедиться, что у всех сотрудников компании есть доступ к этому ящику.

Нравится

Поделиться

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

Вопрос

Как правильно сохранить запрос, чтобы это было разовое изменение?

Ответ

Скрипты в системе не выполняются автоматически. Для их применения необходимо нажать на своем скрипте правой кнопкой мишки и выбрать пункт "Установить выбранные элементы". Скриншот для наглядности:

Изображение удалено.

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

Нравится

Поделиться

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

ОТЛАДКА НА УСТРОЙСТВЕ

  • Установить «debug» сборку приложения на android девайс 
  • Подключить к компьютеру, разрешить отладку для этого компьютера
  • Запустить Chrome
  • Подключится к устройству:

Изображение удалено.

Для просмотра наполнения таблиц в офлайн режиме можно в консоле выполнять такие запросы:

Terrasoft.Sql.DBExecutor.executeSql({sqls: ["Select * FROM Activity WHERE Id <> '28062807-98b1-40a6-b023-bc6723818506' "], success: function(result) {console.log(result[0].rows.item(0));}})

Изображение удалено.

Нравится

Поделиться

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

Симптомы

Bpm'online mobile bug report

Type: Terrasoft.SourceCodeException 

Message: Uncaught TypeError: Cannot read property 'sort' of undefined 

AdditionalInfo: Script: file:///storage/emulated/0/BPMonline700/AppStructure/rev_0/src/MobileLeadModuleConfig.js?hash=058621bb-36bc-409c-95da-167a0401cfa9%0D%0A%09Line: 160

Причина

Неправильно собрана сборка

Решение

Выполнить скрипт

INSERT INTO SysLookup (Id, Name, IsSimple, SysEntitySchemaUId)
VALUES ('FFB52150-F36B-1410-4893-1C6F65E16A07', 'InformationSource', 1, 'D3E76DCB-EB9F-494B-B5D9-0643E5418BEB')

 

Нравится

Поделиться

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