делать активным действие детали в зависимости от значения поля в главной карточке
Добрый день!
Допустим есть контрагенты с типом А и B.
Если у контрагента тип А, то необходимо для детали Адреса у контрагента делать НЕактивным действие удалить на детали.
Для этого в схеме детали
были переопределены следующие методы
getDeleteRecordButtonEnabled: function() {
var ican=this.get("IsMyEnabled");
return ican.value;
},
getDeleteRecordMenuItem: function() {
return this.getButtonMenuItem({
Caption: {"bindTo": "Resources.Strings.DeleteMenuCaption"},
Click: {"bindTo": "deleteRecords"},
Enabled: {bindTo: "getDeleteRecordButtonEnabled"},
Visible: {bindTo: "IsEnabled"}
});
}
где виртуальный атрибут IsMyEnabled должен быть false, если у контрагента тип А.
Как и где надо достучаться в схеме детали адреса контрагентов до типа контрагента?
То есть как и где надо достучаться в схеме детали до какого-либо поля родительской записи?
Предположительно, что метод заполнения атрибута будет таким:
setMyEnabled: function() {
var accountId = this.get("MasterRecordId");
if (!accountId) {
return;
}
var select = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Account"
});
select.addColumn("UsrAccountStatus.Id","AccStatus");
select.getEntity(accountId.value, function(result) {
if (!result.success) {
return;
}
if (result.entity.get("AccStatus")) {
if (result.entity.get("AccStatus")===UsrConsts.AccountStatus.Approve) {
this.set("IsMyEnabled", true);
}
else {
this.set("IsMyEnabled", false);
}
}
}, this);
}
Но где его вызвать, чтобы атрибут был заполнен к моменту определения доступности действия?
Нравится
Дарья, тут описан пример доступности действия в зависимости от значения стадии.Возможно, для детали потребуется что-то аналогичное.
Либо пойти другим путём и реализовать невозможность удаления при помощи раздачи прав на записи детали.
Зверев Александр,
спасибо, права на записи детали здесь не нужны. Пример видела тоже, в примере все понятно, как заблокировать действие в карточке раздела тоже понятно. Проблема в том, что это деталь, и нужно получить значение определенного поля родительской записи (для блокировки действия) и при этом не натолкнуться на асинхронность и невозможность проанализировать значение. Есть идея сделать виртуальный атрибут для заполнения значения данного поля, чтобы потом им оперировать. Но непонятно в какой момент его заполнять - какое-то событие должно быть отрисовки детали до того, как отрисуются действия.
Можно попробовать обращаться к записи детали и добираться к полю связанной записи основного раздела по связям.
Зверев Александр,
Спасибо, понятно, что можно добраться и как добраться тоже понятно (в теме сообщения собственно был пример того, как добраться...). Проблема в том, в какой момент это сделать, чтобы иметь возможность оперировать значением.
В любой, наверное. Вас же не интересует значение поля записи детали, а запись основного раздела в момент наличия на детали записей уже создана и сохранена.
Зверев Александр,
Добрый день) Все забываю отписаться.
Не в любой момент, потому что действия должны блокироваться тогда, когда деталь рисуется.
В методе initData надо делать - для блокировки действий при инициализации детали
ниже пример
Сделали так:
виртуальный атрибут
attributes: {
"IsMyEnabled": {
dataValueType: Terrasoft.DataValueType.BOOLEAN,
value: false
}
},
//заполнение атрибута для определения доступности действия
setMyEnabled: function() {
var accountId = this.get("MasterRecordId");
if (!accountId) {
return;
}
var select = this.Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Account"
});
select.addColumn("UsrAccountStatus.Id","AccStatus");
select.getEntity(accountId, function(result) {
if (!result.success) {
return;
}
if (result.entity.get("AccStatus")) {
if (result.entity.get("AccStatus")===UsrConsts.AccountStatus.Approve) {
this.set("IsMyEnabled", false);
}
else {
this.set("IsMyEnabled", true);
}
}
}, this);
},
.//при обновлении детали вызвали метод свой
//при обновлении детали
// у нас статус контрагента(от которого зависит доступность) меняется с помощью специального действия, после которого вызывается updateDetail
updateDetail: function(config) {
this.callParent(arguments);
//вызов заполнения атрибута для определения доступности действия
this.setMyEnabled();
if (config.reloadAll) {
var detailInfo = this.getDetailInfo();
this.set("MasterRecordId", detailInfo.masterRecordId);
this.set("DetailColumnName", detailInfo.detailColumnName);
this.set("Filter", detailInfo.filter);
this.set("CardPageName", detailInfo.cardPageName);
this.set("SchemaName", detailInfo.schemaName);
this.set("DefaultValues", detailInfo.defaultValues);
this.set("UseRelationship", detailInfo.useRelationship);
this.set("RelationType", detailInfo.relationType);
this.set("RelationTypePath", detailInfo.relationTypePath);
this.set("RelationshipPath", detailInfo.relationshipPath);
this.set("IsGridDataLoaded", false);
this.set("IsClearGridData", true);
this.set("ActiveRow", null);
this.set("SelectedRows", []);
this.set("IsEnabled", detailInfo.isEnabled);
this.set("ProfileKey", detailInfo.profileKey);
this.initRelationshipButton(this.loadGridData);
} else {
var primaryColumnValue = config.primaryColumnValue;
this.loadGridDataRecord(primaryColumnValue);
this.fireDetailChanged({
action: "edit",
rows: [primaryColumnValue]
});
}
},
//при инициализации детали вызвали метод свой
//при инициализации детали
initData: function(callback, scope) {
//вызов заполнения атрибута для определения доступности действия
this.setMyEnabled();
this.callParent([function() {
Terrasoft.chain(
this.initGridRowViewModel,
function(next){
this.initGridData();
this.initSortActionItems();
this.reloadGridColumnsConfig();
this.initRelationshipButton(next);
},
function(next){
this.loadGridData();
this.initToolsButtonMenu();
this.mixins.GridUtilities.init.call(this);
this.initDetailRunProcessButtonMenu(next);
},
function() {
callback.call(scope);
},
this);
}, this]);
},
//переопределение доступности удалить - часть 1
getDeleteRecordButtonEnabled: function() {
var ican=this.get("IsMyEnabled");
var ican2 = this.isAnySelected();
return ican2 && ican;
},
//переопределение доступности удалить - часть 2
getDeleteRecordMenuItem: function() {
return this.getButtonMenuItem({
Caption: {"bindTo": "Resources.Strings.DeleteMenuCaption"},
Click: {"bindTo": "deleteRecords"},
Enabled: {bindTo: "getDeleteRecordButtonEnabled"},
Visible: {bindTo: "IsEnabled"}
});
},
isAnySelected: function() {
var selectedItems = this.getSelectedItems();
return selectedItems && (selectedItems.length > 0);
},