Добрый день.
Необходимо создать деталь для стандартного раздела. Но есть определенные требования к функционалу детали:
1. У детали нет страницы редактирования
2. Объект детали хранит следующие связи: Поле1 - связь с объектом стандартного раздела, Поле2 - связь с объектом из справочника "Продукты"
3. У объекта стандартного раздела есть ряд полей: Категория продукта, Тип продукта, Вид продукта.
4. При выборе действия "Добавить" у детали необходимо открыть страницу выбора продуктов, отфильтрованных в соответствии со значениями из п. 3 И после выбора некоего продукта добавить его в реестр детали.
Посдкажите, пожалуйста - в какую сторону смотреть.
Нравится
Первым приходит на ум такой алгоритм:
1. У детали таки есть страница редактирования, но она выполняет функцию "страницы выбора продуктов". С одним лукапом, и лейблом с подсказкой пользователю.
2. Необходимые для фильтрации данные из страницы, на деталь, для анализа и фильтрации лукапа, необходимо получать сообщениями(песочница, sandbox) при init детали, и записывать в невидимые поля детали, или атрибуты.
держите :wink:
define('AnPlaceInOpportunityDetail', ['terrasoft', 'AnPlaceInOpportunityDetailResources',"ConfigurationConstants", 'ConfigurationEnums', "RightUtilities"], function(Terrasoft, Resources, ConfigurationConstants, enums, RightUtilities) { return { //entitySchemaName: 'AnPlaceInOpportunity', mixins: {}, attributes: {}, diff: /**SCHEMA_DIFF*/[ { //заменяем обработчик нажатия на + "operation": "merge", "name": "AddRecordButton", "values": { "click": {bindTo: "onAddRecordButtonClick"}, "menu": [] } } ]/**SCHEMA_DIFF*/, methods: { onAddRecordButtonClick: function() { //сначала сохраняем основную карточку, если это добавление/копирование var cardState = this.sandbox.publish("GetCardState", null, [this.sandbox.id]); var isNew = (cardState.state === enums.CardStateV2.ADD || cardState.state === enums.CardStateV2.COPY); if (isNew) { var args = { isSilent: true, messageTags: [this.sandbox.id] }; this.sandbox.publish("SaveRecord", args, [this.sandbox.id]); return; } this.prepareLookupConfig(); }, prepareLookupConfig: function() { var filters = Ext.create("Terrasoft.FilterGroup"); var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "AnPlace" }); var IdsExists = []; esq.addColumn("Id"); esq.addColumn("AnName"); esq.filters.addItem(Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "[AnPlaceInOpportunity:AnPlace:Id].AnOpportunity",this.get("MasterRecordId"))); esq.getEntityCollection(function(result) { //выбираем те записи, что уже были добавлены, что не показывать их в справочнике if (result.success) { var existFilter = Ext.create("Terrasoft.FilterGroup"); var notExistFilter = Ext.create("Terrasoft.FilterGroup"); if (result.collection.getItems().length > 0) { // перебираем уже добавленные записи и добавляем их в фильтр // на самом деле, вместо запроса и перебора надо просто придумать какой-то зубодробительный фильтр var IdsExists = result.collection.getItems(); var placesId = []; Terrasoft.each(IdsExists, function(item) { if (item.get("Id")) { placesId.push(item.get("Id")); } }, this); existFilter.addItem(Terrasoft.createColumnInFilterWithParameters("Id", placesId)); notExistFilter = Terrasoft.createNotExistsFilter("Id", existFilter); } var config = { // конфиг для справочника entitySchemaName: "AnPlace", // объект справочника multiSelect: true, // множественный выбор в справочнике columns: ["AnName"], // отображаемые колонки на странице справочника hideActions: true // скрываем действия Добавить, изменить и т.д. в окне справочника }; config.filters = notExistFilter; this.openLookup(//открываем справочник config, this.addCallback, // функция-обработчик ответа от окна справочника this // контекст для функции-обработчика ); } }, this); }, addCallback: function(args){ this.showBodyMask(); var Ids = args.selectedRows.getKeys(); // получаем массив ИД выбранных записей //var startDate = ''; //this.sandbox.subscribe("StartDate", function() { //},this,null); var bq = Ext.create("Terrasoft.BatchQuery"); // пакетный запрос this.Terrasoft.each(Ids, function(item) { // перебираем выбранные записи - для каждой создает Insert и добавляем в BatchQuery var insert = Ext.create("Terrasoft.InsertQuery", { rootSchemaName: "AnPlaceInOpportunity" }); var newGuid = Terrasoft.generateGUID(); var opportunity = this.get("MasterRecordId"); insert.setParameterValue("Id", newGuid , Terrasoft.DataValueType.GUID); insert.setParameterValue("AnOpportunity", opportunity, Terrasoft.DataValueType.GUID);// значения по-умолчанию для добавляемых записей insert.setParameterValue("AnPlace", item, Terrasoft.DataValueType.GUID); bq.add(insert); }, this); // выполняем запрос bq.execute(function(result) { // обработчик if (result.success) { this.hideBodyMask(); // скрыть иконку загрузки this.reloadGridData(); // обнвоить деталь, чтобы добавленные записи отобразились } else console.log("error"); }, this); }, addRecordOperationsMenuItems: function(toolsButtonMenu) { // убираем действия Копировать и Изменить, оставляем Удалить /*var copyRecordMenuItem = this.getCopyRecordMenuItem(); if (copyRecordMenuItem) { toolsButtonMenu.addItem(copyRecordMenuItem); } var editRecordMenuItem = this.getEditRecordMenuItem(); if (editRecordMenuItem) { toolsButtonMenu.addItem(editRecordMenuItem); }*/ var deleteRecordMenuItem = this.getDeleteRecordMenuItem(); if (deleteRecordMenuItem) { toolsButtonMenu.addItem(deleteRecordMenuItem); } } }, messages: {} }; });
Прощу прощения, на радостях не обратил внимания, что приведенный код для версии 7.6
У нас версия 7.2 и данный код не работает. И вообще возникла проблема с элементарным обменом сообщениями между деталью и основной карточкой.
Простая задача: в зависимости от чекбокса на основной карточке разрешить или запретить добавление элементов в деталь.
1. В коде основной карточки:
добавим чекбокс на страницу
{ type: Terrasoft.core.enums.ViewModelSchemaItem.ATTRIBUTE, name: 'IsProductChoose', columnPath: 'IsProductChoose', dataValueType: Terrasoft.DataValueType.BOOLEAN, visible: true, customConfig: { click: { bindTo: "IsProductChooseClicked" } } }
обработчик изменения чекбокса
this.methods.IsProductChooseClicked = function() { var args = { param: this.get("IsProductChoose") }; sandbox.publish( "IsProductChooseChanged", args, [sandbox.id] ); };
2. В коде детали:
изменим конфиг выпадающего меню
this.modifyUtilsButton = function(utilsButton) { var utilsMenuItems = utilsButton.menu.items; utilsMenuItems[1].caption = "Выбрать продукты"; utilsMenuItems[1].enabled = {bindTo: "isProductChooseForSelection"}; return utilsButton; };
обработчик "включить/выключить пункт меню"
this.methods.isProductChooseForSelection = function() { this.sandbox.subscribe("IsProductChooseChanged", function(arg) { console.log(arg); }, this, [this.getSenderSandboxId()]); }; this.methods.getSenderSandboxId = function() { return this.sandbox.id.replace('_detail_SynchronizedProduct', ''); };
Однако при открытии карточки получаю ошибку в консоли браузера:
Uncaught Terrasoft.UnsupportedTypeException: Message IsProductChooseChanged is not defined in undefined module
К сожалению в документации не описано как работать с событиями через sandbox.
Буду благодарен за консультацию.