Видимость действия по условию в карточке

Нужно показывать действие по условию.
Сделал действие в карточке:

                getActions: function() {
                    var actionMenuItems = this.callParent(arguments);
                    actionMenuItems.addItem(this.getButtonMenuItem({
                        "Caption": {"bindTo": "Resources.Strings.UsrFormContractCaption"},
                        "Tag": "FormContract",
                        "Visible": {"bindTo": "FormContractVisible"}
                    }));
                    return actionMenuItems;
                },
                FormContractVisible: function(){
                    var contract = this.get("UsrContract");
                    var state = this.get("Status")?this.get("Status").value:false;
                    if(!contract && state == Constants.OrderStatus.formation){
                        return true;
                    }else{
                        return false;
                    }
                }

При режиме карточки всё отрабатывает отлично.
Далее добавил действие в Section.

            getSectionActions: function(){
                var actionMenuItems = this.callParent(arguments);
                actionMenuItems.addItem(this.getButtonMenuItem({
                    "Caption": {"bindTo": "Resources.Strings.UsrFormContractCaption"},
                    "Tag": "FormContract",
                    "Visible": {"bindTo": "FormContractVisible"}
                }));
                return actionMenuItems;
            },
            FormContractVisible: function(){
                var activeRow = this.getActiveRow();
                if(!activeRow) return;
                var Contract = UsrContract || activeRow.values.UsrContract;
                var Status = Status || activeRow.values.Status.value;
                if(!Contract && Status == Constants.OrderStatus.formation){
                    return true;
                }else{
                    return false;
                }
            }

При режиме combined тоже всё стало отрабатывать. Но если в карточке изменить поле, например UsrContract то видимость уже не изменяется. Можно после сохранения карточки, например в функции onCardModuleResponse переинициализировать действия, но как это сделать не нашёл.
Подскажите как правильно реализовать задачу.

Версия 7.7

Нравится

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

Тут есть две проблемы:

1. В activeRow попадают только те колонки, что выведены на реестр. Следовательно и проверять в своей функции FormContractVisible вы можете только те колонки что видны вам в реестре(!). Иначе значения будут неопределенными, и результат проверки явно ошибочным;

2. Метод getSectionActions срабатывает только при смене фокуса между строками реестра, то есть, что бы ваши actionMenuItems увидели изменения в комбинированном режиме, вам нужно перейти от одной записи к другой и обратно, что, не очень то и удобно.

Что бы избежать первой проблемы, вам стоит из activeRow только гуид записи, а остальное вытягивать с помощью запросов ESQ.

Что бы по изменению значения на форме, секция об этих изменениях узнавала в реальном времени, без необходимости переключатся по записям.
Вам стоит использовать сообщения. (sandbox)
Поищите по конфигурации примеры использования, их очень много, ключевые слова: sandbox.subscribe и sandbox.publish

Алгоритм конечной реализации для комбинированного может быть приблизительно таким:

1. Видимость вашего actionMenu итема в секции, вы привязываете к атрибуту секции;
2. В секции, объявляете сообщение, в методе init подписываетесь на него через sandbox.subscribe;
2a. Обработчик этого сообщения меняет атрибут, к которому привязана видимость экшена.
3. В карточке по событию изменения целевых полей, вы генерируете адресное сообщение через sandbox.publish

Все, меняется карточка, про это узнает секция, меняется атрибут, меняется видимость экшена.
Если возникнут точечные вопросы во время реализации, пишите, постараемся ответить.

Первое было решено. Я переопределил функцию которая указывает что тянуть в activeRow. Я вытягиваю в этот объект нужные мне колонки без запросов.

Сообщение уже отправляется из карточки в секцию, при сохранении карточки. И потом дёргается как-раз функция onCardModuleResponse. - это базовая логика. Только вот я привязывал видимость действия к функции, а может действительно следовало к атрибуту. Как-то я упустил этот момент. Попробую...

Да. Надо было всего-лишь в секшене видимость подвязать на атрибут.
Как-то я протупил) Спасибо за наводочку)

"Щиголь Максим" написал:Алгоритм конечной реализации для комбинированного может быть приблизительно таким:

1. Видимость вашего actionMenu итема в секции, вы привязываете к атрибуту секции;
2. В секции, объявляете сообщение, в методе init подписываетесь на него через sandbox.subscribe;
2a. Обработчик этого сообщения меняет атрибут, к которому привязана видимость экшена.
3. В карточке по событию изменения целевых полей, вы генерируете адресное сообщение через sandbox.publish

и такое workaround планируется считать нормальным решением?

"Владимир Соколов" написал:и такое workaround планируется считать нормальным решением?

На то он и workaround, хотя типовое решение не сильно и отличается от него. Т.к. в данном случае было найдено существующее сообщение sandbox. Писать своё, как я понимаю, не пришлось. Проблема была решена подвязкой видимости на атрибут, который изменяется в секции по сообщению CardModuleResponse.

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