Вопрос

Как манипулировать кнопками?

Третий день сижу в платформе. Как в ней после замещения клиентского модуля, управлять видимостью кнопок - прятать/ показывать, показывать только админу и тп

 

Может что-то еще нужно замещять?

Есть нормальная методичка, крнига? 

Как вести разработку с отладкой?  (site-установка)

Когда нужен c#, когда достаточно на js и где эта граница?

Нравится

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

видимостью кнопок можно управлять через атрибуты(в diff кнопки забиндить параметр visibility на нужный атрибут) и потом в методах уже задавать атрибуту true или false

Сериков Асхат Кайратович,

Спасибо. Можно примеры, для кнопки "добавить" и как для кнопок. Вот кусок моего кода, отключил реакцию на кнопки в OnActiveRow а как их вообще убрать? Еще у меня есть кнопка на которую надо делать то для чего c# не нужен но надо как-то ViewModel расширить или что-то такое, вот как это все? diff: [{

                    "operation": "insert",

                    "name": "bnBackCall",

                    "parentName": "DataGrid",

                    "propertyName": "activeRowActions",

                    "index": 111,

                    "values": {

                        "className": "Terrasoft.Button",

                        "style": Terrasoft.controls.ButtonEnums.style.GREY,

                        "caption": "Позвонить",

                        "tag": "tagBnBackCall"

                    }

                }],

        methods: {

            init()

            {

                alert('init');    

                this.callParent(arguments);

            },

            onRender()

            {

                alert('render');    

                this.callParent(arguments);

            },

            onActiveRowAction: function(buttonTag, primaryColumnValue) {

                switch (buttonTag) {

                    case "edit":

                        alert('Нельзя открыть кандидата!');

                        break;

                    case "copy":

                        alert('Нельзя копировать кандидата!');

                        break;

                    case "delete":

                        alert('Нельзя удалить кандидата!');

                        break;

QArt,

Я бы вам посоветовал заглянуть в базовую схему секции, весь контроль там прописан, все что вам нужно оттуда понять какие атрибуты нужны вам, к примеру чтобы скрыть кнопку "Добавить", в init методе достаточно 

init: function() {
	this.callParent(arguments);
	this.set("IsAddRecordButtonVisible", false);
}

атрибут IsAddRecordButtonVisible я нашел как раз в базовой схеме раздела "BaseSectionV2" так как все остальные секции наследуются именно от этой схемы.



Для скрытия кнопок открытия, удаления  и тд точно так же задать нужное значение нужному атрибуту. Например для скрытия кнопки удалить:

 

init: function() {
	this.callParent(arguments);
	this.set("IsAddRecordButtonVisible", false);
    if(admin){ // Как понять что нынешний пользователь админ или нет думаю сами уже знаете
        this.set("canDeleteRecords", true)
    }
    else {
        this.set("canDeleteRecords", false)
    }
}

для отображения кнопки копировать или открыть, не совсем уверен(так как не пробовал), но думаю можно сделать что то вроде: 

 

{
    "operation": "merge",
    "name": "DataGridActiveRowOpenAction" //Кнопка открытия записи
    "values": {
        "visible": {"bindTo": "YourAttribute"}
    }
},
//кнопка копирования -DataGridActiveRowCopyAction, действия те же самые

Следует обозначить YourAttribute в атрибутах как булевое значение и так же в методе init задавать ему нужное вам значение в нужном вам виде

QArt,

Я не совсем понял про расширение ViewModel можно немного больше деталей? или пример какой нибудь

Сериков Асхат Кайратович, Спасибо!, кроме кнопки добавить не заработало, но указка куда копать. Есть где-нибудь методичка нормальная? (не в SEO оформлена, чтобы как книга читать было удобно для тех кто видит впервые)

Подскажи еще плиз, начал лазить в BaseSectionV2. Добавил 

diff: [{

                    "operation": "insert",

                    "name": "bnBackCall",

                    "parentName": "DataGrid",

                    "propertyName": "activeRowActions",

                    "index": 111,

                    "values": {

                        "className": "Terrasoft.Button",

                        "style": Terrasoft.controls.ButtonEnums.style.GREY,

                        "caption": "Позвонить",

                        "tag": "tagBnBackCall"

                    },

                    {

                      "operation": "merge",

                      "name": "DataGridActiveRowOpenAction" //Кнопка открытия записи

                      "values": {

                        "visible": {"bindTo": "IsOpenVisible"}

                        }

                    },

                    {

                      "operation": "merge",

                      "name": "DataGridActiveRowCopyAction" //Кнопка открытия записи

                      "values": {

                        "visible": {"bindTo": "IsCopyVisible"}

                        }

                    },

                    {

                      "operation": "merge",

                      "name": "DataGridActiveRowDeleteAction" //Кнопка открытия записи

                      "values": {

                        "visible": {"bindTo": "IsDeleteVisible"}

                        }

                    },

                }],

        methods: {

            init: function() {

                this.callParent(arguments);

                this.set("IsAddRecordButtonVisible", false);

                this.set("canDeleteRecords", false);

                this.set("IsDeleteVisible", false);

                this.set("IsCopyVisible", false);

                this.set("IsOpenVisible", false);

            },

Кнопка "Добавить" пропала - Спасибо! Но она с главной части, а кнопки удалить, копировать и удалить остались тк они аяксом выходят при выборе ActiveRow. Вероятно их нужно удалять не (только в init) где? Хотя настроено чтобы их не было. Может что-то не так делаю и как определить текущий юзар админ или нет? По этому вопросу ничего лучше чем https://community.terrasoft.ru/articles/bpmonline-kak-opredelit-avlaets… не нашел, но пока не знаю как писать код на c# для платформы и делать так чтобы его можно было вызвать из js (на c# писать умею). Заранее спасибо!

 

QArt,

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



Про с#, не знаю как его используют другие, мы например используем его только в веб сервисах как замену бизнес процессам, все таки все плюшки шарпа можно реализовать там. К примеру вызвать веб сервис на клиенте, получить ответ от веб сервиса в виде json или чего то подобного и уже дальше отталкиваться от этого. Вот пример написания и вызова веб сервиса на академии 

https://academy.terrasoft.ru/documents/technic-sdk/7-11/kak-programmno-…



Понять администратор ли пользователь можно строчкой в init методе

this.getRoles(Terrasoft.core.enums.SysValue.CURRENT_USER.value, 
    function (result) {
        this.set("Roles", result); 
    }, 
this);

Тут выгружаются все роли пользователя в "Result", уже в коде можешь пройтись по нему в цикле посмотреть есть ли нужная тебе роль в объекте и делать дальше что по сценарию.

 



 

QArt,

Что касается кнопок, то я попробовал на секции ContactSectionV2(Секция контактов) и вот что получилось

define("ContactSectionV2", [], function() {
  return {
    entitySchemaName: "Contact",
    details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
    methods: {
      init: function() {
        this.callParent(arguments);
        this.set("IsAddRecordButtonVisible", false);
        this.set("IsButtonVisible", false); //Прячет кнопки
      },
 
      getSectionActions: function() {
        var actionMenuItems = this.callParent(arguments);
        actionMenuItems.addItem(this.getButtonMenuItem({
          Type: "Terrasoft.MenuSeparator",
          Caption: ""
        }));
        actionMenuItems.addItem(this.getButtonMenuItem({
          "Caption": "Скрыть/Показать",
          "Click": {bindTo: "showHide"},
          "Enabled": true
        }));
        return actionMenuItems;
      },
 
      showHide: function() {
        var visibleStatus = this.get("IsButtonVisible");
        window.console.log(visibleStatus);
        this.set("IsButtonVisible", !visibleStatus);
        window.console.log(!visibleStatus);
      }
    },
    attributes: {
      "IsButtonVisible": {
        "dataValueType": Terrasoft.DataValueType.BOOLEAN,
        "value": false
      }
    },
    diff: /**SCHEMA_DIFF*/[
      {
        "operation": "merge",
        "name": "DataGridActiveRowOpenAction", //Кнопка открытия записи
        "values": {
          "visible": {"bindTo": "IsButtonVisible"}
        }
      },
      {
        "operation": "merge",
        "name": "DataGridActiveRowCopyAction", //Кнопка открытия записи
        "values": {
          "visible": {"bindTo": "IsButtonVisible"}
        }
      },
      {
        "operation": "merge",
        "name": "DataGridActiveRowDeleteAction", //Кнопка открытия записи
        "values": {
          "visible": {"bindTo": "IsButtonVisible"}
        }
      }
    ]/**SCHEMA_DIFF*/
  };
});

Однако кнопки почему то скрываются только один раз и не хотят вновь показаться по нажатию на действие Показать/Скрыть которое в кнопке Действия, надеюсь это поможет разобраться как дальше 

Спросил у коллег поэтому поводу, говорят что эти кнопки добавляются куда то в buttonCollection и чтобы их скрыть/показать  надо их оттуда удалять, и при надобности обратно закидывать, а как именно я не знаю, так что вышеописанный вариант нерабочий но думаю хоть какую то информацию он дает.

Огромное спасибо! Ща начал пробовать вообще перестало работать, притом вернул экспорт из вчера и он даже не работает, чудеса какие-то ((

Привет, еще раз вопрос, и еще вопрос :) - в init написал:

init()

            {

                alert('init');    

                this.callParent(arguments);

                this.set("IsAddRecordButtonVisible", false);

                this.getRoles(Terrasoft.core.enums.SysValue.CURRENT_USER.value, 

                    function (result) {

                    this.set("Roles", result); 

                }, 

                this);

                alert(result);

            },

и вот что в отладке в хроме.консоле: (может надо в схему или куда-то что-то добавить и будет работать)

SxCandidateSection.js?hash=87519e0c9f0746dbb10b870134a8a93a:86 Uncaught TypeError: this.getRoles is not a function

    at init (SxCandidateSection.js?hash=87519e0c9f0746dbb10b870134a8a93a:86)

    at i.<anonymous> (BaseSchemaModuleV2.js?hash=87519e0c9f0746dbb10b870134a8a93a:184)

    at i.<anonymous> (BaseSchemaModuleV2.js?hash=87519e0c9f0746dbb10b870134a8a93a:142)

    at i.<anonymous> (SchemaBuilderV2.js?hash=87519e0c9f0746dbb10b870134a8a93a:715)

    at SchemaBuilderV2.js?hash=87519e0c9f0746dbb10b870134a8a93a:465

    at i.<anonymous> (ViewGeneratorV2.js?hash=87519e0c9f0746dbb10b870134a8a93a:2883)

    at ViewGeneratorV2.js?hash=87519e0c9f0746dbb10b870134a8a93a:381

    at Object.execCb (require.js:1693)

    at Module.check (require.js:881)

    at Module.enable (require.js:1173)

QArt,

Эм да, моя ошибка, забыл добавить сам метод,

getRoles: function (UserId, callback, scope) {
            var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "SysUserInRole" });
            var filter = this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "SysUser", UserId);
            esq.filters.addItem(filter);
            esq.addColumn("SysRole.Id", "RoleId");
            esq.addColumn("[SysAdminUnit:Id:SysRole].Name", "Name");
            esq.getEntityCollection(function (response) {
                if (response &amp;&amp; response.success) {
                    var roles = [];
                    response.collection.each(function (item) {
                        roles.push({
                            Id: item.values.RoleId,
                            Name: item.values.Name
                        });
                    });
                    if (scope)
                        callback.call(scope, roles);
                    else
                        callback(roles);
                }
            }, this);
        }

 

Сериков Асхат Кайратович, 

Спасибо! Но что-то не так делаю, помоги плиз

//IsAdmin  

В Init написал      this.getRoles(Terrasoft.core.enums.SysValue.CURRENT_USER.value, 

        function (result) {

            this.set("gRoles", result); 

        }, 

        this);


В кнопке на ActiveRow написал 

var roles = this.get('gRoles');

                        var rolesAsString = '';

                        for (var i = 0; i < roles.length; i++)

                        {

                            var item = roles [i];

                          rolesAsString = rolesAsString + item[0] + ' => ' + item[1] + ' <+> ';

                        }

alert(rolesAsString);

выводит сплошные undefined притом пробовал в самом callback сделать alert(result) выдавал массив из трех элементов каждый из которых тоже массив из двух элементов, но в итоге каждое значение равно undefined

 

Что делать?

QArt,

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

this.getRoles(Terrasoft.core.enums.SysValue.CURRENT_USER.value, 
    function (result) {
        window.console.log(result);
        this.set("Roles", result); 
    }, 
this);

И посмотреть что в консоли выведется, если и тут ничего норм не выйдет, то возможно разница в версиях может быть ( я работаю на 7.7).



Можно еще поковырять в самой функции getRoles, посмотреть на каком этапе что выдает и где падает

Я кстати разобрался как манипулировать кнопками(скрыть/показать), еще требуется или уже сам разобрался?

Спасибо! У нас 7.1*** она возвращает массив из трех элементов, каждый элемент массива - массив из двух элементов и оба - undefined. Вероятно, из-за версии. Еще раз спасибо большое! Я еще вернусь с вопросами :)

Сериков Асхат Кайратович,

Привет, пиши как с кнопками, но у меня приемлемо работает то что ты писал до того. Можешь подсказать - https://community.terrasoft.ru/questions/obrabotka-v-onactiverowaction - мой новый вопрос, ... спасибо

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