При создании нового заказа выбрасывает обратно в раздел

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

Система версии 7.10.1.1161
Есть карточка заказа и есть кастомная страница подборщика продуктов, которая открывается из карточки заказа по нажатию на специально созданную кнопку. Кастомная страница унаследована от BasePageV2 и привязана к entitySchema Order (то есть к тому же объекту, что и карточка заказа). На ней используется стандартная кнопка Закрыть. Все прекрасно работает, кроме случая когда подборщик открываем из карточки ново создаваемого заказа(add). В этом случае при нажатии Закрыть на кастомной странице выбрасывает обратно в раздел, а должно бы в карточку заказа.

Обратил внимание, что при добавлении нового заказа когда открывается карточка редактирования, то хеш все равно остается от раздела - SectionModuleV2/OrderSection (аналогично и во всех остальных разделах). Вероятно, в этом и есть причина, так как при нажатии Закрыть публикуется BackHistoryState. Ниже код, который используем для открытия карточки подборщика. Подскажите как добиться нужного эффекта, так как кейс с открытием подборщика из нового заказа и есть самый основной.

                                openProductSelector: function() {
                                        var orderId = this.get("PrimaryColumnValue") || this.get("Id");
                                       
                                        var defaultValues = [
                                                        {
                                                                name: "PrimaryColumnValue",
                                                                value: orderId
                                                        },
                                                        {
                                                                name: "UseSeparatedPageHeader",
                                                                value: true
                                                        }

                                                ];
                                       
                                        stateObj = {
                                                                        isSeparateMode: true,
                                                                        schemaName: "SelectProductInOrderPage",
                                                                        moduleId: "CardModuleV2_SelectProductInOrderPage",
                                                                        valuePairs: defaultValues,
                                                                        operation: "open",
                                                                        isInChain: false
                                                                };
                                        requestUrl = "CardModuleV2/SelectProductInOrderPage/";
                                       
                                        this.sandbox.publish("PushHistoryState", {
                                                hash: requestUrl,
                                                stateObj: stateObj
                                        });
                                },     

                                onProductSelectionButtonClick: function() {
                                        this.set("OpenselectProductPage", true);
                                        this.save({isSilent: true});
                                },

                onSaved: function (response, config) {
                    this.hideBodyMask();
                    if (!this.get("NextPrcElReady")) {
                        this.set("NextPrcElReady", response.nextPrcElReady);
                    }
                    if (config && config.isSilent) {
                        this.onSilentSaved(response, config);
                    } else {
                        var updateConfig = this.getUpdateDetailOnSavedConfig();
                        this.sandbox.publish("UpdateDetail", updateConfig, [this.sandbox.id]);
                        this.sendSaveCardModuleResponse(response.success);
                        if (this.get("IsInChain")) {
                            this.onProcessCardSaved();
                            return;
                        }
                        if (this.isNewMode()) {
                            this.onCloseCardButtonClick();
                        } else {
                            this.onProcessCardSaved(true);
                        }
                    }
                    this.set("Operation", Terrasoft.ConfigurationEnums.CardOperation.EDIT);
                    if (!this.destroyed) {
                        this.updateButtonsVisibility(false, { force: true });
                    }
                    this.set("IsChanged", this.isChanged());
                    this.subscribeOwner(config);
                    if (config && config.isSilent) {
                                                if(this.get("OpenselectProductPage")) {
                                                        this.set("OpenselectProductPage", false);
                                                        this.openProductSelector();
                                                }
                        return;
                    }
                    this.updateAmountAfterSave("ProductInProductsTab",
                        function () {
                            this.updateDetail({ detail: "ProductInResultsTab" });
                            this.updateOrderProductSummary();
                        },
                        this
                    );
                },

Нравится

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

пока заказ не сохранен - некуда возвращаться у заказа нет Id а стало быть и хеша не собрать.
В том числе и по этой причине при попытке что либо добавить в деталь на странице, ее карточка карточка предварительно принудительно сохраняется, т.к. если открыть в Chain карточку детали, то куда потом возвращаться :)

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

