Вопрос

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

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

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

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

У меня такой же вопрос

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

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

  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)

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

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

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

У меня такой же вопрос

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

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

 

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

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

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

У меня такой же вопрос

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

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

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

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

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

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

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

На отдельной вкладке изменяю модуль-схему. Сохраняю. В эмуляторе жму синхронизация.Происходит синхронизация и перезапуск приложения-эмулятора. Проверяю изменения. И в это время вкладка с модулем-схемой сообщает о системной ошибке.

Сталкивались ли вы с таким поведением? Может это как то лечится?

У меня такой же вопрос

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

попробуйте очистить Redis и перезапустить application pool

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

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

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

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

Прикрепленные файлы
Log.txt221 байт
log.png29.71 КБ

У меня такой же вопрос

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

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

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

Была попытка в обработчике onEmbeddedDetailItemApplied контроллера добавить фильтр на поле Participant.

Примерно таким кодом:

var filter,
	filterName = "OnContactTypeFilter";
	filter = Ext.create("Terrasoft.Filter", {
		name: filterName,
		modelName: "Contact",
		assocProperty: "Id",
		property: "Type",
		value: "66a90515-0026-4f43-93a5-dc3e9c18f552"
	});
 
	record.changeProperty("Participant", {
		removeFilter: filterName
	});
	if (!Ext.isEmpty(filter)) {
		record.changeProperty("Participant", {
		addFilter: filter
	});
	}

Но это не возымело эффекта.

Где же еще можно настроить данный фильтр?

У меня такой же вопрос

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

Добрый день, Павел!

 

Судя по предоставленным данным у Вас некорректно настроена конструкция фильтра. Более правильно будет следующим образом:

filter = Ext.create("Terrasoft.Filter", {

name: filterName,

property: "Type",

value: "66a90515-0026-4f43-93a5-dc3e9c18f552"

});

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

Итак попытка добавить данную деталь в раздел Активности не увенчалась полным успехом.

Добавление происходило через мастер мобильного приложения.

Так же автоматом создало 3 схемы и замещающий манифест в текущем пакете.

При попытке добавить файл мы наблюдаем следующее, возможность добавить файл полностью отсутствует!!!

Что странно, когда используешь демо-версию мобильного приложения у раздела продажи предоставляется выбор добавить файл, сделать фото или добавить ссылку.

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

Опять же, пример который был описан на Академии по добавлению такой детали к разделу Контакт не увенчался успехом, а просто напросто свалил приложение с ошибкой синхронизации, что говорит о том, что скорее сего был как-то ошибочно замещен манифест данного приложения.

Вобщем коллеги, обращаюсь за помощью к вам.

Думаю не мне одному интересно как с этим справиться.

У меня такой же вопрос

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

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

У меня такой же вопрос

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

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

Если стенд разворачивается с нуля, проще всего подбросить резервную копию БД с первого стенда. В случае, когда стенд уже существует и разработка нового рабочего места велась в отдельном пакете, проверьте привязку данных - если ее нет, надо добавить и повторно накатить пакет.

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

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

Хотел бы узнать, может кто реализовывал похожую задачу глобального поиска контактов и контрагентов в мобильном приложении. Хотелось бы понять, можно реализовать, чтобы поиск в разделе контакты выдавал также и контрагентов с возможностью перехода? Или придётся реализовать отдельную страницу с поиском? Вижу еще проблему общего реестра результатов поиска - открытие в зависимости от типа, соответствующей карточки.

У меня такой же вопрос

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

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

Если вопрос в выборе из двух разделов, можно попробовать реализовать это путем создания представления в БД, куда слить эти два раздела и таким образом искать, хоть тогда остается актуальным вопрос выбора карточки.

Еще одна альтернатива - при идеальной ситуации, когда у каждого контрагента есть хоть 1 контакт, можно попробовать переписать поиск, чтобы в разделе контакты он выбирал не только по полю ФИО но еще и по полю Контрагент.

Здравствуйте, Илья, спасибо за ответ.

Первый способ подходит для основного приложения. Был реализован похожий кейс, но там есть возможность формирования адреса карточки, чтобы осуществить переход. Здесь такой фокус не проходит. Остаётся пока решение добавить в поиск на странице контактов и поле связанного контрагента, что собственно и было сделано с помощью инструкции

Terrasoft.sdk.GridPage.setSearchColumns("Contact", ["Name", "Account"]);

 

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