Коллеги, здравствуйте!

Возникло несколько вопросов по открытию доступа в моб.приложение.

Какие есть варианты открытия доступа к моб.приложению если система будет разворачиваться on-site и что для этого необходимо?

Возможно ли открыть доступ на тестовый период в случае, если лицензии пока не активированы? 

Возможно ли открыть доступ к  моб.приложению через локальную сеть wi-fi?



Спасибо!

Нравится

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

Роман, добрый день!

Это зависит от настроек доступа к серверу. Особых требований нет.

Главное, чтобы был сервер доступен с мобильного устройства (через VPN, Wi-Fi и т.д.). Этот вопрос уже больше относится к работе администрирования а не к приложению.

Также некоторые нюансы описаны на Академии -https://academy.terrasoft.ru/documents/mobile/7-11/ustanovka-

mobilnogo-prilozheniya-i-pervyy-vhod

Для использования мобильного приложения Вам необходима активная лицензия продукта bpm'online (например, sales enterprise) либо же trial/демо сайт. Отдельная лицензия не нужно. 

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

Добрый день!

возможно ли реализовать в мобильном приложении действия над строками детали?

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

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

Нравится

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

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

 

Ниже приблизительный алгоритм реализации (возможно необходимо будет его доработать): 

Создаем новую схему UsrAccountBillingInfoModuleConfig, подключаем ее в манифесте

там пишем: 

Terrasoft.sdk.Actions.add("AccountBillingInfo", {

    name: "MyActionName",

    title: "MyLocalizibleTitle",

    isVisibleInGrid: true,

    isDisplayTitle: true,

    iconCls: "cf-action-my-icon",

    position: 3,

    actionClassName: "Terrasoft.configuration.MyAction",

});

 

AccountBillingInfo - имя модели, которая используется в детали

isVisibleInGrid - означает, будет ли действие показываться в реестре

Terrasoft.configuration.MyAction - имя класса кастомного действия (нужно создать свой новый класс. Пример можно глянуть тут Terrasoft.configuration.OpenPortalMessagePublisherPageAction)

cf-action-my-icon - название CSS стиля, который добавится к элементу иконки, на вкладке less можно будет иконку для него прописать

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

Добрый день!

Столкнулись с проблемой с манифестами мобильного приложения

На дев среде был указан префикс, издатель = ХХХ.

создали рабочее место в мобильном приложении. Манифест содержит в себе префикс ХХХ.

Перенесли на тест среду пакет с изменениями. На тест среде префикс пустой. Наше рабочее место не открывается. Прописали на тест среде наш префикс XXX. Все заработало.

Кроме нас на проекте есть еще другая компания, которая поставляет свои пакеты с префиксом YYY. Но у них пока нет доработок мобильного приложения

Вопросы:

1) Как повлияет указание префикса XXX на промышленной среде на работу в системе? все ли будет доступно из нашего пакета(префикс XXX) и из пакеты другой организации(префикс YYY)? Где еще может всплыть проблема с префиксом? мне казалось, что он отвечает только за сам префикс создаваемых объектов и схем.

2) Как создавать рабочие места в мобильном приложении и вообще настраивать его без привязки к префиксам?

Нравится

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

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

bpm'online по особому обрабатывает схемы манифестов мобильного приложения.

В ядре идет завязка на имя схемы.

Имя должно быть либо MobileApplicationManifestXXX либо PrefixMobileApplicationManifestXXX , где Prefix берется из текущего значения системной настройки «SchemaNamePrefix».

 

Рекомендуем следующее:

  1. В момент настройки мобильного приложения, через дизайнер, делать системную настройку «SchemaNamePrefix» пустой, чтоб все манифесты были без префикса.

(по окончании работы с мастером не забудьте ее снова вернуть)

  1. Во время разработки дополнительной бизнес логики (когда разработчик вручную создает новые схемы) все схемы необходимо создавать обязательно с префиксом!

При этом префикс может быть любой (главное чтоб не пустой).

 

Вильшанский Дмитрий,

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

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

 

Zaitova Liubov,

1) без разницы какой будет

2) каждый раз когда создаете новое рабочее место через дизайнер нужен пустой префикс

Вильшанский Дмитрий,

2) каждый раз когда создаете новое рабочее место через дизайнер нужен пустой префикс