Илья, но я ведь и делаю save перед открытием. И делаю его silent - как раз как в случае с сохранением из детали. И this.set("Operation", Terrasoft.ConfigurationEnums.CardOperation.EDIT) тоже происходит в методе onSaved до открытия кастомной страницы (про этот "режим" вы говорите? или про silent save все же ?)

В более старых версиях помнится при добавлении новой записи был хеш вида CardModuleV2/OrderPageV2/add/recordId Почему от этого отказались - неясно.

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

this.isAddMode() 

там аккурат считывается значение этого атрибута.

PS:
зачастую просто надо предотвратить поведение при котором новая карточка закрывается при сейве, этот кейс решается именно так.

Илья, режим хранится как раз в атрибуте Operation. То есть он сменяется на EDIT до того как я открываю кастомную страницу. Проблема состоит именно в том, что при нажатии Закрыть на кастомной странице идет запрос BackHistoryState, а там - хеш раздела. Вот и идет вылет в раздел.

В общем, пока проблему обходим следующим путем:

1) На странице заказа перенесли вызов метода, отвечающего за открытие кастомной страницы подборщика, из onSaved в onSilentSaved, так как он вызывается до смены режима в атрибуте Operation
2) сам режим передаем в массиве defaultValues на кастомную страницу. Код выглядит теперь так

openProductSelector: function() {
	var orderId = this.get("PrimaryColumnValue") || this.get("Id");
	var operation = this.get("Operation");
 
	var defaultValues = [
			{
				name: "PrimaryColumnValue",
				value: orderId
			}, 
			{
				name: "UseSeparatedPageHeader",
				value: true
			},
			{
				name: "Operation",
				value: operation
			} 							
		];
 
	stateObj = {
					isSeparateMode: true,
					schemaName: "SelectProductInOrderPage",
					moduleId: "CardModuleV2_SelectProductInOrderPage",
					valuePairs: defaultValues,
					operation: "open",
					isInChain: false
				};
	requestUrl = "CardModuleV2/SelectProductInOrderPage/";
 
	this.sandbox.publish("PushHistoryState", {
		hash: requestUrl,
		stateObj: stateObj
	});
},	
 
onProductSelectionButtonClick: function() {
	this.set("OpenselectProductPage", true);
	this.save({isSilent: true});
},
 
 
onSilentSaved: function() {
	if(this.get("OpenselectProductPage")) {
		this.openProductSelector();
	this.set("OpenselectProductPage", false);
	} else {
		this.callParent(arguments);
	}
}  

3) на кастомной странице создали кнопку по виду идентичную кнопке Закрыть. Видимость этой кастомной кнопки прибиндили к isNewMode, а кнопки Закрыть к противоположному к isNewMode значению.
4) Метод обработчик нажатия на кастомную кнопку открывает наш заказа в режиме редактирования.

onBacktToOrderButtonClick: function() {
		var orderId = this.get("PrimaryColumnValue") || this.get("Id");
		var defaultValues = [
				{
					name: "PrimaryColumnValue",
					value: orderId
				}					
		];
 
		stateObj = {
						isSeparateMode: true,
						schemaName: "OrderPageV2",
						moduleId: "CardModuleV2_" + orderId + "_OrderPageV2",
						valuePairs: defaultValues,
						operation: "edit",
						isInChain: false
					};
		requestUrl = "CardModuleV2/OrderPageV2/edit/" + orderId;
 
		this.sandbox.publish("PushHistoryState", {
			hash: requestUrl,
			stateObj: stateObj
		});				
},

Но это решение все равно несколько "корявое". Так как при создании нового заказа: карточка заказа. Открыть подборщик => Подборщик. Закрыть => Карточка Заказа. Закрыть => попдаем обратно в подборщик вместо раздела.

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