Добрый день, форумчане.
Задача: сделать деталь "Продукты в продаже" в виде иерархии. За основу решил взять деталь "Структура организации" из раздела "Контрагенты".
Создал свой объект SuOpportunityProductInterest. В качестве родителя указал объект "Продукт в продаже ( Opportunity )". В него
добавил справочное поле SuParent, где в качестве справочника указал SuOpportunityProductInterest.
Создал свою деталь на основе объекта SuOpportunityProductInterest.
На странице детали SuOpportunityProductDetailV2 написал следующий код:
define("SuOpportunityProductDetailV2", [/*"terrasoft"*/], function(/*Terrasoft*/) {
return {
entitySchemaName: "SuOpportunityProductInterest",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
methods: {
/**
* Открывает страницу добавления детали
* @protected
* @overridden
* @param {String} editPageUId Значение колонки типа
* @param {Boolean} keepParentId (optional) Не удалять из DefaultValues элемент с ключем Parent
*/
addRecord: function(editPageUId, keepParentId) {
if (!keepParentId) {
var defaultValues = this.get("DefaultValues");
var result = this.Ext.Array.filter(defaultValues, function(item) {
return (item.name !== "SuParent");
}, this);
this.set("DefaultValues", result);
}
this.callParent(editPageUId);
},
/**
*Получает колонки, которые всегда выбираются запросом
*@protected
*@overridden
*@return {Object} Возвращает колонки, которые всегда выбираются запросом
*/
getGridDataColumns: function() {
var gridDataColumns = this.callParent(arguments);
if (!gridDataColumns.SuParent) {
gridDataColumns.SuParent = {
path: "SuParent"
};
}
return gridDataColumns;
},
prepareResponseCollection: function(collection) {
collection.each(function(item) {
var parent = item.get("SuParent");
var parentId = parent && parent.value;
if (parentId) {
item.set("SuParentId", parentId);
}
Terrasoft.each(item.columns, function(column) {
this.addColumnLink(item, column);
this.applyColumnDefaults(column);
}, this);
}, this);
},
getHideQuickFilterButton: function() {
return false;
},
getShowQuickFilterButton: function() {
return false;
},
updateDetail: function(config) {
config.reloadAll = true;
this.callParent([config]);
},
getAddChildElementButtonEnabled: function() {
return !this.Ext.isEmpty(this.getSelectedItems());
},
addChildElementRecord: function() {
var selectedItems = this.getSelectedItems();
if (this.Ext.isEmpty(selectedItems)) {
return;
}
var parentId = selectedItems[0];
var defaultValues = this.get("DefaultValues");
var result = this.Ext.Array.filter(defaultValues, function(item) {
return (item.name !== "SuParent");
}, this);
result.push({
name: "SuParent",
value: parentId
});
this.set("DefaultValues", result);
this.addRecord(null, true);
},
clearSelection: function() {
this.set("activeRow", null);
this.set("selectedRows", null);
},
onDeleteAccept: function() {
var selectedRows = this.getSelectedItems();
var batch = this.Ext.create("Terrasoft.BatchQuery");
Terrasoft.each(selectedRows, function(recordId) {
this.deleteItem(recordId, batch, this);
}, this);
if (batch.queries.length > 0) {
batch.execute(this.onDeleted, this);
}
},
onDeleted: function(response) {
if (response && response.success) {
this.clearSelection();
} else {
this.showConfirmationDialog(
this.get("Resources.Strings.OnDeleteError"));
}
},
deleteItem: function(recordId, batch, scope) {
var grid = scope.getGridData();
var toDelete = new Terrasoft.Collection();
grid.each(function(item) {
var parent = item.get("SuParent");
if (parent && parent.value === recordId) {
toDelete.add(item);
}
}, grid);
Terrasoft.each(toDelete.getItems(), function(item) {
this.deleteItem(item.get("Id"), batch, this);
}, scope);
if (grid.find(recordId)) {
var selfDelete = grid.get(recordId);
grid.remove(selfDelete);
var query = this.Ext.create("Terrasoft.DeleteQuery", {
rootSchema: scope.entitySchema
});
var filter = Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Id", recordId);
query.filters.addItem(filter);
batch.add(query);
}
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"type": "listed",
//включает иерархичность реестра детали
"hierarchical": true,
"hierarchicalColumnName": "SuParent"
}
},
{
"operation": "merge",
"name": "AddRecordButton",
"values": {
visible: false
}
},
{
"operation": "insert",
"name": "AddRecord",
"parentName": "Detail",
"propertyName": "tools",
"index": 1,
"values": {
itemType: Terrasoft.ViewItemType.BUTTON,
menu: [],
"imageConfig": {"bindTo": "Resources.Images.AddButtonImage"},
// "caption": {"bindTo": "Resources.Strings.AddButtonCaption"},
"visible": {"bindTo": "getToolsVisible"}
}
},
{
"operation": "insert",
"name": "AddParentRecordButton",
"parentName": "AddRecord",
"propertyName": "menu",
"values": {
"caption": {"bindTo": "Resources.Strings.AddRootElementButtonCaption"},
"click": {"bindTo": "addRecord"}
}
},
{
"operation": "insert",
"name": "AddChildElementButton",
"parentName": "AddRecord",
"propertyName": "menu",
"values": {
"caption": {"bindTo": "Resources.Strings.AddChildElementButtonCaption"},
"click": {"bindTo": "addChildElementRecord"},
"enabled": {"bindTo": "getAddChildElementButtonEnabled"}
}
},
{
"operation": "remove",
"name": "FiltersContainer"
}
]/**SCHEMA_DIFF*/
};
});
return {
entitySchemaName: "SuOpportunityProductInterest",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
methods: {
/**
* Открывает страницу добавления детали
* @protected
* @overridden
* @param {String} editPageUId Значение колонки типа
* @param {Boolean} keepParentId (optional) Не удалять из DefaultValues элемент с ключем Parent
*/
addRecord: function(editPageUId, keepParentId) {
if (!keepParentId) {
var defaultValues = this.get("DefaultValues");
var result = this.Ext.Array.filter(defaultValues, function(item) {
return (item.name !== "SuParent");
}, this);
this.set("DefaultValues", result);
}
this.callParent(editPageUId);
},
/**
*Получает колонки, которые всегда выбираются запросом
*@protected
*@overridden
*@return {Object} Возвращает колонки, которые всегда выбираются запросом
*/
getGridDataColumns: function() {
var gridDataColumns = this.callParent(arguments);
if (!gridDataColumns.SuParent) {
gridDataColumns.SuParent = {
path: "SuParent"
};
}
return gridDataColumns;
},
prepareResponseCollection: function(collection) {
collection.each(function(item) {
var parent = item.get("SuParent");
var parentId = parent && parent.value;
if (parentId) {
item.set("SuParentId", parentId);
}
Terrasoft.each(item.columns, function(column) {
this.addColumnLink(item, column);
this.applyColumnDefaults(column);
}, this);
}, this);
},
getHideQuickFilterButton: function() {
return false;
},
getShowQuickFilterButton: function() {
return false;
},
updateDetail: function(config) {
config.reloadAll = true;
this.callParent([config]);
},
getAddChildElementButtonEnabled: function() {
return !this.Ext.isEmpty(this.getSelectedItems());
},
addChildElementRecord: function() {
var selectedItems = this.getSelectedItems();
if (this.Ext.isEmpty(selectedItems)) {
return;
}
var parentId = selectedItems[0];
var defaultValues = this.get("DefaultValues");
var result = this.Ext.Array.filter(defaultValues, function(item) {
return (item.name !== "SuParent");
}, this);
result.push({
name: "SuParent",
value: parentId
});
this.set("DefaultValues", result);
this.addRecord(null, true);
},
clearSelection: function() {
this.set("activeRow", null);
this.set("selectedRows", null);
},
onDeleteAccept: function() {
var selectedRows = this.getSelectedItems();
var batch = this.Ext.create("Terrasoft.BatchQuery");
Terrasoft.each(selectedRows, function(recordId) {
this.deleteItem(recordId, batch, this);
}, this);
if (batch.queries.length > 0) {
batch.execute(this.onDeleted, this);
}
},
onDeleted: function(response) {
if (response && response.success) {
this.clearSelection();
} else {
this.showConfirmationDialog(
this.get("Resources.Strings.OnDeleteError"));
}
},
deleteItem: function(recordId, batch, scope) {
var grid = scope.getGridData();
var toDelete = new Terrasoft.Collection();
grid.each(function(item) {
var parent = item.get("SuParent");
if (parent && parent.value === recordId) {
toDelete.add(item);
}
}, grid);
Terrasoft.each(toDelete.getItems(), function(item) {
this.deleteItem(item.get("Id"), batch, this);
}, scope);
if (grid.find(recordId)) {
var selfDelete = grid.get(recordId);
grid.remove(selfDelete);
var query = this.Ext.create("Terrasoft.DeleteQuery", {
rootSchema: scope.entitySchema
});
var filter = Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, "Id", recordId);
query.filters.addItem(filter);
batch.add(query);
}
}
},
diff: /**SCHEMA_DIFF*/[
{
"operation": "merge",
"name": "DataGrid",
"values": {
"type": "listed",
//включает иерархичность реестра детали
"hierarchical": true,
"hierarchicalColumnName": "SuParent"
}
},
{
"operation": "merge",
"name": "AddRecordButton",
"values": {
visible: false
}
},
{
"operation": "insert",
"name": "AddRecord",
"parentName": "Detail",
"propertyName": "tools",
"index": 1,
"values": {
itemType: Terrasoft.ViewItemType.BUTTON,
menu: [],
"imageConfig": {"bindTo": "Resources.Images.AddButtonImage"},
// "caption": {"bindTo": "Resources.Strings.AddButtonCaption"},
"visible": {"bindTo": "getToolsVisible"}
}
},
{
"operation": "insert",
"name": "AddParentRecordButton",
"parentName": "AddRecord",
"propertyName": "menu",
"values": {
"caption": {"bindTo": "Resources.Strings.AddRootElementButtonCaption"},
"click": {"bindTo": "addRecord"}
}
},
{
"operation": "insert",
"name": "AddChildElementButton",
"parentName": "AddRecord",
"propertyName": "menu",
"values": {
"caption": {"bindTo": "Resources.Strings.AddChildElementButtonCaption"},
"click": {"bindTo": "addChildElementRecord"},
"enabled": {"bindTo": "getAddChildElementButtonEnabled"}
}
},
{
"operation": "remove",
"name": "FiltersContainer"
}
]/**SCHEMA_DIFF*/
};
});
Если я добавляю корневой элемент, то все хорошо, запись отображается. Если добавляю подчиненный элемент, то запись не отображается.
Причина в том, что при добавлении подчиненного элемента не записываются значения в колонки
OpportunityId и SuParentId в таблице SuOpportunityProductInterest. Если в них вручную добавить значения, то подчиненная запись отобразится.
В чем может быть проблема? Заранее благодарен
Нравится
1 комментарий
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать