Вопрос

Подскажите как реализовать следующую задачу: есть преднастроенная страница с добавленной на нее деталью Контактов (Физ. лиц). Необходимо иметь возможность выделить конкретную запись грида детали и получить ее ID в основную страницу. Как это лучше реализовать?

Ответ

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



Для начала необходимо в коде карточки и детали добавить адресное сообщение с одним и тем же названием, но в карточке с типом "Подписка", а в детали - с типом "Публикация". Например, для карточки редактирования:

 

messages: {
    "GetContactDetailActiveRecordId": {
        mode: Terrasoft.MessageMode.PTP,
        direction: Terrasoft.MessageDirectionType.SUBSCRIBE
    }
}

Для детали точно так же, только в свойстве direction необходимо указать

Terrasoft.MessageDirectionType.PUBLISH

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

 

init: function() {
    this.callParent(arguments);
    this.sandbox.subscribe("GetContactDetailActiveRecordId", function(recordId) {
        this.set("ContactDetailActiveRecordId", recordId);
    }, this, [contactDetailSandboxId]);
}

Значение contactDetailSandboxId Вам необходимо определить самостоятельно (оно формируется в зависимости от названия детали). В коде детали оно хранится в свойстве this.sandbox.id.



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

 

onButtonClick: function() {
    this.sandbox.publish("GetContactDetailActiveRecordId", this.get("ActiveRow"), [this.sandbox.id]);
}

 

Нравится

Поделиться

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

Вопрос

Как добавить кнопку в коммуникационную панель?

Ответ

  1. Заместить модуль «CommunicationPanel» в котором будет описана новая кнопка.
define("CommunicationPanel", ["terrasoft", "CommunicationPanelHelper"],
	function(Terrasoft, CommunicationPanelHelper) {
		return {
			messages: {
				"SelectCommunicationPanelItem": {
					"mode": Terrasoft.MessageMode.PTP,
					"direction": Terrasoft.MessageDirectionType.SUBSCRIBE
				}
			},
			attributes: {
				"UsrMyMenuActive": {
					"dataValueType": Terrasoft.DataValueType.BOOLEAN,
					"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					"value": false
				},
				"UsrMyMenuCounter": {
					"dataValueType": Terrasoft.DataValueType.TEXT,
					"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					"value": ""
				},
				"UsrMyMenuVisible": {
					"dataValueType": Terrasoft.DataValueType.BOOLEAN,
					"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					"value": true
				}
			},
			methods: {
				getPanelItemConfig: function(moduleName) {
					var config = this.callParent(arguments);
					if (moduleName !== "UsrMyMenuModule") {
						return config;
					}
					return Ext.apply(config, {
						keepAlive: false
					});
				},
				selectItem: function(config) {
					this.set("SelectedMenuItem", config.selectedItem);
				},
				getUsrMyMenuImageConfig: function(itemTag) {
					return this.get("Resources.Images.VisaMenuIcon");
				},
				getUsrMyMenuCaption: function(itemTag) {
					return "test";
				}
			},
			diff: [
				{
					"operation": "insert",
					"index": 0,
					"parentName": "communicationPanelContent",
					"propertyName": "items",
					"name": "usrMyMenu",
					"values": {
						"tag": "UsrMyMenu",
						"visible": {"bindTo": "UsrMyMenuVisible"},
						"imageConfig": {"bindTo": "getUsrMyMenuImageConfig"},
						"caption": {"bindTo": "getUsrMyMenuCaption"},
						"generator": "CommunicationPanelHelper.generateMenuItem"
					}
				}
			]
		};
	});
  1. Создать модуль панели, в модуле должны быть обязательные сообщения, как и в ESNFeedModule:

RerenderModule – подписка, адресное.

InitModuleViewModel – подписка, адресное.

define("UsrMyMenuModule", [], function() {
	Ext.define("Terrasoft.configuration.UsrMyMenuModule", {
 
		extend: "Terrasoft.BaseSchemaModule",
		alternateClassName: "Terrasoft.UsrMyMenuModule",
 
		generateViewContainerId: false,
 
		initSchemaName: function() {
			this.schemaName = "UsrMyMenu";
		},
 
		initHistoryState: Terrasoft.emptyFn,
 
		init: function() {
			this.callParent(arguments);
			this.initMessages();
		},
 
		initMessages: function() {
			this.sandbox.subscribe("RerenderModule", function(config) {
				if (this.viewModel) {
					this.render(this.Ext.get(config.renderTo));
					return true;
				}
			}, this, [this.sandbox.id]);
		},
 
		createViewModel: function() {
			var viewModel = this.callParent(arguments);
			return viewModel;
		}
 
	});
	return Terrasoft.UsrMyMenuModule;
});