а редактирование существующего рабочего места тоже с пустым префиксом должно быть или можно ставить свой ХХХ?

Zaitova Liubov,

Желательно пустым

Спасибо

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

Добрый день. При разработке нового раздела в мобильном приложении возникла проблема с настройкой с выбором колонки реестра для стандартной детали. Настройка первичной колонки будто вовсе не срабатывает. В качестве отображаемого значения всегда выводится guid-ное значение (id строки). При этом вторичная колонка настраивается без каких-либо проблем. 

Terrasoft.sdk.GridPage.setPrimaryColumn("MyModel", "MyModelField1");
 
Terrasoft.sdk.GridPage.setSecondaryColumn("MyModel", "MyModelField2");

Пробовал устанавливать значения через convertFunction, но она вообще не вызывается.

В чём может быть причина подобного поведения?

Нравится

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

Добрый день!

Для решения вашей бизнес цели Вы можете использовать следующее:

После добавления нового раздела и добавления в него стандартной детали через мастер настройки мобильного приложения необходимо сделать следующее

  1. Добавляем новую схему типа "Module" с именем UsrИмя_вашей_схемы
  2. Пишем в ней примерно такой код:

    Terrasoft.sdk.GridPage.setPrimaryColumn("ContactCareer", "JobTitle");

    Terrasoft.sdk.RecordPage.addColumn("ContactCareer", {

            name: "JobTitle",

            position: 1

        }, "primaryColumnSet");

    Terrasoft.sdk.RecordPage.removeColumn("ContactCareer", "Contact", "primaryColumnSet");

    Где ContactCareer - имя таблицы, которая соответствует нашей детали;

          JobTitle - имя колонки, которую нужно отобразить

Подключаем данную схему в манифесте мобильного приложения MobileApplicationManifestDefaultWorkplace:

Находим блок модели Ваш_блок(например, ContactCareer) и в PagesExtensions добавляем наш модуль UsrИмя_вашей_схемы

 

Гриценко Игорь,

Спасибо! Всё получилось.

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

Добрый день.

Настраиваю мобильное приложение и столкнулся со следующей ситуацией.

Настройки часовых поясов: 

В профиле пользователя, от которого произведен логин в мобильное приложение +3 часа.

На мобильном устройстве +3 часа.

Добавляю запись через мобильное приложение со следующими значениями:

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

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

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

В основном приложении значения:

Дата подачи: 20.12.2017 9:28

Дата начала командировки: 19.12.2017

Дата окончания командировки: 19.12.2017

Что можно с этим сделать?

Нравится

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

Искандер, здравствуйте!

Уточните, пожалуйста:

- версию мобильного приложения;

- версию приложения bpm'online;

- какой конкретно (название) часовой пояс стоит в мобильном устройстве и в приложении;

- в каком разделе создаете запись;

- какой режим (offline/online) мобильного приложения используется;

- какую версию платформы Вы используете (UIv1/UIv2).

Вильшанский Дмитрий,

Версия мобильного приложения: 7.11.7

Версия приложения  7.11.0.3122

Часовой пояс в мобильном приложении определяется автоматически (GMT+03:00 Москва, стандартное время)

Запись создаем в новом разделе (раздел создан в рамках проекта)

Режим приложения - Онлайн

Использовать мобильный интерфейс V2 : да

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

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

В академии есть инструкция для настройки embeded детали. Но мне бы хотелось сделать обычную деталь.



Спасибо

Нравится

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

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

Что в Вашем понимании "обычная" деталь?

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

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

Помимо инструкции можете также посмотреть реализацию данной детали в пакете Mobile.

Добрый день!

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

Хочу отметить, что загруженные записи отображаются на страницы записи, а не на отдельной странице - http://prntscr.com/hpzz3r.

Вопрос: чем Вам не подходит встроенная деталь?

В версии bpm'online 7.11.3 добавлена возможность добавить деталь "Файлы и ссылки" в любой раздел мобильного приложения (если для аналогичного раздела деталь существует в основном интерфейсе) через мастер мобильного приложения.

Для этого требуется зайти в мастер мобильного приложения – выбрать раздел – выбрать настройку страницы - добавить встроенную деталь, которая будет ссылаться на соответствующий объект – сохранить настройку - выполнить синхронизацию мобильного приложения.

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

