Деталь с нестандартным функционалом

Добрый день.

Необходимо создать деталь для стандартного раздела. Но есть определенные требования к функционалу детали:

1. У детали нет страницы редактирования

2. Объект детали хранит следующие связи: Поле1 - связь с объектом стандартного раздела, Поле2 - связь с объектом из справочника "Продукты"

3. У объекта стандартного раздела есть ряд полей: Категория продукта, Тип продукта, Вид продукта.

4. При выборе действия "Добавить" у детали необходимо открыть страницу выбора продуктов, отфильтрованных в соответствии со значениями из п. 3 И после выбора некоего продукта добавить его в реестр детали.

Посдкажите, пожалуйста - в какую сторону смотреть.

Нравится

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

Первым приходит на ум такой алгоритм:

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.

Буду благодарен за консультацию.

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