Вопрос

Здравствуйте.
При синхронизации мобильного приложения в оффлайн-режиме во время импорта данных возникает ошибка "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"]);

 

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

Такое есть?

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

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

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

Где именно Вы хотите видеть автонумерацию в мобильном приложении?

К примеру в разделе документ есть авто нумерация..а через мобильное там приходится указывать временный номер.

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

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

Только есть один момент.
1. В онлайн режиме если поле выведено поле с автонумерацией, то оно будет пустое при создании записи. Его не нужно заполнять (иначе логика не отработает). Номер отобразиться только после сохранения записи и при рефреше реестра. Мы рекомендуем скрыть данное поле для избежание путаницы.
2. В офлайн режиме номер присвоится только после синхронизации с сервером, так как логика реализована на серверной части. До синхронизации номер будет пустой.

Данные действия были протестированы на версии 7.10.2 (режим офлайн и онлайн).

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

Коллеги, добрый день!
Как можно изменить логотип bpm'online в мобильной версии приложения? Скриншот прикладываю во вложения.
Спасибо!

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

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

Загрузить файл логотипа в системную настройку "Логотип мобильного приложения"

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

Всем доброго времени суток.

Версия 7.10.

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

К примеру, кнопку, на которую добавлен вызов функции? Или создать свой контрол, генерирующий свой html-код?

Если да, то можно ли посмотреть примеры (хотя бы пример с кнопкой)?

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

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

Вот здесь, например есть инструкция по созданию своего контрола: http://www.community.terrasoft.ru/forum/topic/25285#comment-67717

Можно ли такое же сделать для мобильного приложения?

В конфиге вью определяем нужный контрол + метод для его отображения, а в контроллере завязываем на него обработчик:

Ext.define("...вью...", {
    config: {
       refreshButton: {
            id: 'usr_order_refresh_btn',
            cls: "x-button-primary-blue",
            text: 'Обновить'
        }
    },
    showRefreshButton: function (isShow) {
        var navigationPanel = this.getNavigationPanel(); /*компонент в котором нужно отобразить контрол*/
        var refreshButton = this.getRefreshButton();
        if (isShow) {
            this._refreshButton = navigationPanel.addButton(refreshButton);
        } else {
            navigationPanel.removeButton(refreshButton);
        }
        return this._refreshButton;
    }
});
Ext.define("...контроллер...", {
    initializeView: function (view) {
        this.callParent(arguments);
        var btn = view.showRefreshButton(true);
        btn.on("tap", this.onRefreshButtonTap, this);
    },
    onRefreshButtonTap: function() {
        /* сабж  */
    }
});

Ещё раз большое спасибо!

Два вопроса ещё есть:

1. Где-нибудь можно найти список компонентов? Вот, например, есть MobileOpportunityEditPage, можно ли кнопку добавить не на навигационную панель, а допустим прямо между колонками - как на картинке (не обязательно именно так, дизайн может быть любым.. вопрос в возможности)?

2. А если речь идёт именно о своём элементе? Допустим, просто вывести блок html.

Могу сказать, в принципе, чтобы было понятно: началось всё с идеи добавить туда canvas, для того, чтобы клиент мог подписать договор "на экране планшета". В браузерной версии всё по кр.мере понятно - там делается контрол по инструкции из комментария выше, и в нужное место на странице добавляется блок с канвасом. Далее делаются обработчики для него, и всё такое. А вот можно ли повторить это в приложении...

В таком случае можно свой контрол определить также, как и в инструкции для веб, и сделать так:

Ext.define("...контроллер...", {
	onLoadRecord: function(loadedRecord, callback) {
		  this.callParent([loadedRecord, function() {
				 var panelItems = this.getView().getPanel().getItems();
				  /* собственно здесь хранятся панели и детали страницы*/
				 var primaryColumnSet = panelItems.first(),
                                      control = this.getOurCustomControl(loadedRecord);
				 primaryColumnSet.add(control); //если добавляем в конце панели
                                 primaryColumnSet.insert(index, control); //в определенное место
		  }
	},
	getOurCustomControl: function(record) {
 
	}
}

А можно на примере - что может быть указано в getOurCustomControl во втором случае, если не трудно?
До конца не могу понять, как в этом случае правильно указывать.

Например, если я заменяю в showRefreshButton функцию this.getNavigationPanel() на this.getPanel().getItems().first() и далее addButton на add - то блок появляется на странице, но не виден из-за отсутствия текста в нём (а при addButton ошибка).

А например, this.getItems().first() - работает как getNavigationPanel.

onLoadRecord: function(loadedRecord, callback) {
      this.callParent([loadedRecord, function() {
         var panelItems = this.getView().getPanel().getItems();
          /* собственно здесь хранятся панели и детали страницы*/
         var primaryColumnSet = panelItems.first(),
              control = this.getOurCustomControl(loadedRecord);
         primaryColumnSet.add(control); //если добавляем в конце панели
      }]);
    },
    getOurCustomControl: function(record) {
		return '<div id="testDiv"></div>';
    },

В таком случае вываливается ошибка.

sencha-touch-all-debug.js:86794 Uncaught Error: [ERROR][Ext.Container#factoryItem] Invalid config, must be a valid config object

допустим так:

onLoadRecord: function(loadedRecord, callback) {
      this.callParent([loadedRecord, function() {
         var panelItems = this.getView().getPanel().getItems();
          /* собственно здесь хранятся панели и детали страницы*/
         var primaryColumnSet = panelItems.first(),
              control = this.getOurCustomControl(loadedRecord);
         control .on("tap", function () {
                        Terrasoft.MessageBox.showMessage("hello world");
         }, this);
         primaryColumnSet.add(control); //если добавляем в конце панели
      }]);
    },
    getOurCustomControl: function(record) {
                return Ext.create('Ext.Button', {
                      xtype: "button",
                      cls: "x-button x-button-link",
                      text: "?"
                    });
    }
}

Огромное спасибо! Теперь понял))

И всё-таки в качестве завершающего аккорда - можно ли вывести туда свой html код? Можно конечно сгенерить пустой блок и поставить туда через innerHTML, допустим такой код:

<div id="myDiv" style="width: 100%; height: 150px; background-color: #eee">Мой блок</div>

или тот же канвас, с которого всё начиналось:

<canvas id="myCanvas" width='350' height='150' style="background-color: #eee; border: 1px solid #ccc;"></canvas>

Но насколько правильно так поступать в данном случае? И будет ли это работать на всех видах устройств?

return Ext.create("Ext.Toolbar", {
            id: 'myCanvas-toolbar',
            html: "<canvas id="myCanvas" width='350' height='150' style="background-color: #eee; border: 1px solid #ccc;"></canvas>",
            height: '60px'
        })

Спасибо!!

Работает, больше вопросов наверно не имею)

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

Всем доброго времени суток.

Версия 7.10.

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

Рассмотрим ситуацию на примере страницы Контакта. У нас есть схема MobileContactPreviewPage, я на её основе создал свою UsrMobileContactPreviewPage и внутри Ext.define("ContactPreviewPage.Controller", {}); добавил метод (нашёл в других схемах):

initializeView: function(){
                this.callParent(arguments);
                console.log("initialized");
        }

Далее подключил свою схему с созданным методом в MobileApplicationManifestDefaultWorkplace.
Правильно ли я понял, что этот метод - и есть аналог onEntityInitialized? По крайней мере очень на то похоже, я попробовал внутри него обратиться к элементу DOM по id - и получил нужный элемент.

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

В браузерной версии для этого используются удобные методы this.get("Column") и this.set("Column",data). В мобильной, как мне удалось найти, можно писать бизнес-правила, но может быть можно и по другому их добавлять?

В принципе, по текущим бизнес-задачам возможно, что подставлять данные придётся внутри initializeView, после инициализации страницы, поэтому вопросы в целом связаны.

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

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

в контроллере можно переопределить такой метод:

onLoadRecord: function (loadedRecord, callback) {

/*loadedRecord - собственно сама запись*/

this.callParent(arguments);

/* после вызова родителя запись доступна во всем контроллере через this.record
и уже ей можно делать get и set
*/
}

Огромное спасибо!

Но есть вопрос:

loadedRecord, как я понял, работает только внутри функции? Например, сделал я кнопку, по инструкции из соседней темы, в функции-обработчике добавил:

onRefreshButtonTap: function(loadedRecord) {
        console.log(loadedRecord);
        loadedRecord.set("Probability",90, true)
 },

На set вываливается ошибка - не находит, куда добавить. Как быть в этом случае? Понятно, что onRefreshButtonTap вызывается уже после загрузки всего остального - по клику.

Если не потерялся scope, то - this.record.set

Спасибо!

Работает.

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

Коллеги, добрый день!
При создании активности с типом "Визит" после ее сохранения, в виде представления раздела "Расписание" в карточке изначально пишется время визита. Как его можно убрать?
Прикрепляю скриншоты, на которых видно, что сам заголовок активности формируется как и требуется. А в представлении "Расписание" перед заголовком указывается время визита, что необходимо убрать.

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

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

Владимир, рекомендую обратить внимание на схему MobileActivityGridPageControllerV2 в пакете Mobile.

"Мотков Илья" написал:

Владимир, рекомендую обратить внимание на схему MobileActivityGridPageControllerV2 в пакете Mobile.


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

В оффлайн режиме это достаточно сложно, поскольку не всегда есть доступ на сервер.

Не факт, что получится, можно рассмотреть вариант получения в приложении не только времени, а и часового пояса, и дальше дописать логику в десктопе для коррекции времени.

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