Вопрос

делать активным действие детали в зависимости от значения поля в главной карточке

Добрый день!

Допустим есть контрагенты с типом А и 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);
                
            }

 

Но где его вызвать, чтобы атрибут был заполнен к моменту определения доступности действия?

 

У меня такой же вопрос

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

Дарья, тут описан пример доступности действия в зависимости от значения стадии.Возможно, для детали потребуется что-то аналогичное.

Либо пойти другим путём и реализовать невозможность удаления при помощи раздачи прав на записи детали.

Зверев Александр,

спасибо, права на записи детали здесь не нужны. Пример видела тоже, в примере все понятно, как заблокировать действие в карточке раздела тоже понятно. Проблема в том, что это деталь, и нужно получить значение определенного поля родительской записи (для блокировки действия) и при этом не натолкнуться на асинхронность и невозможность проанализировать значение.  Есть идея сделать виртуальный атрибут для заполнения значения данного поля, чтобы потом им оперировать. Но непонятно в какой момент его заполнять - какое-то событие должно быть  отрисовки детали до того, как отрисуются действия.

Можно попробовать обращаться к записи детали и добираться к полю связанной записи основного раздела по связям.

Зверев Александр,

Спасибо, понятно, что можно добраться и как добраться тоже понятно (в теме сообщения собственно был пример того, как добраться...). Проблема в том, в какой момент это сделать, чтобы иметь возможность оперировать значением.

В любой, наверное. Вас же не интересует значение поля записи детали, а запись основного раздела в момент наличия на детали записей уже создана и сохранена.

Зверев Александр,

Добрый день) Все забываю отписаться.

Не в любой момент, потому что действия должны блокироваться тогда, когда деталь рисуется.

В методе 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);
                },

Спасибо за уточнение!

Войдите или зарегистрируйтесь, чтобы комментировать