3. Создать схему представления карточки

define("UsrMyMenu", [], function() {
		return {
			mixins: {
			},
			messages: {
			},
			attributes: {
			},
			methods: {
				init: function(callback, scope) {
					this.callParent([function() {
						callback.call(scope);
					}, this]);
				},
				onTestClick: function() {
					alert(1);
				}
			},
			diff: [
				//MyMenu
				{
					"operation": "insert",
					"name": "MyMenu",
					"propertyName": "items",
					"values": {
						"generateId": false,
						"itemType": Terrasoft.ViewItemType.CONTAINER,
						"items": []
					}
				},
				//ShowNewMessagesButton
				{
					"operation": "insert",
					"name": "ShowNewMessagesButton",
					"parentName": "MyMenu",
					"propertyName": "items",
					"values": {
						"generateId": false,
						"itemType": Terrasoft.ViewItemType.BUTTON,
						"caption": "Test!",
						"click": {bindTo: "onTestClick"}
					}
				}
			]
		};
	});

Результат:

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

Нравится

Поделиться

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

Вопрос

Как сделать, чтобы колонка была ссылочной? Например, колонка "Контрагент" в разделе "Контакт".

Ответ

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

Пример реализации, можете посмотреть в MobileContactModuleConfig (раздел «Контакты»):

Terrasoft.sdk.RecordPage.configureColumn("Contact", "primaryColumnSet", "Account", {
    viewType: Terrasoft.ViewTypes.Preview
});
 

Нравится

Поделиться

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

Вопрос

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

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

Ответ

Данное поведение сортировки обусловлено тем, что поле [Номер] - текстовое, а правила сортировки текста отличаются от правил сортировки чисел. Для решения задачи сортировки, необходимо:

1. Создать замещающий объект [Договор] и добавить в него новую числовую колонку. Опубликовать объект.

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

2. Открыть замещающий объект [Договор] вновь, создать событие [Перед сохранением записи] ([ContractSaving]), перейти к процессу объекта ([Дополнительно] – [Открыть процесс]).

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

3. В процессе добавить [Событийный подпроцесс].

4. На подпроцессе разместить сигнал, в поведении сигнала указать сигнал - [ContractSaving].

5. За сигналом добавить скрипт-задачу с кодом:

int num = 0;
bool res = int.TryParse(Entity.Number, out num);
if (res == true)
{
    Entity.UsrNumber = num;
}
return true;

6. За скрипт-задачей разместить завершающий сигнал. Сохранить. Опубликовать процесс.

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

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

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

Для обновления всех старых записей системы и заполнения новой колонки значениями, в конфигурации необходимо добавить на закладке [SQL-сценарии] скрипт и выполнить его:

UPDATE Contract
SET UsrNumber = CONVERT(INT, Number)

Все это справедливо, если в поле номер пишутся номера без префикса.

Нравится

Поделиться

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

Вопрос

Как быстро сгенерировать код страницы для мобильного приложения

Можно использовать для:

  • Edit
  • Grid
  • Preview

Ответ

Выполнять в консоли браузера эмулятора 

(new Terrasoft.CodeGeneration.PageCodeGenerator({
    modelName: "Contact", 
    pageType: Terrasoft.PageTypes.Edit
})).generate()

В modelName указываем нужный объект

В pageType  указываем тип страницы: 

pageType: Terrasoft.PageTypes.Grid
pageType: Terrasoft.PageTypes.Edit
pageType: Terrasoft.PageTypes.Preview

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

В итоге получается:

Terrasoft.LastLoadedPageData = {
    controllerName: "Terrasoft.configuration.ContactEditPageController",
    viewXClass: "Terrasoft.configuration.ContactEditPageView"
};
 
Ext.define("Terrasoft.configuration.view.ContactEditPage", {
    extend: "Terrasoft.view.BaseEditPage",
    alternateClassName: "Terrasoft.configuration.ContactEditPageView",
    config: {
        id: "ContactEditPage"
    }
});
 
Ext.define("Terrasoft.configuration.controller.ContactEditPage", {
    extend: "Terrasoft.controller.BaseEditPage",
    alternateClassName: "Terrasoft.configuration.ContactEditPageController",
    statics: {
        Model: Contact
    },
    config: {
        refs: {
            view: "#ContactEditPage"
        }
    }
});

 

