При создании нового заказа выбрасывает обратно в раздел
Здравствуйте.
Система версии 7.10.1.1161
Есть карточка заказа и есть кастомная страница подборщика продуктов, которая открывается из карточки заказа по нажатию на специально созданную кнопку. Кастомная страница унаследована от BasePageV2 и привязана к entitySchema Order (то есть к тому же объекту, что и карточка заказа). На ней используется стандартная кнопка Закрыть. Все прекрасно работает, кроме случая когда подборщик открываем из карточки ново создаваемого заказа(add). В этом случае при нажатии Закрыть на кастомной странице выбрасывает обратно в раздел, а должно бы в карточку заказа.
Обратил внимание, что при добавлении нового заказа когда открывается карточка редактирования, то хеш все равно остается от раздела - SectionModuleV2/OrderSection (аналогично и во всех остальных разделах). Вероятно, в этом и есть причина, так как при нажатии Закрыть публикуется BackHistoryState. Ниже код, который используем для открытия карточки подборщика. Подскажите как добиться нужного эффекта, так как кейс с открытием подборщика из нового заказа и есть самый основной.
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
);
},
Нравится
пока заказ не сохранен - некуда возвращаться у заказа нет 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 }); },
Но это решение все равно несколько "корявое". Так как при создании нового заказа: карточка заказа. Открыть подборщик => Подборщик. Закрыть => Карточка Заказа. Закрыть => попдаем обратно в подборщик вместо раздела.