Добрый день.



Можно ли как то задавать значения по умолчанию для полей в мобильном приложении?

Хочется сделать предзаполнение полей  (в идеале даже не выводить их в интерфейс мобильного приложения), например заполнить "дату подачи" текущей датой, и поле "поле канал поступления" указать "мобильное приложение".



Можно ли такое сделать и если можно, то как?

Нравится

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

Добрый день.



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



Terrasoft.sdk.Model.setDefaultValuesFunc("НазваниеМодели", function(config) {

    var myValue = "Мобильное приложение";

    config.record.set("НазваниеКолонки", myValue);

    Ext.callback(config.success, config.scope);

});



Скрыть колонку тоже можно. Теперь используем SDK страницы:



Terrasoft.sdk.RecordPage.addColumn("НазваниеМодели", {

    name: "НазваниеКолонки", // название колонки как в объекте

    position: 0,

    hidden: true // Здесь скрывается колонка

}, "primaryColumnSet");



Значения должны записываться, несмотря на скрытость колонки.



Больше примеров можете найти в пакете Mobile в схемах MobileActivityModelConfig и MobileActivityModuleConfig соответственно.

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

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

1. Можно ли использовать для детали filterMethod, как в основной версии, или каким-либо образом использовать произвольный фильтр, а не только по колонке родительской страницы?

2. Как отключить возможность добавлять, удалять и редактировать записи детали, в зависимости от значений на родительской странице?

Заранее спасибо.

Нравится

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

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

1. Для деталей можно указывать фильтры, используя метод configure() соотв. sdk-класса:

 

Terrasoft.sdk.Details.configure("Contact", "ActivityDetailV2StandartDetail", {
   filters: Ext.create("Terrasoft.Filter", {
      type: Terrasoft.FilterTypes.Group,
      subfilters: [
         Ext.create("Terrasoft.Filter", {
            compareType: Terrasoft.ComparisonTypes.NotEqual,
            property: "Type",
            value: Terrasoft.GUID.ActivityTypeEmail
         })
      ]
   })
});

2. В целом, изменение режима работы детали делается так:

Terrasoft.sdk.Details.setChangeModes("Contact", "ActivityDetailV2StandartDetail", [Terrasoft.ChangeModes.Read]);

Но если нужно менять режим работы от условия, то для этого в контроллерах страниц есть метод getChangeModes(). Т.е. в контроллерах соотв. страниц (грида, просмотра, редактирования) нужно расширить этот метод:

 

getChangeModeOperations: function() {
   var detailConfig = this.getDetailConfig();
   if (detailConfig) {
      var parentRecord = detailConfig.parentRecord;
      if (parentRecord.get("IsNonActualEmail") === false) {
         return {
            canCreate: false,
            canUpdate: false,
            canDelete: false
         };
      }
   }
   return this.callParent(arguments);
}
Показать все комментарии

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

Потому начал создавать грид по аналогии из FieldForceMobileActivitySKUGridPage и настроил конфиг по аналогии с FieldForceMobileActivitySKUModuleConfig, подключил схемы в манифесте для детальки 

MyDetailSchema: {

"Grid": "MyGridPage",

PagesExtensions: [

"MyGridConfig"

]

}

Но теперь, при открытии детали в мобилке выдает ошибку: 'caption' undefined, что я не так сделал? Или чего мне не хватает? В схеме грида тайтл подключен через переопределенный метод getCustomTitle (думал что из-за него - нет)

 

И еще, чтобы не создавать отдельную тему. Как можно в Embedded детали вывести чекбос? Справочные/текстовые/числовые/дату поля отображает без проблем, а логическую не грузит вовсе (причем без ошибок, просто не отображает)

Нравится

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

Добрый день, 

Относительно Embedded детали: текущая логика приложения по работе с карточками Preview работает таким образом, что "пустые" колонки отображаются только в режиме редактирования. Значение false для булевой колонки сейчас воспринимается, как отсутствие значения. Это можно проверить таким образом: добавьте на деталь запись, у которой булевое поле будет true - и оно отобразится на карточке просмотра. 

Мы зарегистрировали пожелание по доработке этой функциональности в базовом продукте. Так как false может сам по себе нести определенный бизнес-смысл для булевой колонки. 

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