Нравится

Поделиться

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

Задача

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

Решение

Необходимо заменить метод PrepareEmployeeEditFilter схемы UserEditPage на следующий:

var filters = e.Filters;
filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.Equal},
    {"leftExpressionColumnPath", "[SysAdminUnit:Contact].Id"},
    {"aggregationType", AggregationTypeStrict.Count},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] {0}}});
filters.Add(new Dictionary<string, object> {
    {"comparisonType", FilterComparisonType.Equal},
    {"leftExpressionColumnPath", "Account.Type"},
    {"useDisplayValue", false},
    {"rightExpressionParameterValues", new object[] { new Guid("57412fad-53e6-df11-971b-001d60e938c6")}}});
e.ParametersValue.Add("hideButtons", true);

Где "57412fad-53e6-df11-971b-001d60e938c6" - айди таблицы AccountType соответствующий значению "Наша компания".

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

Для версии 7.4

Нравится

Поделиться

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

Вопрос

В каких таблицах базы данных  можно найти связь между Обращением и правами доступа на его чтение?

Ответ

Каждый объект имеет таблицу прав имеющую следующее имя Sys + объект + Right, (для обращения это будет SySCaseRight),в данную таблицу заносятся права с указанием SySAdminUnitId - идентификатор записи SySAdminUnit(таблица пользователей и групп). Таблица содержит поле RecorId - id записи к которой применяются права, Operation - операцию на которую выдаются права и RightLevel - уровень прав.

В SourceId находится Id из таблицы SysEntitySchemaRecRightSource, это источник раздавший права(Владелец, автор, Default)

Значения для RightLevel:

      0 - Deny

      1 - CanRead

      2 - CanEdit

Значения для Operation:

      0 - Чтение

      1 - Изменение

      2 - Удаление

Нравится

Поделиться

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

Вопрос

Как поменять местами кнопки? 

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

Ответ

Данное расположение с версии 7.8 изначально было задумано из-за того, что пользователь случайно («автоматически») удаляет запись.

В данном случае пользователь немного задумается, что именно он нажимает.

Данная функциональность реализована в схеме «GridUtilitiesV2» (пакет «NUI»). Метод называется «checkCanDeleteCallback».

Изображение удалено.Если Вы хотите поменять местами кнопки, то Вам необходимо заместить «BaseSectionV2» и скопировать метод «checkCanDeleteCallback» и поменять местами «Terrasoft.MessageBoxButtons.NO.returnCode» и «Terrasoft.MessageBoxButtons.YES.returnCode».

Нравится

Поделиться

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

Вопрос

Как добавить кнопку в реестр детали для активной строки?

Ответ

Можно реализовать следующим образом:

В скрипте детали в блок diff добавить дополнительные свойства для DataGrid (название и заголовок кнопки приведены в качестве примера):

{
        "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"
                        }
                ]
        }
}

После этого при выделении активной строки в детали должна появиться синяя кнопка с заголовком MyButton.

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

Далее в методах той же детали необходимо реализовать метод onActiveRowAction. Данный метод в качестве аргументов принимает тэг кнопки и значение ключевой колонки выделенной строки. Если необходимо получить какие-либо другие значения выделенной строки, можно вызвать метод this.getActiveRow(), который возвращает всю модель выделенной строки:

methods: {
        onActiveRowAction: function(buttonTag, primaryColumnValue) {
                if (buttonTag === "myAction") {
                        // весь код ниже можно убрать, он демонстрирует, что значения
                        // primaryColumnValue и activeRowId равны
                        var activeRow = this.getActiveRow();
                        var activeRowId = activeRow.get("Id");
                        console.log(primaryColumnValue);
                        console.log(activeRowId);
                        // дальше Ваша реализация
                        ...
                }
        },
        ...
}

 

Нравится

Поделиться

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

Вопрос

Установила в мобильном приложении Automatic Synchronization – Only through Wifi. Скажите, с какой периодичностью запускатся автоматическая синхронизация данных?

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

Ответ

Каждый раз при сворачивании приложения синхронизация происходит через 30 сек. И если пользователь активирует снова приложение эта синхронизация останавливается.

Примечание. Из-за специфики операционной системы на Iphone, может останавливать все процессы в фоне приблизительно через 3 минуты. Т.е. если синхронизация не успела завершится в фоне – то она по факту не прошла. 

Нравится

Поделиться

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