Добрый день.
Подскажите, как можно на клиентском модуле в 7.2 генерировать новые поля по нажатию кнопки?
Имеется ввиду обычный клиентский модуль с getView(), getViewModule(), render() и т.п
Заранее спасибо за помощь!

Нравится

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

Здравствуйте!
По Вашему вопросу зарегистрировано обращение 0275337.

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

Добрый день. Возникла необходимость в bpmonline 7.5, в контактах, на детали "средства связи", динамически менять список социальных сетей, в зависимости от типа контакта. А также менять тип кнопки добавить (точнее убирать типы адресов и оставлять только кнопку добавить без выпадающего списка), детали "Адрес", тоже в зависимости от типа контакта. Проблема в том что скрипты выполняются только при инициализации страницы, т.е. они работают только если полностью перезагрузить страницу. Пробовал методы updateDetail, reloadDetail. Не работает, хотя reloadDetail, не отработал, вызывал так this.reloadDetail('ContactAddress'). Подскажите пожалуйста, как можно решить эту проблему.

Нравится

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

Здравствуйте, Владислав!
Не проще ли вместо перезагрузки детали просто вызывать методы, которые выполняются при инциализщации и устанавливают необходимые параметры?
Вы же используете привязку (bindTo) свойств для управления видимостью и наполнением?

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

define("ContactCommunicationDetail", ["ContactCommunicationDetailResources", "terrasoft", "ViewUtilities", "Contact", "ConfigurationEnums", "ConfigurationConstants","MultiMaskEdit"],
    function(resources, Terrasoft, ViewUtilities, Contact, ConfigurationEnums, ConfigurationConstants,MultiMaskEdit) {
        return {
            entitySchemaName: "ContactCommunication",
 
            attributes: {
                "CommunicationTypes" : {
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    dataValueType: Terrasoft.DataValueType.COLLECTION
                }
            },
            methods: {
                initCommunicationTypesFilters: function(esq) {
                    this.callParent(arguments);
                    var columns = Contact.columns;
                    if (columns !== null) {
                   //     debugger;
                        if(TypeStatus!='60733efc-f36b-1410-a883-16d83cab0980') {
                            if (columns.LinkedIn.usageType === ConfigurationEnums.EntitySchemaColumnUsageType.None) {
                                var InstagtramFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Instagtram);
                                esq.filters.addItem(InstagtramFilter);
                                var OdnoklasnikiFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Odnoklasniki);
                                esq.filters.addItem(OdnoklasnikiFilter);
                                var VkontakteFilter = Terrasoft.createColumnFilterWithParameter(
                                    Terrasoft.ComparisonType.NOT_EQUAL, "Id", ConfigurationConstants.CommunicationTypes.Vkontakte);
                                esq.filters.addItem(VkontakteFilter);
                            }
                        }
                    }
                }
            },
 
            diff: /**SCHEMA_DIFF*/[
 
 
            ]/**SCHEMA_DIFF*/
        };
    });

А что вам мешает использовать метод init()?

Владимир, а как вы предлагаете использовать init()?
Я пробовал в детали сделать так

  init:function(){
                    this.callParent(arguments);
                    this.initCommunicationTypesFilters();
                },
                updateDetail: function(config) {
                   this.callParent(arguments);
                   this.init();
 
                },

Но ничего путного не вышло.

Здравствуйте, Владислав!
Я, честно говоря, не совсем понял, как Ваш код должен работать. Возможно Вы не полностью предоставили фрагмент кода, но в условии происходит сравнение:

if(TypeStatus!='60733efc-f36b-1410-a883-16d83cab0980')
...

При этом я не вижу определения переменной TypeStatus. Рекомендую поставить там точку останова и посмотреть, какие условия выполняются.

Андрей, TypeStatus это переменная, которая присваивается в модуле ContactPageV2. При изменении статуса вызывается метод, где присваивается текущее значение статуса и вызывается метод updateDetails.После чего в модуле детали ContactCommunicationDetail и происходит проверка. Если условие выполняется добавляются фильтры, иначе они не добавляются.

attributes: {
            "Type": {
                dependencies: [
                    {
                        columns: ["Type"],
                        methodName: "typeChanged"
                    }
                ]
            }
        },
methods: {
  onEntityInitialized: function() {
                this.callParent(arguments);
                this.typeChanged();
            },
   typeChanged: function() {
       TypeStatus=this.get('Type').value;
         this.updateDetails();}

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

В какой момент Вы хотите обновлять деталь?

Владимир, после изменения поля типа контакта.

Попробуйте вместо this.updateDetail() вызвать this.updateDetail({reloadAll: true});

Иван, пробовал, но не работает. В итоге получилось сделать, но иначе. Воспользовался методом loadDetail в модуле NUI.BasePageV2.js. В карточке при изменении поля, взял часть этого метода и вызывал т.о.

this.sandbox.loadModule("DetailModuleV2", {
                            renderTo: "ContactPageV2ContactAddressContainer",
                            id: "SectionModuleV2_ContactSectionV2_CardModuleV2_detail_ContactAddress"
                        });

Ломухин Владислав Вячеславович,

я попробовал тоже самое, у меня пишет ошибку. но нужно тоже самое. подскажете как это сделать, может быть полный пример кода? спасибо

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

Подскажите, пожалуйста, как можно в странице карточки динамически сделать, что бы некоторые поля были не обязательны, либо обязательны. Аналог свойства из Terrasoft 3.x Dataset.Datafileds.ItemsByName('...').IsRequired = false;
Просто у меня такая ситуация, что обязательность задана на уровне объекта в документах, а я создал новый тип и карточку к нему, где нет некоторых обязательных полей. Теперь хочу отменить эту обязательность при работе с этой карточкой.
Спасибо!

Нравится

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

Можно, я так и делаю.
Например, в обработчике события изменения значения поля

Page.SomeFieldLookupEdit.Enabled = true;
Page.SomeFieldLookupEdit.SetRequired( true );

Ну или false......все от вас зависит :wink:

У контрола есть свойство Required и метод SetRequired(). В чём их отличие и когда какой работает, см. тут.

Спасибо всем за помощь!

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

Подскажите, пожалуйста, как можно в странице карточки динамически сделать, что бы некоторые поля были не обязательны, либо обязательны. Аналог свойства из Terrasoft 3.x Dataset.Datafileds.ItemsByName('...').IsRequired = false;
Просто у меня такая ситуация, что обязательность задана на уровне объекта в документах, а я создал новый тип и карточку к нему, где нет некоторых обязательных полей. Теперь хочу отменить эту обязательность при работе с этой карточкой.
Спасибо!

Нравится

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

Ссори, рука дрогнула, два раза кликнул на опубликовать - две темы создалось...
Одну можно удалить

Обсуждение вопроса перенесено на страницу
http://www.community.terrasoft.ua/forum/topic/10212

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

Для того, чтобы динамически добавить колонку в реестр, необходимо на его инициализации выполнить следующий скрипт:

var Column = Self.CreateComponent('DataGridColumn', 'colProcessed');
grdData.ActiveView.Add(Column);
grdData.ActiveView.ItemsByName('colProcessed').DataFieldName = 'Processed';

Для того, чтобы динамически удалить колонку в реестре, необходимо выполнить следующее:

var ColumnObject = grdData.ActiveView.ItemsByName('colProcessed');
grdData.ActiveView.RemoveItem(ColumnObject);

Нравится

Поделиться

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