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

Версия 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.


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

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

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

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

версия: 7.8
Каким образом и где можно установить фильтр грида в секции раздела в мобильном приложении? Статей по мобильной разработке мало, ничего подходящего не нашел...

Нравится

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

Можно посмотреть вот эту тему - http://www.community.terrasoft.ru/forum/topic/15395

Пример есть также в конфигурации, в манифесте, для раздела активности.

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

Можно посмотреть вот эту тему - http://www.community.terrasoft.ru/forum/topic/15395

Пример есть также в конфигурации, в манифесте, для раздела активности.


Может сможете подсказать. В той теме хотя бы понял где и как устанавливать фильтр, но у меня не работает, и не совсем понятны некоторые моменты.
Мне надо отфильтровать Обращения, по состоянию, которые НЕ закрыты. Или хотя бы для примера SolutionOverdue, который означает "закрытие".
Добавляю в манифест фильтр:

"SyncFilter": {
					"property": "Status",
// Название модели, для которой выполняется фильтрация.
					//"modelName": "Case",
// Колонка связанной модели, по которой осуществляется связь с основной моделью.
					//"assocProperty": "Id",
					//"operation": "Terrasoft.FilterOperations.Any",
					"compareType": "Terrasoft.ComparisonType.NotEqual",
					//"value": {
						//"value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38",
						//"displayValue": "Закрыт"}
                                        "value": "3e7f420c-f46b-1410-fc9a-0050ba5d6c38"
				},

Пробовал и так и сяк, при синхронизации в мобиле выдает ошибку.
Пробовал еще такой фильтр:

"SyncFilter": {
					"type:" "Terrasoft.FilterTypes.Simple",
					"property": "SolutionOverdue",
					"compareType": "Terrasoft.ComparisonType.Equal",
					"value": true
				},

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

Подскажите что не так делаю, и вообще объясните моменты с modelName и assocProperty - для чего эти значения. Коммент в примере совсем не понятно что имеется ввиду.

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

Здравствуйте!
Возникла проблема загрузки мобильного приложения.
Мобильное приложение на локальном стенде в определённый момент перестало загружаться
на запросе http://localhost:30821/0/Mobile/Services/MobileCodeService.ashx?function...
с исключением:

Terrasoft.Common.ItemNotFoundException: Элемент с именем "UsrMobileApplicationManifest" не найден в Terrasoft.Core.ManagerItemCollection`1.GetByName(String name) в Terrasoft.Mobile.MobileClientUnitSchemaUtils.GetSchemaHierarchy(String schemaName) в Terrasoft.Mobile.MobileUtilities.GetLoadedManifest(String workplaceCode) в Terrasoft.Mobile.MobileUtilities.GetAppMetadata(HttpContextBase context) в Terrasoft.WebApp.Mobile.Services.MobileCodeService.ProcessRequest(HttpContext context)

Этого элемента никогда не было в конфигурации и никогда не должно было быть!
Может кто-нибудь сталкивался с таким поведением? Диагностику подробнее провести не удаётся.
Причём восстановление заново БД не помогло, не помогла и чистка редиса.
Основное приложение работает!

Версия основного приложения 7.9.1, мобильное приложение 7.x - предоставлено для разработки компанией Террасофт.

P.S. 7.8.0 также установленное рядом работает, в том числе и мобильное...

Нравится

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

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

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

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

Здравствуйте, Илья!
В общем, обновив приложение мобильное до 7.10.2, ошибка ушла. Очень странное поведение. Как может приложение работать, а потом перестать, но обновившись - снова продолжать работать...

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

Коллеги, добрый день!
Есть ряд вопросов, на которые я не смог найти ответов:
1. Как реализовать возможность выбора презентации из списка, при выполнении действия на визите "Показ презентации"? На текущий момент есть возможность добавить несколько статей в "Правила полевых продаж" -> "Правила визита к врачу" -> "Показ презентации", но при выполнении соответствующего действия на визите открывается презентация автоматически одна, не давая возможность выбрать. Да, остальные статьи прикрепляются в "Файлы и ссылки", но это совершенно не то, что хотелось бы. Можно с этим что-нибудь сделать?
2. Как можно сделать так, чтобы пользователь мог копировать "блоками" из раздела "Активности" свои визиты (представления реестра - "Расписание"). Пример. Пользователь добавляет активности на сегодня, 5 визитов. Он точно понимает, что ему ровно такие же визиты необходимо будет совершить завтра, через 5 дней, и еще через n-ое кол-во времени. По сути, меняется только дата начала и завершения.
Удобнее всего копировать целый день визитов, и переносить их на другую дату. По одному визиту копировать не серьезно, и не удобно.
3. Почему при создании визита, при указании времени визита случается такая ситуация - дата начала по умолчанию выставляется как "Текущая дата и время". Тут вопросов нет. А дата завершения устанавливается по умолчанию как "Текущая дата и время" +30 минут. Знаю, что эти "30 минут" устанавливаются и регулируются в справочнике, про который я писал в первом пункте. Но дело в том, что если при создании визита, ставлю, например 50 минут вручную, или 15 минут, меняю дату на "завтра", то при сохранении активности дата завершения ВСЕГДА устанавливается как "Дата начала визита" +30 минут? Как это исправить, и предоставить возможность выбора, оставив возможность устанавливать время продолжительности визита по умолчанию?

Нравится

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

Добрый день, Владимир!

Согласно Вашего комментария созданы проблемы/пожелания на команду разработки продукта по вопросам 1 и 3. Номера проблем 6543 и 6544 соответственно.
Что касается второго вопроса, то вероятно Вам подойдет функционал "Цикловых заданий", который уже реализован в версии 7.10. Для его использования необходимо обновится на последнюю версию и установить пакеты полевых продаж, в результате чего появится раздел "Цикловые задания" (к сожалению, пока еще информация про данный раздел не добавлена в руководство пользователя, но вопрос уже в проработке и статья появится в ближайшее время).

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

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

Нравится

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

Владимир, здравствуйте!

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

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

Здравствуйте.
Возникла проблема при добавлении на страницу мобильного приложения, например Контрагента, действия с созданием новой активности. В недрах кода MobileAccountModuleConfig пакета Mobile нашёл нечто похожее с использованием функции Terrasoft.sdk.Actions.add, но её описания нигде не нашёл. Быть может кто обладает им... В частности, есть атрибут actionClassName, что он означает, и как с ним работать. Был бы благодарен за пример...
Дополнительно, за что отвечает переменная UseMobileUIV2?

Нравится

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

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

Terrasoft.sdk.Actions.add – это метод, который позволяет добавить действие в раздел (рис. 1-2). Примеры реализаций прикрепил к комментарию.


naznachitvstrechu.doc
polzovatelskoedeystvie.doc

UseMobileUIV2 – это системная настройка, которая необходима если выходите использовать новую платформу V2.

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

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

Добрый день!

Какие изменения в основном приложении синхронизируются с мобильным приложением?
Новые разделы и справочники в мобильное приложение добавились.
После решила попробовать сделать другое изменение согласно данной статьи :
https://academy.terrasoft.ru/documents/technic-sdk/7-8/vydelenie-cvetom-...

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

Нравится

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

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

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

Для реализации в мобильной версии необходимо переопределить логику манифеста мобильного приложения. По умолчанию это MobileApplicationManifestDefaultWorkplace.

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

Добрый день!

Можно ли для мобильного приложения добавить валидацию к полю или, например, ограничение (для даты)?

Нравится

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

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

Уточните, пожалуйста, какую валидацию вы хотите настроить?

"Демьяник Алексей" написал:

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

Уточните, пожалуйста, какую валидацию вы хотите настроить?


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

Я хочу сделать так, чтобы нельзя было выбрать дату меньше текущей.

Здравствуйте.
Есть пример реализации в MobileActivityModelConfig. В «Активностях», по умолчанию, не разрешается устанавливать дату начала больше даты завершения активности.

Terrasoft.sdk.Model.addBusinessRule("Activity", {
ruleType: Terrasoft.RuleTypes.Comparison,
triggeredByColumns: ["StartDate"],
leftColumn: "DueDate",
comparisonOperation: Terrasoft.ComparisonTypes.GreaterOrEqual,
rightColumn: "StartDate"
});

Terrasoft.sdk.Model.addBusinessRule("Activity", {
ruleType: Terrasoft.RuleTypes.Comparison,
triggeredByColumns: ["DueDate"],
leftColumn: "StartDate",
comparisonOperation: Terrasoft.ComparisonTypes.LessOrEqual,
rightColumn: "DueDate"
});

Спасибо большое!

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

"Колебянов Виталий Романович" написал:

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

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

"Вильшанский Дмитрий" написал:
Колебянов Виталий Романович пишет:

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

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

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

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

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

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