Вопрос

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

Добрый день!

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

                },

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

Показать все комментарии