Есть страница реестра, код которой примерно такой.

Ext.define("MyObjectPage.View", {
    extend: "Terrasoft.view.BaseGridPage.View",
    xtype: "myobjectgridpage",
    config: {//Конфиг
    }
    //...
});
 
Ext.define("MyObjectGridPage.Controller", {
    extend: "Terrasoft.controller.BaseGridPage",
    //методы и т.д.
});

Требуется расширить имеющиеся классы view и controller, не создавая новые. Пробовал добавить следующий код:

Ext.define("MyObjectGridPage.View", {
    override: "MyObjectGridPage.View", 
    //Остальное...
});
 
Ext.define("MyObjectGridPage.Controller", {
    override: "MyObjectGridPage.Controller", 
    //Остальное...
});

Подключал по разному в манифесте: свойство "Grid" или массив "PagesExtensions" для модели нужного объекта, добавлял в "CustomSchemas". Всё время получаю ошибку:

Uncaught TypeError: Cannot read property 'singleton' of null

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

Что я мог упустить? Как можно повлиять на порядок загрузки кодов, чтобы выполнился сначала основной код класса, затем мои расширения? 

Нравится

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

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

  1. Мы рекомендуем не использовать override для расширения возможностей существующих классов. Для этих целей можно использовать extend.
  2. Для решения вашей задачи необходимо:
  • добавить свои классы, которые будут расширять существующие классы грида (view и контроллер)
  • указать эти новые классы в переменной Terrasoft.LastLoadedPageData, использующейся при навигации страниц (по сути, в ней хранится связь view и controller)
  • указать в манифесте вашу новую схему с реализацией своих классов в секции Models для соотв. модели в параметре «Grid»
  • указать там же в свойстве PagesExtensions ту базовую схему, которую вы расширяли

Возьмем, к примеру, view карточки реестра раздела «Лента». Схема, описывающая view, называется MobileSocialMessageGridPageView и соотв. класс называется SocialMessageGridPage.View.

  1. Создадим свою схему MySocialMessageGridPage. В нее добавляем след. код:

 

Terrasoft.LastLoadedPageData = {

controllerName: "SocialMessageGridPage.Controller",

viewXType: "mysocialmessagegridpageview"

};

 

Ext.define("Terrasoft.configuration.view.MySocialMessageGridPage", {

alternateClassName: "MySocialMessageGridPage.View",

extend: "SocialMessageGridPage.View",

xtype: "mysocialmessagegridpageview",

 

config: {

 

myButton: true

 

},

 

/**

* @protected

* @virtual

* @cfg-applier

*/

applyMyButton: function(newButton) {

if (!newButton) {

return false;

}

var config = {

style: "background: red; width: 32px; height: 32px;"

};

return Ext.factory(config, "Ext.Button", this.getMyButton());

},

 

/**

* @protected

* @virtual

* @cfg-updater

*/

updateMyButton: function(newButton, oldButton) {

if (newButton) {

var myButton = this.getMyButton();

this.add(myButton);

}

}

 

});

В этом расширении класса SocialMessageGridPage.View мы добавили свою красную кнопку, которая будет добавлена в «Ленту». При этом основные моменты в этом классе выделены красным. Т.е. помимо того, что мы расширили существующий класс (extend: "SocialMessageGridPage.View"), мы еще указали свой xtype (xtype: "mysocialmessagegridpageview"). И затем в Terrasoft.LastLoadedPageData указали его, сказав тем самым, что при открытии грида нужно использовать нашу новую view (контроллер при этом будет использоваться базовый, но вы можете его расширить и указать самостоятельно).

  1. Изменения в манифесте будут следующими:

 

{

"Models": {

"SocialMessage": {

"Grid": "MySocialMessageGridPage",

"PagesExtensions": [

"MobileSocialMessageGridPage"

]

}

}

}

 

В итоге результат будет таким (в левом верхнем углу карточки видна красная кнопка):

 

 

Вильшанский Дмитрий,

Мне как раз нужно расширить и контроллер. Попробовал сделать аналогично Вашему примеру. Теперь получаю новую ошибку, если добавить код, переопределяющий контроллер.

