Добрый день мне нужно в созданном мной модуле сделать функцию для bind к кнопке "Добавить". Я делаю расширение от LookupPage. 



Вот весь код: 

 

define("UsrAccountBaseLookupModule", [
        "LookupPage",
        "LookupPageViewGenerator",
        "LookupUtilitiesV2",
        "css!LookupPageCSS"
    ],
    function(LookupPage, LookupPageViewGenerator) {
        return Ext.define("Terrasoft.configuration.UsrAccountBaseLookupModule", {
            alternateClassName: "Terrasoft.UsrAccountBaseLookupModule",
            extend: "Terrasoft.LookupPage",
            render: function() {
                this.callParent(arguments);
                // if()
                this.myRenderLookupView(this.lookupInfo.entitySchema, this.lookupInfo.gridProfile);
            },
            renderLookupView: Terrasoft.emptyFn,
            myRenderLookupView: function(schema, profile){
                var config = this.getLookupConfig(schema, profile);
                var topPanelConfig = LookupPageViewGenerator.generateFixed(config);
                var buttonsConfig;
                _.some(topPanelConfig.items, function(target) {
                    if (target.id === "selectionControlsContainerLookupPage") {
                        _.some(target, function(target) {
                            if (Array.isArray(target)) {
                                buttonsConfig = target;
                                return true;
                            }
                        });
                        return true;
                    }
                });
                _.some(buttonsConfig, function(target) {
                    if (target.caption === "Добавить") {
                        target.enabled = {bindTo:"getViewModelValues"};
                        return true;
                    }
                });
                this.renderLookupControls(config, topPanelConfig);
            },
            getViewModelValues: function() {
                if(Terrasoft.SysValue.CURRENT_USER.value !== "8239c02a-1376-4e23-82f5-d5b142ac16f4") {
                    window.console.log(Terrasoft.SysValue.CURRENT_USER.value !== 
                        "8239c02a-1376-4e23-82f5-d5b142ac16f4");
                    return false;
 
              } else {
                   return this.render();
 
             }
                var values = {
                    canEdit: true,
                };
                return values;
            },
            generateViewModel: function() {
                var viewModel = this.callParent(arguments);
                this.applyViewModelMethods(viewModel);
                return viewModel;
            },
 
            applyViewModelMethods: function(viewModel, scope) {
                Ext.override(viewModel, {
                    onSearchButtonClick: function() {
                        var parentMethod = this.getParentMethod(this, arguments);
 
                        Terrasoft.chain(
                            function(next) {
                                 // Вот тут нужно сделать вызов функции чтобы кнопка Добавить стала активной
                                this.Ext.callback(scope, this.getViewModelValues);
                                next();
                            },
                            parentMethod,
                            this
                        );
                    }
                });
            },
        });
    });

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



Вот тут я не могу сделать вызов функции. Пожалуйста подскажите

Изображение удалено.

Нравится

1 комментарий

Добрый день!

Рекомендую сперва проверить работает ли данное замещение кнопки "Добавить". Для этого вместо функции используйте простое значение false. Уже с этого можно делать выводы и искать причину.

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

Здравствуйте.



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





1. В BaseCommunicationDetail существует биндинг поля enabled на метод getCommunicationEnabled, но метод getCommunicationEnabled не вызывается.

2. Сможем ли мы в теории посмотреть в таком методе на параметр новизны записи?

Нравится

1 комментарий

Добрый день, Егор!

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

Этот метод достаточно сложно переопределить, так как он находится в BaseComunicationViewModel.

Проще переопределить метод getCommunicationItemViewConfig в BaseCommunicationDetail в котором модифицировать поле enabled у редактируемого поля.

А чтобы определить новый это объект создается или нет, можно в этой же детали добавить атрибут или переменную булеовго типа и переопределить метод addItem, в котором переменную (например, isNewItem) менять на true, тогда в getCommunicationItemViewConfig смотря на эту переменную вы определите дальнейшее поведение.

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

Здравствуйте

Есть задача скрыть редактирование поля страны в детали по организационным ролям(супервайзер, руководители, менеджеры), закрыть право на редактирование для менеджеров.
Пробывал разные варианты через конфигурацию и добавления правил, все равно не работает.
Версия bpm7.6.

Как лучше мне это сделать?

Нравится

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

Здравствуйте, Сергей!

