Работа с деталью на странице портала в режиме создания
Всем добрый день!
Друзья, подскажите, пожалуйста, кто-нибудь работал с деталью на странице портала самообслуживания?
Для бандла service сейчас пытаюсь реализовать деталь с редактируемым реестром, чтобы можно было указывать в заявке несколько значений из справочника. Всем известно, что, когда пытаешься добавить в деталь новое значение, то вызывается метод, который сохраняет родительскую запись, так как запись детали обязательно должна быть связана с родительской записью. Можно как-то добавить в деталь запись, не вызывая метод, который сохраняет родителя, но при этом, чтобы после сохранения родителя, в детали все корректно связалось? Как-то же это реализовано для файлов например.
Нравится
Как отключить логику сохранения раздела при добавлении на деталь, обсуждают тут, но для момента до первого сохранения так не подойдёт, данные нужно где-то хранить.
В средствах связи, схеме ContactCommunicationDetailV2 добавленные и удалённые складываются в две коллекции Collection и DeletedItems и при сохранении из них извлекаются и идут на сервер одним составным запросом:
deleteItem: function(item) {
var deletedItems = this.get("DeletedItems");
var collection = this.get("Collection");
collection.removeByKey(item.get("Id"));
deletedItems.addItem(item);
},
addItem: function(tag) {
if (this.get("IsDetailCollapsed")) {
return;
}
var communicationTypes = this.get("CommunicationTypes");
var communicationType = communicationTypes.get(tag);
var newItem = this.Ext.create("Terrasoft.BaseCommunicationViewModel", {
entitySchema: this.entitySchema,
columns: this.columns
});
newItem.set("CommunicationTypes", communicationTypes);
newItem.sandbox = this.sandbox;
newItem.setDefaultValues(function() {
newItem.set("CommunicationType", {
value: communicationType.get("Id"),
displayValue: communicationType.get("Name")
});
newItem.set("Contact", {
value: this.get("MasterRecordId")
});
var itemKey = newItem.get("Id");
var collection = this.get("Collection");
collection.add(itemKey, newItem);
this.changeCardPageButtonsVisibility(true);
}, this);
return newItem;
},
...
getDeleteItemsQueries: function() {
var deletedItems = this.get("DeletedItems");
var deleteQueries = [];
deletedItems.each(function(item) {
var primaryColumnValue = item.get(item.primaryColumnName);
var deleteQuery = item.getDeleteQuery();
deleteQuery.enablePrimaryColumnFilter(primaryColumnValue);
deleteQueries.push(deleteQuery);
}, this);
return deleteQueries;
},
getSaveItemsQueries: function() {
var collection = this.get("Collection");
var saveQueries = [];
collection.each(function(item) {
if (item.isChanged() && item.validate()) {
saveQueries.push(item.getSaveQuery());
}
}, this);
return saveQueries;
},
...
save: function() {
var restrictionsQuery = this.getSaveRestrictionsQuery();
var queries = restrictionsQuery ? [restrictionsQuery] : [];
var saveQueries = this.getSaveItemsQueries();
queries = queries.concat(saveQueries);
var deleteQueries = this.getDeleteItemsQueries();
queries = queries.concat(deleteQueries);
if (Ext.isEmpty(queries)) {
this.publishSaveResponse({
success: true
});
return true;
}
var batchQuery = Ext.create("Terrasoft.BatchQuery");
Terrasoft.each(queries, function(query) {
batchQuery.add(query);
}, this);
batchQuery.execute(this.onSaved, this);
return true;
},
onSaved: function(response) {
var message = response.ResponseStatus && response.ResponseStatus.Message;
if (response.success && !message) {
var deletedItems = this.get("DeletedItems");
var collection = this.get("Collection");
collection.each(function(item) {
item.isNew = false;
item.changedValues = null;
}, this);
deletedItems.clear();
this.publishSaveResponse(response);
} else {
this.publishSaveResponse({
success: false,
message: this.getValidationMessage(message)
});
}
},