Uncaught TypeError: Cannot read property 'getName' of undefined
    at Class.getModelName (ApplicationConfig.js:189)
    at Class.getModelConfig (ApplicationConfig.js:203)
    at Class.getConfig (GridPage.sdk.js:24)
    at Class.beforeInitializeGrid (BaseGridPageController.js:226)
    at Class.doFire (sencha-touch-all-debug.js:15417)
    at Class.fire (sencha-touch-all-debug.js:15344)
    at Class.doDispatchEvent (sencha-touch-all-debug.js:15842)
    at Class.dispatchEvent (sencha-touch-all-debug.js:15823)
    at Class.doFireEvent (sencha-touch-all-debug.js:16188)
    at Class.fireEvent (sencha-touch-all-debug.js:16142)
    at Class.beforeinitialize (BaseGridPageView.js:75)
    at Class.doFire (sencha-touch-all-debug.js:15417)
    at Class.fire (sencha-touch-all-debug.js:15344)
    at Class.doDispatchEvent (sencha-touch-all-debug.js:15842)
    at Class.dispatchEvent (sencha-touch-all-debug.js:15823)
    at Class.doFireEvent (sencha-touch-all-debug.js:16188)
    at Class.fireEvent (sencha-touch-all-debug.js:16142)
    at Class.initialize (List.js:566)
    at Class.constructor (sencha-touch-all-debug.js:22965)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:32881)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (Sencha.js:126)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:54756)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:70258)
    at new Class (sencha-touch-all-debug.js:5267)
    at eval (eval at getInstantiator (sencha-touch-all-debug.js:7041), <anonymous>:3:8)
    at Object.instantiate (sencha-touch-all-debug.js:7008)
    at Object.instantiateByAlias (sencha-touch-all-debug.js:6920)
    at Object.factory (sencha-touch-all-debug.js:10109)
    at Class.applyGrid (BaseGridPageView.js:80)
    at Class.setter [as setGrid] (sencha-touch-all-debug.js:5541)
    at Class.initConfig (sencha-touch-all-debug.js:4979)
    at Class.constructor (sencha-touch-all-debug.js:22952)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (sencha-touch-all-debug.js:32881)
    at Class.callParent (sencha-touch-all-debug.js:4715)
    at Class.constructor (Sencha.js:126)
    at new Class (sencha-touch-all-debug.js:5267)
    at eval (eval at getInstantiator (sencha-touch-all-debug.js:7041), <anonymous>:3:8)
    at Object.instantiate (sencha-touch-all-debug.js:7008)
    at Object.instantiateByAlias (sencha-touch-all-debug.js:6920)
    at Object.factory (sencha-touch-all-debug.js:10109)
    at Class.initializeCacheItem (PageNavigator.js:125)
    at Class.forward (PageNavigator.js:198)
    at Class.success (MainPageController.js:318)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadLookupSubColumnsModels (StructureLoader.js:308)
    at Class.success (StructureLoader.js:317)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadLookupSubColumnModels (StructureLoader.js:331)
    at Class.success (StructureLoader.js:338)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadSchemas (StructureLoader.js:154)
    at Class.loadLookupSubColumnModels (StructureLoader.js:335)
    at Class.success (StructureLoader.js:338)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadSchemas (StructureLoader.js:154)
    at Class.loadLookupSubColumnModels (StructureLoader.js:335)
    at Class.loadLookupSubColumnsModels (StructureLoader.js:313)
    at Class.success (StructureLoader.js:224)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.loadSchemas (StructureLoader.js:154)
    at Class.loadGridPageModelDependencies (StructureLoader.js:222)
    at Class.success (StructureLoader.js:196)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.success (StructureLoader.js:145)
    at Object.callback (sencha-touch-all-debug.js:10397)
    at Class.<anonymous> (ScriptLoader.js:158)
    at one (head.js:566)
    at head.js:782
    at head.js:818
    at HTMLScriptElement.process (head.js:914)

Что я мог упустить?

Бершеда Д. Н.,

Так сказать сложно.

Возьмите эмулятор (http://ftp.bpmonline.com/support/downloads/mobile/7.11.7.rar) и поставьте debugger в функцию getModelConfig: function(model) класса Terrasoft.ApplicationConfig

И посмотрите в переменной model что приходит.

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