Вы можете видимость поля задать бизнес правилом. Параметр видимости будет определяться в момент открытия страницы редактирования (Вам необходимо переопределить метод onEntityItialized()). Замещенный метод onEntityItialized() должен вызывать родительский, а также проверять вхождение пользователя в роли (используйте ESQ по объекту SysAdminUnitInRole). Обратите внимание, что один пользователь может входить в несколько ролей.

Сформировал запрос к таблице SysAdminUnitInRole по своей Id

SELECT *
FROM            dbo.SysAdminUnit sa LEFT JOIN
                         dbo.SysAdminUnitInRole saur ON sa.Id = saur.SysAdminUnitId
WHERE sa.Id = 'мой Id'

Вернуло 3 строки - это означает, что в меня есть 3 роли?

Да, это значит что Администратор с sa.Id = 'мой Id' входит в три роли
Если вы выполните

SELECT saur.SysAdminUnitId, saur.SysAdminUnitRoleId
FROM            dbo.SysAdminUnitInRole saur
Where saur.SysAdminUnitId = 'мой Id'

То увидите айдишники ролей

Спасибо за подсказку, пытался вывести название ролей:

SELECT saur.SysAdminUnitId, saur.SysAdminUnitRoleId, s.Name
FROM            dbo.SysAdminUnitInRole saur Left JOIN
                         dbo.SysAdminUnit s ON saur.SysAdminUnitId = s.Id
WHERE saur.SysAdminUnitId = 'мой Id'

Результат имя моего контакта. Может я неправильно делаю?

так ваш запрос и выводит имя контакта из s.Name (SysAdminUnit)

можно сделать так

select s.Name 
from SysAdminUnit s
where s.id in (
select saur.SysAdminUnitRoleId
from dbo.SysAdminUnitInRole saur
where saur.SysAdminUnitId = 'мой Id'
)

Вот только одна запись похоже тоже будет вашим контактом, т.к. есть соответствие одинаковых id в SysAdminUnitInRole

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

Создал для контрагента действие:

              getActions: function() {
                  var actionMenuItems = this.callParent(arguments);
                  actionMenuItems.addItem(this.getActionsMenuItem({
                      "Caption": { "bindTo": "Resources.Strings.SxActionOpportunity" },
                      "Enabled":  { bindTo: "isClient" },
                      methodName: "runOpportunityManagement"
                  }));
                  return actionMenuItems;
              },

Действие должно быть активно только для контрагента с типом Клиент или Потенциальный клиент. Написал метод:

              isClient: function() {
                  var type = this.get("Type");
                  if(type) {
                      type = type.value;
                  }
                  if(type === Home32Constants.Account.Type.Client || type === Home32Constants.Account.Type.PotencialClient){
                      return true;
                  }else{
                      return false;
                  }
              },

Функция возвращает "true" а действие всё-равно не активно. А вот если закрыть левую панель(там где список записей раздела) и обновить страничку - всё отрабатывает как нужно.

Та же ошибка наблюдается и с Caption. Если открыта панель, то Caption пустой, а если закрыта - всё ок.
Я так понимаю если открыта эта панель система считает, что пользователь находится в разделе...

Вопрос с Caption решается добавлением Strings в Section раздела, а вот как быть с Enabled не понятно.

Нравится

4 комментария

Добрый день, Вячеслав!

Код должен отрабатывать, на первый взгляд ошибок нет.
Скорее всего ошибка в чем-то другом.
Я Вам написал личное сообщения для продолжения анализа возникшей ошибки.

В версии 7,4 удалось решить проблему таким образом:

              initCardActionHandler: function() {
                  this.callParent(arguments);
                  var propertyNames = [
                      "isClient"
                  ];
                  this.Terrasoft.each(propertyNames, function(propertyName) {
                      this.on("change:" + propertyName, function(model, value) {
                          this.sandbox.publish("CardChanged", {
                              key: propertyName,
                              value: value
                          }, [this.sandbox.id]);
                      }, this);
                  }, this);
              },

В следующем проекте уже на версии 7.5 стоит похожая задача, но данное решение уже не помогает.

В версии 7.5 такое решение тоже будет работать если isClient будет свойством, а не функцией. Для того, чтоб все работало, нужно в Карточке сделать isClient и уже к нему байндить "Enabled" действия.

Да. Действительно если биндиться на свойство всё отрабатывает. Спасибо!

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