Подскажите пожалуйста каким образом можно внедрить сторонние библиотеки JS в мобильную версию bpm online

Нравится

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

Здравствуйте, Андрей!

Подскажите, какую функциональность Вы хотите добавить сторонними библиотеками?

Pavel Bashtovoy, мне необходимо распрарсить xlsx файл, без отправки на сервер.

Андрей, добрый день!

Как вариант Вы можете создать отделньую схему и полностью скопировать код из этой библиотеки (т.е. метод "copy-paste"). А затем подключить как обычно в манифест CustomSchemas.

Пример подключения таких скриптов:

CustomSchemas: ['MobileActionCheckIn', 'MobileUtilities']

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

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

Потому начал создавать грид по аналогии из 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 что приходит.

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

Есть ли возможность обновить данные только в отдельных таблицах в мобильном приложении, не вызывая полную синхронизацию?

Нравится

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

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

 

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

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

Добрый день. Возникла задача в мобильном приложении обработать выбранный пользователем файл, например, извлечь из него некоторые данные. К сожалению, не могу найти примеры, как это можно было бы сделать. Нужно по нажатию на кнопку открыть окно выбора файла из файловой системы, затем получить содержимое этого файла и считать из него данные. Где можно почитать про это, может есть какие-либо примеры в базовой реализации? Быть может кто-то реализовывал нечто подобное?

Нравится

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

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

Максим Цынгаев,

Нужно проимпортировать заказ с продуктами из Excel-документа. Потом внести правки, если понадобится и уже потом отправить на сервер. Такое возможно?

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

К сожалению, данный кейс нельзя реализовать без отправки файла изначально на север.

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

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

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



Для создания самой страницы воспользовался данной статьей https://academy.terrasoft.ru/documents/technic-sdk/7-10/zhiznennyy-cikl…



На ней же сказано следующее:

Затем страницу нужно добавить в кэш:
 
Terrasoft.PageCache.addItem("MyPageSchemaName",Terrasoft.configuration.MyPageUtils.getPageData());
Теперь маршрут настроен на страницу MyPage. Для открытия маршрута необходимо выполнить соответствующую команду:
 
Terrasoft.Router.route("myPage", Terrasoft.configuration.MyPageUtils, ["My page data"]);

Вопрос, где размещать данный код, чтобы вызвать страницу согласно условию описанному выше.

Нравится

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

Павел, здравствуйте!

 

Пользовательскую страницу Вы реализовываете в пользовательской JS схеме (тип страницы «Модуль»). А на checkbox’е (где она реализована) Вы должны ее вызвать.

По поводу примера. На текущий момент нет нормальной возможности расширять действия на визите. В следующей версии десктопа (7.11.1) такая возможность появится. Есть статья с примерами (см. https://www.dropbox.com/s/wddrbvgv186juvr).

Вильшанский Дмитрий, Благодарю.

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

Добрый день, интересует следующее:

Можно ли в мобильной версии, например по чекбоксу/кнопке получить "Текущее местоположение устройства"? (Координаты).

Нравится

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

Получил частично информацию по своему вопросу, для этого необходимо обновиться до версии 7.10.3. И вот дополнительная информация по работе с Чек-ином. 

https://academy.terrasoft.ru/documents/sales-enterprise/7-10/kak-kontro…

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

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

При синхронизации мобильного приложения в оффлайн-режиме во время импорта данных возникает ошибка "Unable to get property 'IsVirtual' of undefined or null reference". Упоминания 'IsVirtual' нашел только в нескольких схемах, не связанных с мобильным приложением. проблема возникает только при синхронизации с пользовательским рабочим местом. Основное рабочее место работает отлично.

Подскажите, пожалуйста, в чем может быть проблема?



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

Прикрепленные файлы

Нравится

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

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



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



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

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

Добрый день!

Нужно внутри

Terrasoft.ModelCollection.load({
            models: [VisitActions],
            queryConfigs: [ ... ],
            filters: [ ... ],
            success: function (result) {
                        var va = result.getByKey("VisitActions")
                        va.each(function (va_) {
                                    if (1) {
                                                //удалить часть выборки(из таблицы!)
                                    }
                        }, this);
            },
            scope: this

 });

удалить часть выборки (из таблицы!)

Нравится

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

Какие сложности возниикли? Что-то пробовали уже реализовать?

"Мотков Илья" написал:Какие сложности возниикли?

Собственно искал совет правильная ли конструкция и можно ли тут сделать что-то типа

va_.Delete();

Или может есть более интересные конструкции, например ExequteSQL и прописать там всё что я об этом думаю?

Не имеет смысла грузить данные а потом часть удалять.
Можно например наложить фильтр при импорте данных в манифесте мобильного приложения (Секция ModelDataImportConfig, SyncFilter)
Еще, как вариант, можно создать вьюху.

"Клименко Николай" написал:Можно например наложить фильтр при импорте данных в манифесте мобильного приложения (Секция ModelDataImportConfig, SyncFilter)
Еще, как вариант, можно создать вьюху.

Спасибо, Николай! Идея хорошая. Буду размышлять о возможности такой реализации!

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

Добрый день!

Есть ли в документации примеры создания и использования контролов (в частности кнопки)?

Нравится

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

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

В документации примеров создания и использования контролов нет. Но у нас есть некоторые примеры, которые мы можем предоставить. Только желательно получить хоть какое-то описание, что именно Вы хотите сделать.

Спасибо, Дмитрий.

"Вильшанский Дмитрий" написал:примеров создания и использования контролов нет

Очень жаль.

"Вильшанский Дмитрий" написал:получить хоть какое-то описание, что именно Вы хотите сделать

Нужна кнопка "Сделать фото" которая откроет камеру моб.устройства и после фотографирования положит фото в деталь "Файлы активности" (так де нужно переименовать фото).

Данный функционал уже добавлен в детали "Файлы и ссылки".
Для того чтобы правильно добавить данную деталь - необходимо ознакомится с инструкцией (во вложенииinstrukciyapodobavleniyudetalifaylyissylkivmobilnoeprilozhenie.doc
)

"Клименко Николай" написал:Данный функционал уже добавлен в детали "Файлы и ссылки".

Николай, спасибо за инструкцию!

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

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

"Клименко Николай" написал: задача очень трудоямка

Николай, согласен. Буду думать и искать...
Еще раз спасибо за помощь!

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