Перейти к содержанию

Шаблоны задач

Общие моменты о кастомных шаблонах

Шаблоны описывают, как задача будет отображаться в мобильном приложении в соответствующем контексте. Сейчас в приложении поддерживаются три контекста шаблона — карточка задачи, карточка новой задачи или элемент списка задач. Для каждого из этих контекстов может быть настроен свой шаблон.

ℹ️ Мобильные шаблоны, настроенные в "Первой Форме", хранятся в конфигурационном файле. См. Руководство по техническому обслуживанию.

Создание шаблона

Для создания нового шаблона нажмите кнопку + Создать. Откроется окно настройки шаблона. После ввода настроек нажмите кнопку Сохранить, и шаблон отобразится в общем списке.

Изменение шаблона

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

Параметр Описание
ID ID шаблона
Имя Имя шаблона
Описание Описание шаблона
Контекст Контекст шаблона:
-Cell
-MTF
-NTF
Тип Тип шаблона:

-static (статический), -dynamic (динамический). Статические шаблоны создаются разработчиками и поставляются вместе с приложением. Динамические шаблоны создаются и настраиваются администраторами | Язык | Язык интерфейса мобильного приложения, которому соответствует данный шаблон. Отображается в колонке «Текущий язык» списка шаблонов. Если не задан, шаблон используется как базовый для всех языков. | | --- | --- | | Категория | ID категории, для которой предназначен шаблон (для статических шаблонов указывать не обязательно) | | Шаблон | Окно шаблона задачи | | Старый шаблон | Сворачиваемое окно просмотра предыдущей версии шаблона |

Для шаблона нажмите кнопку Удалить в окне редактирования. При этом появится окно подтверждения. Для подтверждения удаления нажмите Ок. Если действие было сделано ошибочно, нажмите Отмена.

Локализация шаблона задачи

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

Добавление локализации

Для добавления новой локализации нажмите кнопку +Создать. Откроется форма «Локализованное содержимое шаблона задач»:

Поле Описание
Шаблон Шаблон задачи, для которого создаётся локализация (заполняется автоматически)
Язык Язык интерфейса мобильного приложения, для которого применяется данное содержимое
Содержимое JSON-содержимое шаблона на указанном языке
Старое содержимое Содержимое предыдущей версии шаблона — только для просмотра

После заполнения нажмите кнопку Добавить.

Удаление локализации

Для удаления локализации нажмите кнопку Удалить в строке списка или на форме редактирования.

Настройка динамических шаблонов

В системе можно настраивать три вида шаблонов для каждой категории:

  • NTF — вызывается при создании новой задачи (NTF — сокращение от New Task Form),

  • MTF — вызывается при просмотре задачи (MTF — сокращение от Main Task Form),

  • Cell — используется для краткого отображения задачи в списке задач (cell — это ячейка).

Эти шаблоны назначаются в настройках категории, на вкладке Вид, по кнопке Шаблонизация. Для редактирования динамического шаблона можно использовать JSON-редактор.

Каждый вид шаблона имеет свои особенности — в нем могут быть допустимы или недопустимы отдельные ключи и настройки.

ℹ️ При отрисовке cell шаблона в случае owner, performers, ДП выбор пользователя перед заголовком элемента и именем пользователя рисуется аватар размером height, то есть высота элемента сразу же идет по высоте аватара. Если height не указан, то по умолчанию для таких элементов height 32.

Структура шаблона

В базовом варианте динамический шаблон задачи — это JSON трехуровневой структуры: sections -> blocks -> elements. Также может присутствовать необязательный раздел настроек settings, как для всего шаблона, так и для отдельных элементов.

Структура в JSON:

{"settings":{}*,   "sections": [       {           "name": "...",

"blocks": [               {                  "name": "...",               "settings":{}*,                   "elements": \                       {                           "name": "...",                           "type": "...",                           "dataKey": "...",                           "viewMode": "...",                           "settings": {...}*                       },                         ...

}           ]       },

...

\,]

"settings": {...} } // * - необязательный параметр В шаблоне MTF раздел Sections соответствует вертикальным вкладкам (секциям), раздел blocks — горизонтальным блокам, раздел elements - элементам. В настоящее время блок в секции может быть только один.

Если шаблон NTF включает несколько секций, то они будут отображаться пользователю не одновременно в виде вкладок, а последовательно в виде отдельных экранов, имитируя пошаговое создание задачи. На каждом таком экране будет отображаться кнопка Далее, на последнем экране — кнопка Готово.

Секции (sections)

Шаблон содержит одну или несколько секций.

Каждая секция (из массива sections) содержит ключи:

Ключ Описание name Имя blocks Массив блоков в секции. В настоящее время внутри секции лучше использовать только один блок (функционал дорабатывается) isDefault Опциональный. При открытии задачи по умолчанию будет открываться секция со значением параметра true isPushOpenDefault Опциональный. При открытии задачи через пуш по умолчанию будет открываться секция со значением параметра true alias Опциональный. Текстовое поле. Данный ключ задается некий уникальный идентификатор, по которому в дальнейшем возможно настроить проваливание по смарт пушу через настройки кастомных параметров settings Настройки секции

Пример шаблона с двумя секциями:

{\    "sections": [\      {\           "name": "Вкладка 1",\           "blocks": []\      },\      {\           "name": "Вкладка 2",\           "blocks": []\      }\    ]\ }

Блоки (blocks)

Каждый блок (из массива blocks) может содержать ключи:

Ключ Описание
name Имя
elements Массив элементов в блоке
settings Опциональный. Настройки блока.

Пример значения: "settings": {                       "titleColor": "#000000",                       "titleSize": 18,                       "titleFontWeight": "medium",                       "textItalic": true,                       "align": "center"               }

Элементы (elements)

Каждый элемент (из массива elements) может содержать ключи:

Ключ

Описание

name

Имя

type

Тип элемента. Возможны значения:

allExtParams

Выводит список всех ДП категории. Рекомендуется настраивать на всю секцию как комплексный параметр

mainParam

Основные параметры

extparam

ДП

dataKey

Для ДП ("type":"extparam") в dataKey указывается ID ДП.

Для основных параметров задачи ("type":"mainParam") dataKey может принимать следующие значения:

category

Категория

taskNum, taskId

Номер задачи

taskText

Текст задачи

owner

Заказчик

createdDate

Дата создания

orderedDate

Срок

state

Статус

priority

Приоритет

performers

Исполнители

buttons

Кнопки переходов

usedTasks

Блок "Используется"

stateAction

Список возможных переходов.

Комбо элемент из статуса и кнопок переходов, отображается как синяя кнопка с текущим статусом, при нажатии появляется меню со всеми возможными переходами и смарт-кнопками.

Если переходов/смарт-кнопок нет, то кнопка серая, некликабельная

files

Файлы

subscribers

Подписчики

tags

Теги

hierarchy

Иерархия

defaultValue

Значение по умолчанию. Например:

"defaultValue":33

Для ДП Lookup задается JSON:

"defaultValue": {"taskId": 123456, "taskText": "Компания Ромашка"}

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

viewMode

Тип отображения. Возможные значения:

normal

Для элементов, занимающих часть блока

valueOnly

Если элемент занимает часть блока и отображается только значение элемента, а название не отображается (например, в шаблоне карточки задачи так часто отображается текст задачи)

full

Для элементов, занимающих весь блок и всю вкладку (например, лента комментариев)

title

Для заголовка

ℹ️ Используется только в шаблонах для краткого отображения и для одного поля, которое должно отображаться как заголовок ячейки. Для этого поля не нужен ключ name

compact

Заголовок рядом с ним значение

none

Не показывать

imagePreview

Картинки в виде карусели

checklist

Чеклист

stars

Звезды оценки (0-5)

button

Для cell, статус в виде кнопки

docScan

round

Скругленная картинка (например, аватар)

icon

Название значка

ℹ️ Используется только для Android

placeholder

Строка с пояснением, которая отображается при пустом значении ячейки

readOnly

true \ false

Ячейка доступна только для чтения.

Значение ключа указывается без кавычек:

"readOnly": true

alias

Возможные значения:

  • image

  • leftimage

  • rightimage

  • title

  • subtitle

  • value

hint

Подсказка для поля дп. При указании данного ключа справа появляется кнопка i, при нажатии на которую отображается информационное окно

text

Текст, который будет отображаться вместо значения ДП

settings

Настройки определенного элемента (элемента, блока, шаблона в целом)

isHidden

Настройка скрытия ДП true/false

Пример настроенного шаблона с элементами:

[

{\       "name": "Договор",\       "type": "mainParam",\       "dataKey": "taskText",\       "viewMode": "normal",

"readOnly": true\  },

{\       "name": "От",\       "type": "mainParam",\       "dataKey": "owner",\       "viewMode": "normal",

"readOnly": true\  },

{\       "name": "Участники встречи",\       "type": "exparam",\       "dataKey": "182",\       "viewMode": "normal",

"readOnly": true\  }

]

Настройки (settings)

Настройки можно описать с помощью раздела settings. Общие настройки для всего шаблона должны идти перед или после раздела sections. Собственные настройки могут быть у каждого элемента.

Значения settings по умолчанию:

  • fontSize — 17px

  • textColor — grey

  • titleSize — 17px

  • titleColor — black

  • titleFontWeight — regular

  • textItalic — false

  • bgColor — пусто

  • align — left

В разделе settings могут настраиваться следующие ключи

Ключи settings

Ключ Описание Вид шаблона
afterTaskCreationBehaviour Поведение после создания задачи. только для шаблона NTF
closeTask - сразу после создания карточка задачи будет закрыта
alwaysShowTabMenu true / false. Отображение меню вкладок шаблона. Если true - меню вкладок отображается только для шаблона MTF
usedBlockTables JSON со списком настроек блоков "Используется" только для шаблона MTF
align left / right / center. Выравнивание текста. \
allowCommentToAll true / false. Только для элемента comments. только для шаблона MTF
Разрешено отправлять комментарии без адресатов, т.е. всем подписчикам задачи
commentTypes Типы комментариев, которые будут отображаться в ленте. Только для элемента comments. только для шаблона MTF
Передается в виде массива, например:
"commentTypes": [3,15]
forbidOfflineChange Ячейка блокируется от нажатия при отсутствии подключения к интернету. В настоящее время работает только для ячейки buttons \
forbidOpen true / false. Блокирование ячейки для открытия. При просмотре списка задач нельзя перейти в карточку задачи только для шаблона Cell
hideInfoButton true / false. Признак, скрывать ли значок i рядом с ячейкой для ДП Lookup. \
hideSubscribers true / false. Только для элемента comments. только для шаблона MTF
При написании комментария не отображать подписчиков (например, чтобы пользователь не видел, кто еще участвует в обсуждении)
cameraInput Позволяет заполнять дп (мульти)файл с помощью камеры. Параметр "isContinuous": true позволяет делать фото непрерывно для шаблонов NTF, MTF
fontSize Регулирует размер шрифта текста \
textColor Дает возможность управлять цветом текста \
titleSize Регулирует размер шрифта заголовка \
titleColor Дает возможность управлять цветом заголовка \
titleFontWeight Дает возможность управлять жирностью текста \
textItalic Дает возможность сделать текст прописным \
bgColor Фон текста \
columns Параметр для ДП таблица. Позволяет управлять отображением колонок таблицы. Имеет параметры "compact":\ - список столбцов, которые необходимо показать на мтф задачи, "full":\ - список столбцов, которые нужно показывать при проваливании в строку таблицы для шаблонов NTF, MTF
links Параметр для текстовых ДП. Обозначает какие типы ссылок нужно выделять как ссылки. Возможные параметры в массиве: "http", "phone", "email"\ для шаблонов NTF, MTF
showClearButton/showClearButtonWithConfirm true / false. ключи для текстовых ДП и ДП Lookup. Определяю нужно ли показывать крестики очистки в полях ДП или нет. Отличие между в модальком окне с подтверждением действия, которое появляется при одном из них \
allowCodeScanInput true / false. При true справа у текстового поля дп отображается иконка qr кода для заполнение через сканирование \
activeOnShowSection true / false. Означает поставить фокус в текстовом ДП. \
Если в настройках стоит activeOnShowSection = true,
это значит в случае allowCodeScanInput= true, что нужно автоматически открыть только в НТФ сканер кода при открытии НТФ
maxLineCount Максимально количество строк для вывода таблицы \
width Ширина отображения в относительных единицах \
verticalAlign Веритикальное выравнивание \

Возможные значения:

-top

-center

-bottom | showDisclosureIndicator | \ | \ | | --- | --- | --- | | templateClass | \ | \ | | showTaskFilter | Показывать/скрывать фильтр задач (true/false) | \ | | viewMode | Режим отображения | \ | | allowSorting | По умолчанию true. Разрешает/запрещает сортировку | \ | | createButton | Помогает настроить отображение кнопки создания задачи | только для шаблона NTF
Пример настройки:
"settings": {
"createButton": {
"title": "Заказать пропуск"
} | | header | Помогает настроить заголовок экрана при создании задачи | только для шаблона NTF
Пример настройки:
"header": {
"title": {
"text": "Заказать пропуск",
"settings": {
"titleColor": "#FFFFFF"
}
},
"subtitle": {
"text": "Парковка автомобиля разрешена только в специально отведенных для этого парковочных пространствах",
"settings": {
"titleColor": "#FFFFFF"
}
},
"bgImage": {
"gradient": \
"#00000033",
"#000000CC"
\,
"url": "http://test.iospro.ru/pass.png"
},
"settings": {
"ratio": 1.7,
//"height": 100
}
} | | subtitle | Помогает настроить текст над НТФ задачи | только для шаблона NTF
Пример:
"subtitle": {
"text": "",
"settings": {
"titleColor": "#FFFFFF"
}
} | | bgImage | Настраивает фоновую картинку над НТФ задачи | только для шаблона NTF
Пример настройки:
"bgImage": {
"gradient": \
"#00000033",
"#000000CC"
\,
"url": "http://test.iospro.ru/pass.png",
"alpha": 1
},
"settings": {
"ratio": 1.7,
"_height": 100
}
} | | regExp | Регулярное выражения для проверки ввода в поле | для шаблонов NTF, MTF | | capsInput | Делает все вводимые символы по умолчанию заглавными | для шаблонов NTF, MTF | | showLookupCreateButton | Показывает/скрывает кнопку создания задачи в категории просматриваемого лукапа. Если у пользователя нет прав на создание задач в категории лукапа, то кнопка не отображается | для шаблонов NTF, MTF | | onChangeCopyTo | Помогает сделать кликабельную таблицу из ДП Lookup. | для шаблонов NTF
Пример настройки:
{
"type": "extparam",
"name": "Избранное",
"dataKey": 44481,
"viewMode": "table",
"settings": {
"onChangeCopyTo": {
"type": "extparam",
"dataKey": 44471
}} | | prefix | Элемент типа строка, который подставляется перед основным введенным текстом в главном или доп.параметре | для всех шаблонов
{
"_name": "Номер телефона гостя",
"type": "extparam",
"dataKey": 35,
"viewMode": "normal",
"settings": {
"links": \
"phone"
\,
"showClearButton": true,
"prefix": "+"
}
}, | | afterLastSignBehaviour | { | для шаблонов MTF
"settings": {
"showSignatures": true,
"afterLastSignBehaviour": "none"
} | | showLocation | { | для шаблонов MTF
"type": "extparam",
"dataKey": 2303,
"viewMode": "normal",
"_name": "",
"readOnly": true,
"text": "Показать объект на карте",
"settings": {
"hideInfoButton": true,
"showLocation": true,
"height": 52
}
} | | tableId | ID таблицы БИ для секции | для шаблонов MTF | | closeAfterSelect | Для ДП текст, поддерживающего suggestType в настройках, у нас есть ключ element.settings.closeAfterSelect Boolean. | для шаблонов NTF, MTF
Если closeAfterSelect = true, то после выбора значения из списка подсказок закрывается модальное окно и выбранное значение сразу подставляется в ДП.
{
"type": "extparam",
"dataKey": 6019,
"viewMode": "normal",
"name": "Текст",
"settings": {
"closeAfterSelect": true
}
} | | showAddButtonInNavigationBar | Отображать иконку плюса с списком addButton в верхнем тулбаре (true/false) | только для шаблона Cell |

Список действий (options) в MTF задачи

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

Пример на Android:

Пример на iOS:

Ключ Описание avatar Изменение аватара задачи files Вложения resources Ресурсы signatures Подписи createSubtask Создать подзадачу createLinkedTask Создать связанную задачу createLinkedEvent Создать новую задачу videoConference Видеоконференция (комната ВКС задачи) shareToChat Поделиться в чате. Переслать задачу в один из чатов внутри МП share Поделиться задачей вне МП. Переслать в другие приложения mute Переключить признак "бесшумного" режима (без звуковых уведомлений) changeTaskText Изменение текста задачи pin Закрепить задачу в списке чатов /Открепить задачу из списка чатов favorites Добавить в Избранное / Удалить из Избранного

Пример настройки подраздела options:

"settings": {    "options": {      "signatures": true,      "resources": true,      "createSubtask": true,      "createLinkedTask": true,      "createLinkedEvent": true,      "pin": true,      "favorites": true,      "mute": true,      "videoConference": true,      "share": true,      "shareToChat": true    }  },  "sections": [    {      "name": "",      "blocks": [        {          "name": "Main",          "elements": \            {              ...            }            ]          }  ] } Пункты меню Options по умолчанию

В карточке задачи:

  • avatar

  • resources

  • signatures

  • createSubtask

  • createLinkedTask

  • createLinkedEvent

  • videoConference

  • shareToChat

  • share

  • mute

  • pin

  • favorites

В чате:

  • files — отображается, если в задаче есть файлы

  • videoConference

  • mute

  • Покинуть чат (Вне ключей), если пользователь не владелец

В групповой чате:

  • avatar (отдельно при тапе на аватар)

  • files — отображается, если в задаче есть файлы

  • changeTaskText

  • videoConference

  • mute

  • Покинуть группу (Вне ключей), если пользователь не владелец

  • pin

В канале:

  • files — отображается, если в задаче есть файлы

  • changeTaskText — отображается, если пользователь владелец

  • mute

  • Отписаться(Вне ключей), если пользователь НЕ владелец

В задаче с ключом viewMode = chat:

  • avatar (отдельно при тапе на аватар)

  • files — отображается, если в задаче есть файлы

  • changeTaskText

  • videoConference

  • mute

  • Отписаться(Вне ключей), если пользователь НЕ владелец

  • pin

Представления дополнительных параметров

ДП LookUp

ViewMode = table

На форме карточки создания задачи пользователь может настроить представление таблицы для ДП LookUp, чтобы было более удобно выбирать возможные значения из списка. Ключевой момент при настройки в шаблоне — это viewMode = table.

При таком значении в МП реализуется отдельный табличный вид показа значений ДП LookUp (администраторы должны использовать его в случае, когда мало значений, и стоит учитывать, что в МП будут отображаться все значения ДП LookUp)

ДП Таблица

ViewMode = docScan

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

Кнопка "+" переводит секцию в режим редактирования фото — открывается фотозахват. На данном экране пользователь может поочередно сканировать (делать фото) и заполнять имеющиеся в таблице ДП Файл. Также на данном экране есть возможность удаления и редактирования сделанных снимков, которые располагаются внизу экрана в виде галереи превью из текущей секции.

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

Пример шаблона для настройки:

{  "name": "Сканирование документов",  "type": "extparam",  "dataKey": 31391,  "viewMode": "docScan", // новый тип viewMode для ДП таблицы типа чеклиста  "placeholder": "Открыть сканер!", // в МТФ пишем фразу если ни одного файла еще нет в таблице  "settings": {          "labels": {                  "title": "Сканирование!", // тайтл при показа кастомного экрана с таблицей                  "stop": "Завершить!", // кастомизация кнопки завершить сканирование                  "next": "Далее!" // кастомизация кнопки создания следующей строки в таблице          },          "columns": {                  "type": 12671, // номер ДП, откуда брать названия для колонки Тип в таблице, когда создаем новую строку сканов                  "files": \ // старая реализация еще на базе ДП файл без мульти, ровно как в чеклисте                          12621,                          12631,                          12641,                          12651,                          12661          }  } } ViewMode = checklist

Пример шаблона для настройки:

{  "sections": [    {      "blocks": [        {          "_name": "",          "elements": [            {              "dataKey": 14348,              "name": "Чеклист",              "readOnlyStatus": \                3,                4              \,              "settings": {                "actions": {                  "buttons": [                    {                      "clearData": true,                      "color": "#00A550",                      "value": "Да"                    },                    {                      "clearData": false,                      "color": "#C32429",                      "onclick": {                        "require": \                          5860                        \,                        "subform": "details",                        "title": "Поручение"                      },                      "value": "Нет"                    },                    {                      "clearData": false,                      "color": "#007AFF",                      "value": "Не проверял"                    }                  \,]                  "id": 5857                },                "columns": {                  "answer": 5857,                  "comment": 5859,                  "complain": 5860,                  "description": 5855,                  "dueDate": 5861,                  "files": {                    "epFileIds": \                      5865,                      5866,                      5867                  },                  "function": 5854,                  "hint": 5856,                  "num": 5852,                  "performer": 5862,                  "place": 5853,                  "score": 5858,                  "taskId": 5863                },                "details": [                  {                    "column": 5853,                    "readOnly": true                  },                  {                    "column": 5854,                    "readOnly": true                  },                  {                    "column": 5855,                    "readOnly": true                  },                  {                    "column": 5857,                    "readOnly": true,                    "viewMode": "valueOnly"                  },                  {                    "column": 5860                  },                  {                    "column": 5861,                    "placeholder": "не установлен"                  },                  {                    "column": 20751,                    "placeholder": "не установлен"                  },                  {                    "column": 5862,                    "name": "Ответственный сотрудник",                    "placeholder": "не выбран"                  },                  {                    "addButtonTitle": "Добавить фото",                    "columns": \                      5865,                      5866,                      5867                    \,                    "name": "Фотографии",                    "placeholder": "фото не вложено",                    "viewMode": "multiFile"                  }                \,]                "showStatistics": true,                "summary": {                  "counters": \                    {                      "color": "#FF0000",                      "counterColumId": 2,                      "sectionColumnId": 1                    },                    {                      "color": "#0000FF",                      "counterColumId": 3,                      "sectionColumnId": 1                    }                  \,                  "tableId": 1                },                "tree": {                  "column": 5853,                  "next": "push",                  "tree": {                    "column": 5854,                    "next": "expand"                  }                }              },              "type": "extparam",              "viewMode": "checklist"            },            {              "_name": "Переходы",              "dataKey": "stateAction",              "name": "",              "settings": {                "forbidOfflineChange": true              },              "type": "mainParam",              "viewMode": "normal"            }          ]        }      \,]      "name": "Чеклист"    }  ] } ДП Файл

Сканирование документов (считывание данных с фото)

Пример

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

Пример шаблона:

{    "settings": {        "showSignatures": true,        "afterLastSignBehaviour": "none"    },    "sections": [        {            "name": "Documents",            "blocks": [                {                    "name": "Passport data",                    "settings": {                        "titleFontWeight": "medium",                        "titleSize": 18,                        "titleColor": "#000000"                    },                    "elements": [                        {                            "name": "First page of the passport",                            "type": "extparam",                            "dataKey": 767,                            "viewMode": "normal",                            "readOnly": true,                            "settings": {                                "hideInfoButton": true                            }                        },                        {                            "name": "Take a passport photo",                            "type": "extparam",                            "dataKey": 2079,                            "viewMode": "normal",                            "placeholder": "",                            "settings": {                                "inputSources": \                                    "recognizeSE"                                \,                                "recognizeSE": {                                    "documentType": "rus.passport.national",                                    "keys": \                                        "number",                                        "series",                                        "surname",                                        "name",                                        "patronymic",                                        "authority",                                        "issue_date",                                        "birthplace",                                        "authority_code",                                        "gender",                                        "birthdate"                                    \,                                    "mapping": [                                        {                                            "id": 3137,                                            "format": "[number\"]                                        },                                        {                                            "id": 3136,                                            "format": "[series\"]                                        },                                        {                                            "id": 42,                                            "format": "[surname\"]                                        },                                        {                                            "id": 43,                                            "format": "[name\"]                                        },                                        {                                            "id": 44,                                            "format": "[patronymic\"]                                        },                                        {                                            "id": 3138,                                            "format": "[authority\"]                                        },                                        {                                            "id": 666,                                            "format": "[issue_date\"]                                        },                                        {                                            "id": 3139,                                            "format": "[birthplace\"]                                        },                                        {                                            "id": 3210,                                            "format": "[authority_code\"]                                        },                                        {                                            "id": 5637,                                            "format": "[birthdate\"]                                        },                                        {                                            "id": 5638,                                            "format": "[gender\"]                                        }                                    ]                                }                            }                        },                        {                            "name": "Attach passport file",                            "type": "extparam",                            "dataKey": 5428,                            "viewMode": "normal"                        },                        {                            "_name": "Фамилия",                            "type": "extparam",                            "dataKey": 42,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Имя",                            "type": "extparam",                            "dataKey": 43,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Отчество",                            "type": "extparam",                            "dataKey": 44,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Серия паспорта",                            "type": "extparam",                            "dataKey": 3136,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Номер паспорта",                            "type": "extparam",                            "dataKey": 3137,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Дата выдачи",                            "type": "extparam",                            "dataKey": 666,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Кем выдан",                            "type": "extparam",                            "dataKey": 3138,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Код подразделения",                            "type": "extparam",                            "dataKey": 3210,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Место рождения",                            "type": "extparam",                            "dataKey": 3139,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Дата рождения",                            "type": "extparam",                            "dataKey": 5637,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Пол",                            "type": "extparam",                            "dataKey": 5638,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        }                    ]                },                {                    "name": "Permanent registration address",                    "settings": {                        "titleFontWeight": "medium",                        "titleSize": 18,                        "titleColor": "#000000"                    },                    "elements": [                        {                            "name": "Passport photo with registration",                            "type": "extparam",                            "dataKey": 6578,                            "viewMode": "normal",                            "settings": {                                "hideInfoButton": true                            },                            "readOnly": true                        },                        {                            "name": "Take a passport photo with registration",                            "type": "extparam",                            "dataKey": 3259,                            "viewMode": "normal",                            "placeholder": "",                            "settings": {                                "inputSources": \                                    "recognizeSE"                                \,                                "recognizeSE": {                                    "documentType": "rus.passport.registration",                                    "keys": \                                        "region",                                        "city",                                        "street",                                        "house",                                        "building",                                        "apartment"                                    \,                                    "mapping": [                                        {                                            "id": 3258,                                            "format": "[region\, \city\, \street\"]                                        },                                        {                                            "id": 258,                                            "format": "[house\"]                                        },                                        {                                            "id": 2107,                                            "format": "[building\"]                                        },                                        {                                            "id": 2221,                                            "format": "[apartment\"]                                        }                                    ]                                }                            }                        },                        {                            "name": "Attach a passport file with registration",                            "type": "extparam",                            "dataKey": 5429,                            "viewMode": "normal"                        },                        {                            "_name": "Адрес прописки",                            "type": "extparam",                            "dataKey": 3258,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Дом",                            "type": "extparam",                            "dataKey": 258,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "name": "Корпус",                            "type": "extparam",                            "dataKey": 2107,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        },                        {                            "_name": "Квартира",                            "type": "extparam",                            "dataKey": 2221,                            "viewMode": "normal",                            "settings": {                                "showClearButton": true                            }                        }                    ]                }    ] } С помощью данного функционала возможно считывание и дальнейшее автозаполнение не только с первой страницы паспорта, но и со страницы с пропиской гражданина РФ.

ℹ️ Для работы данного функционала нужна лицензия

ViewMode = imagePreview

Отображает изображение в виде плитки с указанной высотой и соотношением сторон. Доступен как для шаблона cell, так и для MTF.

Пример шаблона:

{  "settings": {    "viewMode": "flat",    "showTaskFilter": false,    "showDisclosureIndicator": false  }, [  "sections": \    {      "name": "", [      "blocks": \        {          "elements": \            {              "type": "extparam",              "name": "",              "dataKey": 752,              "viewMode": "imagePreview",              "settings": {                "ratio": 1.5,                "cornerRadius": 0,                "_height": 200              }            },            {              "type": "mainParam",              "name": "",              "dataKey": "taskText",              "viewMode": "valueOnly",              "settings": {                "fontWeight": "medium",                "textColor": "#000000",                "fontSize": 16              }            },            {              "type": "extparam",              "name": "",              "dataKey": 3140,              "viewMode": "valueOnly",              "settings": {                "textItalic": true,                "fontWeight": "regular",                "textColor": "#999999",                "fontSize": 16              }            },            {              "type": "extparam",              "dataKey": 266,              "viewMode": "compact",              "_name": "Этаж",              "settings": {                "textItalic": true,                "fontWeight": "regular",                "textColor": "#666666",                "titleColor": "#999999",                "fontSize": 16              }            }          {.f_CodeExample style="font-style: italic;"}        }      ]{.f_CodeExample style="font-style: italic;"}    }  ]{.f_CodeExample style="font-style: italic;"} } Настройка шаблона с комплексным параметром

Если секция состоит из одного блока, а блоки из одного элемента, то этот элемент скорее всего "комплексный mainParam". Например, dataKey=comments - это пример виртуального комплексного сис параметра. Такой элемент занимаем секцию целиком.

Возможные ключи dataKey:

  • comments — Переписка

  • signatures — Список подписей по данной задаче (всех, даже которые адресованы другим людям)

  • usedTasks — Экран БИ целиком: дерево всех таблиц (как это уже сделано в обычном МТФ)

  • hierarchy — Экран с родительской задачей, прямыми подзадачами и связанными (как это в обычном МТФ уже сделано)

ℹ️ Блоки "signatures" и "hierarchy" видны только если в них есть содержимое

Если нет подписей и нет никаких связанных/подзадач, то эти секции не видны в МТФ.

ℹ️ Также секцию подписей возможно настроить без четкого указания ее в шаблоне в качестве комплексного параметра. Для этого нужно в общих настройках шаблона указать ключ "showSignatures":true

Настройка типов лент для комплексного параметра Comments

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

  • Feed — Лента

  • Messages — Сообщения

  • Journal — Журнал

  • All — Все

Настроить такой функционал можно в "comments" element шаблона, для этого добавьте ключ "content" в "settings".

Пример:

"settings": {  "content": {          "showFilters": true,          "filters": ["feed", "messages", "journal", "all"]  } } Если этой настройки нет или showFilters = false явно, то будет отображаться секция "комментарии" с названием из шаблона в element.name, даже если указаны типы лент комментариев в списке filters.

Если "showFilters": true, а filters не заданы (нет ключа или массив пустой), то у пункта меню появится кнопка-стрелочка, нажатие на которую раскрывает меню по умолчанию с пунктами: {Лента}, Сообщения, Журнал, Все.

ℹ️ Вместо {Лента} будет отображаться название секции, в которой находятся комментарии из шаблона, если оно указано. Если название не задано, будет отображаться название типа ленты.

ℹ️ Порядок типов лент комментов в списке filters может быть любой, при этом логика отображения названий сохраниться

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

Настройка БИ в качестве комплексного параметра

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

Пример шаблона:

{  "sections": [    {      "name": "Повестка",      "blocks": [        {          "name": "",          "elements": \            {              "type": "mainParam",              "name": "Повестка совещания",              "dataKey": "taskText",              "viewMode": "valueOnly",              "settings": {                "fontWeight": "medium",                "fontSize": 18              }            },            {              "type": "mainParam",              "name": "",              "dataKey": "stateAction",              "viewMode": "valueOnly"            },            {              "type": "mainParam",              "name": "Заказчик",              "dataKey": "owner",              "viewMode": "normal"            },            {              "type": "mainParam",              "name": "Исполнители",              "dataKey": "performers",              "viewMode": "normal"            },            {              "type": "mainParam",              "name": "Вложения",              "dataKey": "files",              "viewMode": "normal"            },            {              "type": "extparam",              "viewMode": "normal",              "_name": "Совещание"            },            {              "type": "extparam",              "name": "Совещание",              "dataKey": 14213,              "viewMode": "normal",              "_name": "Проекты"            }        }      ]    },    {      "name": "Поручения",      "blocks": [        {          "name": "",          "elements": \            {              "type": "mainParam",              "name": "Поручения",              "dataKey": "usedTasks",              "viewMode": "normal",              "_name": "",              "settings": {                "tableId": 5710,                "cellStyle": "default" // custom              }            }        }      ]    }  ] } Как посмотреть id конкретной таблицы в блоке БИ?

Прямого способа посмотреть ид таблицы БИ в админке или на мтф задачи пока нет.

Для того, чтобы узнать ид конкретной таблицы БИ, например, для использования в шаблоне, нужно воспользоваться инструментом разработчика(DevTools) в вашем браузере.

Для получения ид таблицы на нужно будет пройти следующие шаги:

1. Кликнуть правой кнопкой мыши → Исследовать элемент или просто нажать клавишу F12 на нужной странице браузера. 2. Вы увидите боковое/нижнее меню разработчика. Проходим в секцию Сеть(Network) 3. Далее переходим в карточку задачи из категории, где у нас настроена таблица блока БИ, не закрывая при этом devtools 4. В списке запросов находим запрос метода api/tasks и кликаем на него. Для этого можно воспользоваться полем поиска

5. Переходим в раздел Ответ данного запроса и находим поле "customTasksUsed" 6. В одном из элементов списка "customTasksUsed" находим нужную нам таблицу(можно также воспользоваться поиском) в tables и смотрим значение ключа "id", это и будет наше искомое значение. Его можно вводить в ключ tableId для настройки шаблонов.

Список действий (options)

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

Возможные действия:

Ключ Описание resources Ресурсы (временный затраты) signatures Подписи createSubtask Создать подзадачу createLinkedTask Создать связанную задачу createNewTask Создать новую задачу videoConference Видеоконференция (комната ВКС задачи) shareToChat Поделиться в чате. Переслать задачу в один из чатов внутри МП share Поделиться задачей вне МП. Переслать в другие приложения mute Переключить признак "бесшумного" режима (без звуковых уведомлений) changeTaskText Изменить текст задачи pin Закрепить задачу в списке чатов / Открепить задачу из списка чатов favorites Добавить в Избранное / Удалить из Избранного files Вложения

Пример настройки подраздела options:

"settings": {    "options": {      "signatures": true,      "resources": true,      "createSubtask": true,      "createLinkedTask": true,      "createLinkedEvent": true,      "pin": true,      "favorites": true,      "mute": true,      "videoConference": true,      "share": true,      "shareToChat": true    }  },  "sections": [    {      "name": "",      "blocks": [        {          "name": "Main",          "elements": \            {              ...            }            ]          }  ] } Стандартные списки меню Options

В карточке задачи:

1. resources

2. signatures

3. createSubtask

4. createLinkedTask

5. createLinkedEvent

6. videoConference

7. shareToChat

8. share

9. mute

10. pin

11. favorites

В личном чате:

1. files - отображается, если в задаче есть файлы

2. videoConference

3. mute

4. Покинуть чат(Вне ключей), если пользователь НЕ владелец

В групповом чате:

1. files - отображается, если в задаче есть файлы

2. changeTaskText

3. videoConference

4. mute

5. Покинуть группу(Вне ключей), если пользователь НЕ владелец

6. pin

В канале:

1. files - отображается, если в задаче есть файлы

2. changeTaskText - отображается, если пользователь владелец

3. mute

4. Отписаться(Вне ключей), если пользователь НЕ владелец

В задаче с ключом viewMode = chat:

1. files - отображается, если в задаче есть файлы

2. changeTaskText

3. videoConference

4. mute

5. Отписаться (Вне ключей), если пользователь НЕ владелец

6. pin

Настройка нажатия на задачу в представлении списке (onTap)

В шаблоне списка задач можно настроить действие, которое будет выполняться по нажатию на представление задачи вместо стандартного открытия карточки MTF. Действие настраивается через объект onTap в разделе settings шаблона.

Пример настройки подраздела onTap - по нажатию на задачу открывается не карточка задачи, а блок "Используется". Такая настройка позволяет реализовать многоуровневый каталог.

{\   "settings": {\       "viewMode": "flat",\       "showTaskFilter": false,\       "onTap": {\           "action": "openUsedBlock",\           "id": 111\       }\   }

}

где 111 — это ID таблицы в блоке "Используется".

Настройка меню действий через addButton

addButton — это список (массив) объектов onTap действий для создания задачи (openNewTask). Иными словами, с помощью addButton можно задать способы создания задачи, а именно в какие категории можно их поставить.

Данный параметр возможно настроить как в шаблоне cell категории, так и в элементе контейнера (например, toolbar'а).

Пример настройки в cell шаблоне:

"addButton": [

{

"action": "openNewTask",

"id": 3020,

"context": "cat+text"

}

]

ℹ️ Как видно выше на примере, при настройке важен только action openNewTask и id с указанием номера категории, куда будет ставиться задач

Настройка кнопок rightButton

rightButton — json строка onTap действия для настройки кнопок в ячейках/плитках справа. Может быть настроен как в дин.шаблоне cell, так и в контейнерах.

Пример кнопки rightButton

Пример настройки:

rightButton = {

icon = "Filter",

action = "openTaskSource",

dataSourceUrl = "/app/v1.2/api/publications/action/task-summary?type=taskPeriod",

color = "#808080",

showAsMenu = true

}

Настройка кнопок rightBarButton

rightBarButton — json строка onTap действий для настройки кнопок в верхней панели. Может быть настроен как в дин.шаблоне категории, так и в контейнерах.

В шаблоне МТФ настроенный rightBarButton будет действовать на всю карточку задачи, на все вкладки формы. То есть, если в БИ настроен rightBarButton, то он не будет отображаться, только rightBarButton МТФ.

Пример кнопки rightBarButton

Пример настройки:

"rightBarButtons":[

{"action":"openTaskSource",

"icon":"Basket",

"dataSourceUrl":"/app/v1.2/api/publications/action/mob-rest-basket"}

]

Управление навигацией в задачах через push-уведомления

При получении push-уведомления в МП у пользователя есть возможность перейти к источнику уведомления (задача/чат) и посмотреть подробнее содержимое и контекст, в котором ведется диалог. По умолчанию при нажатии на push-уведомление открывается диалог(в случае чата) или секция "Комментарии в МТФ задачи". Но данное поведение возможно изменить через динамический шаблон в соответствии с потребностями клиента.

Ключи для управления:

  • isDefault

  • SectionMTF

  • isPushOpenDefault

Логика навигации с ключами:

1. Ключ isDefault указывает секцию для открытия при переходе в задачу внутри МП. Если он не задан, то при нажатии на задачу из лент открывается первая секция.

2. Если при этом послать обычное push-уведомление (без sectionMTF и alias в шаблоне задаче), то откроется вкладка "Комментарии" при входе по push-уведомлению, а если данной складки нет, то открывается первая вкладка.

3. Если указан SectionMTF в push-уведомлении, то будет найдена секция с таким alias и она будет открыта при входе по уведомлению. Если Секции нет, то будет открытие комментов, если нет и такой, то откроется первая вкладка.

4. Если указан isPushOpenDefault для секции, то она будет открываться вместо Комментариев по  push-уведомлению.

5. SectionMTF важнее isPushOpenDefault, но если SectionMTF не находит секцию с alias sectionMTF, то откроется секция с isPushOpenDefault.

ℹ️ isDefault и isPushOpenDefault можно задать одновременно, они отвечают за разную навигацию.

ℹ️ SectionMTF настраивается в смарте "Отправить пуш-уведомление" в разделе кастомных параметров. При этом стоит учитывать, что данный параметр чувствителен к регистру, то есть ключи Sectionmtf/SectionMtf работать в МП не будут.

Пример настроенного шаблона со всеми ключами:

{  "sections": [    {      "name": "Задача1",      "blocks": [        {          "name": "Main",          "elements": \            {              "type": "mainParam",              "name": "",              "dataKey": "stateAction",              "viewMode": "valueOnly"            },            {              "type": "mainParam",              "name": "",              "dataKey": "taskText",              "viewMode": "valueOnly"            }        }      ]    },    {      "name": "Задача2",      "blocks": [        {          "name": "Secondary",          "elements": [            {              "type": "extparam",              "dataKey": 6006,              "viewMode": "normal",              "_name": "[Иванов\ Выпадающий список с редактированием"]            }          ]        }      \,]      "isDefault": true    },    {      "name": "Задача3",      "blocks": [        {          "name": "Secondary",          "elements": [            {              "type": "extparam",              "dataKey": 6019,              "viewMode": "normal",              "_name": "[Иванов\ Текст (формула)",]              "settings": {                "prefix": "+",                "postfix": "+"              }            },            {              "type": "extparam",              "dataKey": 6020,              "viewMode": "normal",              "_name": "Файл (изображение)"            }          ]        }      ]    },    {      "name": "Комментарии",      "blocks": [        {          "name": "",          "elements": \            {              "type": "mainParam",              "name": "Комментарии",              "dataKey": "comments",              "viewMode": "normal"            }        }      ]    },    {      "name": "Связано",      "blocks": [        {          "name": "",          "elements": \            {              "type": "mainParam",              "name": "Связано 2380",              "dataKey": "usedTasks",              "viewMode": "normal",              "settings": {                "tableId": 2380              }            }        }      \,]      "isPushOpenDefault": true    },    {      "name": "Иерархия",      "blocks": [        {          "name": "",          "elements": \            {              "type": "mainParam",              "name": "Иерархия",              "dataKey": "hierarchy",              "viewMode": "normal"            }        }      \,]      "alias": "here"    }  ] } Ключи, их описание и значения, можно посмотреть здесь

Примеры настройки Cell шаблонов

Фильтры и поиск

Данные разделы являются опциональными при настройке динамических шаблонов в категории и тасксорсах задач. Они служат для удобства просмотра списка текущего источника задач (категория, тасксорс) и отображаются на ряду с другими иконками rightBarButtons в верхней панели МП. Основные используемые в фильтрах параметры: текстовые дп (текст, БТФ, БТБФ, текст задачи), Выпадающие списки, Lookup. Настраивается почти аналогично списку elements в дин. шаблоне.

{    "settings": {        "showDisclosureIndicator": false,        "templateClass": "payment",        "viewMode": "flat",        "showTaskFilter": false    },    "filters": \ ... \,    "search": [\,]    "sections": [        {            "blocks": [                {                    "elements": \ ... \                }            ]        }    ] } Для появления иконки поиска необходимо лишь обозначить его через массив search: "search": \ , а для появления фильтров необходимо указать ключ "showTaskFilter": true`, помимо самого массива с элементами.

Массив фильтров состоит из основных или дополнительных параметров, по которым и происходит фильтрация задач.

При настройке дп в фильтрах есть возможность указания значения по умолчанию. Для этого нужно в массиве с element добавить два ключа: defaultValue и op. У каждого дп значения ключей defaultValue и op может быть разное.

Подробная информация о значениях ключей defaultValue и op:

У фильтра ключ defaultValue и ключ op задают значение фильтра и операцию соответственно. 1. Lookup:    1. множественный выбор Lookup defaultValue:{"taskId":123,"taskText::"текст задачи"},{"taskId":124,"taskText::"текст другой задачи"}\ op:"Range"    2. один Lookup defaultValue:{"taskId":123,"taskText::"текст задачи"} op: "Equally" 2. select (выпадающие списки)    1. множественный выбор селектов       - defaultValue:{"id":"значение","value::"текст"},{"id":"значение 2","value::"текст 2"}\ op:"Range"        - defaultValue:\"значение","значение 2"\ op:"Range" для селектов когда id=value  - краткое описание    2. одинарный выбор селекта        - defaultValue:{"id":"значение","value::"текст"} op:"Equally"        - defaultValue:"текст" op:"Equally" - краткое описание селекта когда id=value 3. Дата    1. Интервал defaultValue:\"31.05.2023","30.06.2023"\, op:"Between"    2. Больше, меньше, больше или равно, меньше или равно defaultValue:"31.05.2023" op:More op:Less op:MoreOrEqual op:LessOrEqual        - defaultValue:\"31.05.2023"\ тоже сработает 4. Число аналогично дате 5. Текст defaultValue:["строка"]    1. Равно op:"Equally"    2. Содержится op:"Contains"    3. Начинается op:"BeginContains"    4. Оканчивается op:"EndContains" Необходимо учитывать тот факт, что фильтр в приложении использует свои операции. Например, если где-то в описании будет Equally, то после перевыбора значения лукапа или селекта операция будет Range даже для одного значения. Для дат и чисел есть выбор операции. Значения ключа op: /// Равенство == "Equally";//1; /// Больше >"More";//2; /// Меньше \< "Less";//4; /// Больше или равно >= "MoreOrEqual";//8; /// Меньше или равно \<= "LessOrEqual";//16; /// Диапазон "Between";//32; /// Содержит %% "Contains";//64; /// Начинается с .% "BeginContains";//128; /// Оканчивается на % "EndContains";//256; /// Входит в множество \ "Range";//512; Готовый шаблон с настройкой фильтров:

"settings": {        "templateClass": "calendar",        "showTaskFilter": true,        "pinnedTasks": {          "taskSourceId": 641        },        "aggregate": {          "element": {            "type": "extparam",            "dataKey": 4025          },          "userFilter": {            "type": "mainParam",            "dataKey": "subscribers"          }        }      },      "filters": [        {          "element": {            "type": "extparam",            "placeholder": "Выберите точку",            "settings": {              "titleSize": 16,              "titleColor": "#606060",              "onTap": {                "action": "forbidOpen"              }            },            "dataKey": 14177          },          "defaultValue": \            {              "taskId": 541875,              "taskText": "BMW БорисХоф"            },            {              "taskId": 541873,              "taskText": "Авилон BMW"            }          \,          "op": "512",                                  "allowSorting": true, // флаг, который определяет можно ли сортировать в пользовательском фильтре по этому полю                                  "sort":"Desc", // Asc - сортировка по умолчанию        },        {          "element": {            "type": "extparam",            "placeholder": "Введите тему",            "settings": {              "titleSize": 16,              "titleColor": "#606060",              "onTap": {                "action": "forbidOpen"              }            },            "dataKey": 6017          },          "defaultValue": "тест",          "op": "128"        },        {          "element": {            "type": "extparam",            "placeholder": "Выберете пункт",            "settings": {              "titleSize": 16,              "titleColor": "#606060",              "onTap": {                "action": "forbidOpen"              }            },            "dataKey": 6004          },          "defaultValue": \            {              "id": "Loren",              "value": "Loren"            },            {              "id": "ipsum",              "value": "ipsum"            }          \,          "op": "512"        },        {          "element": {            "type": "extparam",            "placeholder": "Введите число",            "settings": {              "titleSize": 16,              "titleColor": "#606060",              "onTap": {                "action": "forbidOpen"              }            },            "dataKey": 6023          },          "defaultValue": \            3,            6          \,          "op": "32"        },        {          "element": {            "type": "extparam",            "placeholder": "Введите что-то",            "settings": {              "titleSize": 16,              "titleColor": "#606060"            },            "dataKey": 6006          }        }      \,]      "sections": [        {          "blocks": [            {              "elements": \                {                  "type": "extparam",                  "dataKey": 14177,                  "viewMode": "valueOnly",                  "_name": "Точка",                  "alias": "title"                },                {                  "type": "extparam",                  "dataKey": 4025,                  "viewMode": "valueOnly",                  "_name": "Дата посещения",                  "alias": "eventDate",                  "settings": {                    "textColor": "#AA2222",                    "fontSize": 12                  }                },                {                  "type": "extparam",                  "dataKey": 14179,                  "viewMode": "valueOnly",                  "_name": "Локация",                  "alias": "location",                  "settings": {                    "textColor": "#aaaaaa",                    "fontSize": 12                  }                }            }          ]        }      ]    }

ℹ️ Для ДП Дата, ДП Дата и время не предусмотрены настройки значений по умолчанию

Галерея фото в ячейках задач

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

Пример динамического шаблона:

{  "settings": {    "viewMode": "flat",    "showTaskFilter": false,    "showDisclosureIndicator": false  }, [  "sections": \    {      "name": "", [      "blocks": \        {          "elements": \            {              "type": "extparam",              "name": "",              "dataKey": 752,              "viewMode": "imagePreview",              "settings": {                "ratio": 1.5,                "cornerRadius": 0,                "_height": 200              }            },            {              "type": "mainParam",              "name": "",              "dataKey": "taskText",              "viewMode": "valueOnly",              "settings": {                "fontWeight": "medium",                "textColor": "#000000",                "fontSize": 16              }            },            {              "type": "extparam",              "name": "",              "dataKey": 3140,              "viewMode": "valueOnly",              "settings": {                "textItalic": true,                "fontWeight": "regular",                "textColor": "#999999",                "fontSize": 16              }            },            {              "type": "extparam",              "dataKey": 266,              "viewMode": "compact",              "_name": "Этаж",              "settings": {                "textItalic": true,                "fontWeight": "regular",                "textColor": "#666666",                "titleColor": "#999999",                "fontSize": 16              }            }          {.f_CodeExample style="font-style: italic;"}        }      ]{.f_CodeExample style="font-style: italic;"}    }  ]{.f_CodeExample style="font-style: italic;"} } Для настройки отображения списка задач как выше, необходимо настроить в елементах ДП файл/мультифайл, в описании которого нужно указать режим показа `viewMode = "imagePreview"`, а также в настройках всего шаблона указать `viewMode = "flat"`.

В этом случае в settings ДП файл/мультифайл нужно добавить параметр ratio, чтобы МП отображало соответствующие пропорции картинок.

Если фото в ДП несколько, то они будут пролистываться, в нижней части будет отображаться точечный индикатор кол-ва картинок в списке (если более 1).

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

Добавление списка действий addButton в верхний тулбар

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

При нажатии на кнопку раскрывается нижнее меню для отображения всех настроенных пунктов списка действий onTap.

При этом, если пункт всего один, то нижнее меню не будет показано, а дйствие сразу будет выполнено. Для настройки данного поведения нужно настроить список onTap в addButton и в общих настройках шаблона указать ключ showAddButtonInNavigationBar в значении true: "showAddButtonInNavigationBar": true

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

ℹ️ Для корректного отображения пунктов onTap в меню нужно указать ключи action, icon и titile

Пример динамического шаблона:

{  "search": [\,]{.f_CodeExample style="font-style: italic;"} [  "sections": \    { [      "blocks": \        {          "elements": \            {              "type": "extparam",              "viewMode": "imagePreview",              "settings": {                "cornerRadius": 12,                "ratio": 1.5              },              "dataKey": 6020            }          {.f_CodeExample style="font-style: italic;"}        }      ]{.f_CodeExample style="font-style: italic;"}    }  \,]{.f_CodeExample style="font-style: italic;"}  "settings": {    "hideSeparator": true,    "showDisclosureIndicator": false,    "showAddButtonInNavigationBar": true,    "bgColor": "#FFFFFF",    "viewMode": "flat",    "addButton": \      {        "action": "openNewTask",        "context": "context",        "icon": "DBClock",        "title": "openNewTask with context",        "id": 43580      }    {.f_CodeExample style="font-style: italic;"}  },  "filters": []{.f_CodeExample style="font-style: italic;"} } Примеры настройки NTF шаблонов

Шаблон с кастомным заголовком (header)

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

{  "settings": {    "afterTaskCreationBehaviour": "closeTask",    "createButton": {      "title": "Заказать пропуск"    },    "header": {      "title": {        "text": "Заказать пропуск",        "settings": {          "titleColor": "#FFFFFF"        }      },      "subtitle": {        "text": "Парковка автомобиля разрешена только в специально отведенных для этого парковочных пространствах",        "settings": {          "titleColor": "#FFFFFF"        }      },      "bgImage": {        "gradient": \          "#00000033",          "#000000CC"        \,        "url": "http://test.iospro.ru/pass.png",        "alpha": 1      },      "settings": {        "ratio": 1.7,        "_height": 100      }    }  },  "sections": [    {      "name": "Пропуск на автомобиль",      "blocks": [        {          "elements": [            {              "type": "extparam",              "dataKey": 44471,              "viewMode": "normal",              "_name": "Номер автомобиля",              "placeholder": "ВХХХВО ХХХ",              "hint": {                "text": "Въезд на территорию осуществляется по пропускам. Заявка может быть оформлена на постоянный или разовый въезд. На постоянный въезд может быть оформлено не более трех пропусков. При заказе Яндекс.Такси, CityMobil, Uber через мобильное приложение пропуск заказывать не нужно, за Вас это сделает диспетчер такси.",                "placeholder": "Понятно"              },              "settings": {                "titleColor": "#999999",                "textColor": "#000000",                "showClearButton": true,                "fontSize": 20,                "titleSize": 16,                "fontWeight": "medium",                "activeOnShowSection": true,                "regExp": "[\\dАВЕКМНОРСТУХавекмнорстухA-Za-z +",]                "inputCharacters": "[\\dАВЕКМНОРСТУХавекмнорстухA-Za-z \",]                "capsInput": true              }            },            {              "type": "extparam",              "name": "Избранное",              "dataKey": 44481,              "viewMode": "table",              "settings": {                "onChangeCopyTo": {                  "type": "extparam",                  "dataKey": 44471                },                "height": 44,                "titleColor": "#999999",                "textColor": "#000000",                "fontSize": 18,                "titleSize": 16,                "showClearButtonWithConfirm": true              }            }          ]        }      ]    }  ] } Шаблон многостраничного НТФ

В динамическом шаблоне может быть заполнено несколько секций для шаблона НТФ. В данном случае в МП будет открываться форма с несколькими страницами с указанными параметрами (см примеры ниже).

Для каждой секции (страницы) настройка и отображение остаются такими же, как и при настройке шаблона с одной секцией.

Навигация между секциями (страницами формы) осуществляется с помощью кнопок Назад и Далее.

ℹ️ При наличии обязательных параметров на текущей секции, на которой находится пользователь, нет возможности перейти к следующей пока не будут заполнены параметры со звездочками.

Пример динамического шаблона с несколькими секциями:

{ id = 1000001, typeId = "dynamic", content = {  search = {},  filters = {},  settings = {  onTap = {          action = "forbidOpen"  },  showDisclosureIndicator = false,  viewMode = "flat",  hideSeparator = true,  bgColor = "#FFFFFF" }, sections = { {  blocks = {  {          elements = {          {                  type = "extparam",                  dataKey = 5653,                  viewMode = "imagePreview",                  settings = {                          ratio = 1.5                  }          },          {                  type = "mainParam",                  dataKey = "taskText",                  viewMode = "valueOnly",                  settings = {                          _height = 28,                          fontSize = 22,                          fontWeight = "medium",                          textColor = "#000000"                  }          },          {                  type = "extparam",                  dataKey = 775,                  viewMode = "valueOnly",                  settings = {                          fontSize = 16,                          textItalic = true,                          textColor = "#999999"                  }          }  } }

Пример реализации

Примеры настройки MTF шаблонов

Настройка полей ДП с иконкой слева

Для таких типов ДП Текст, Большой текст, Дата, Дата и время, Деньги, Число, URL можно настроить отображение с иконкой слева от контента ДП.

Данное представление настраивается через ключ element.settings.leftImage, который представляет собой структуру JSON со следующими ключами:

  • icon: Строка = имя иконки из хранилища svg

  • color = цвет иконки, Строка в формате "#098934"

  • bgColor = цвет круглого фона вокруг иконки, Строка в формате "#098934" (на скрине не настроен)

Также при настройке ДП с leftImage для визуального отделения и более стройного отображения поддерживается ключ element.settings.showSeparator, он позволяет отображать горизонтальную линию в качестве разделителя. Стоит отметить, что разделитель отображается только если ДП имеет в шаблоне ключ readOnly: true.

Привязка ссылки внутри ДП для кастомного перехода

Для таких типов ДП Текст, Большой текст, Дата, Дата и время, Деньги, Число, URL можно настроить привязку ссылки из ДП URL из этой же задачи через ключ element.linkEpId. Для настроенного ДП его значение будет оставаться прежним, но при нажатии на него будет происходить переход на ссылке, указанной в качестве значения в ДП URL.

Пример реализации:

{ [  "sections": \    {      "_name": "Задача", [      "blocks": \        { [          "elements": \            {              "dataKey": 703,              "name": "",              "readOnly": true,              "settings": {                "align": "center",                "cornerRadius": 12,                "height": 250              },              "type": "extparam",              "viewMode": "imagePreview"            },            {              "_name": "Наименование",              "dataKey": 1891,              "readOnly": true,              "settings": {                "fontSize": 28,                "fontWeight": "bold"              },              "type": "extparam",              "viewMode": "valueOnly"            },            {              "_name": "Адрес",              "dataKey": 6939,              "linkEpId": 7988,              "readOnly": true,              "settings": {                "bgColor": "#FFFFEF",                "leftImage": {                  "bgColor": "",                  "color": "#001AF7",                  "icon": "pin-modern-circle"                },                "showSeparator": true,                "textColor": "#010101"              },              "type": "extparam",              "viewMode": "valueOnly"            },            {              "dataKey": 39,              "name": "График работы офиса продаж",              "readOnly": true,              "settings": {                "bgColor": "#FFFFEF",                "leftImage": {                  "bgColor": "",                  "color": "#001AF7",                  "icon": "alarm-clock-time-timer"                },                "showSeparator": true,                "textColor": "#010101"              },              "type": "extparam",              "viewMode": "normal"            },            {              "_name": "Телефон",              "dataKey": 7940,              "readOnly": true,              "settings": {                "bgColor": "#FFFFEF",                "leftImage": {                  "bgColor": "",                  "color": "#001AF7",                  "icon": "phones-03"                },                "links": \                  "phone"                \,{.f_CodeExample style="font-style: italic;"}                "showSeparator": true,                "textColor": "#010101"              },              "subtitle": "единый номер",              "type": "extparam",              "viewMode": "valueOnly"            },            {              "_name": "Сайт",              "dataKey": 1829,              "readOnly": true,              "settings": {                "bgColor": "#FFFFEF",                "hideInfoButton": true,                "leftImage": {                  "bgColor": "",                  "color": "#001AF7",                  "icon": "maps-navigation-10"                },                "links": \                  "http"                \,{.f_CodeExample style="font-style: italic;"}                "textColor": "#010101"              },              "type": "extparam",              "viewMode": "valueOnly"            }          \,]{.f_CodeExample style="font-style: italic;"}          "name": ""        }      ]{.f_CodeExample style="font-style: italic;"}    }  \,]{.f_CodeExample style="font-style: italic;"}  "settings": {    "options": {}  } } Управление отображением аватара задачи

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

Когда шаблона нет, то аватар отображается по умолчанию. Но, когда настраивается кастомный шаблон, то в общих настройках нужно явно указать ключ showAvatar: true, иначе он будет считаться false и не будет отображаться. При нажатии на аватар будет появляться меню с пунктами согласно настроенному шаблону.

В случае если заданы options, но showAvatar =  false (или нет ключа), то будет отображаться кнопка действий "три точки", и при нажатии на нее будет появляться нижнее меню с теми же пунктами options.

Пример реализации:

{  "settings": {    "options": {      "_createLinkedEvent": true,      "_createLinkedTask": true,      "_createSubtask": true,      "_resources": true,      "_shareToChat": true,      "_signatures": true,      "_videoConference": true,      "avatar": true,      "favorites": true,      "mute": true,      "pin": true,      "share": true    },    "showAvatar": true,    "showSignatures": true  }, [  "sections": \    { [      "blocks": \        {          "elements": \            {              "dataKey": "taskId",              "name": "",              "type": "mainParam",              "viewMode": "normal"            },            ...          \,{.f_CodeExample style="font-style: italic;"}          "name": ""        }      \,]{.f_CodeExample style="font-style: italic;"}      "name": "Задача"    }  ]{.f_CodeExample style="font-style: italic;"} }

Агрегированные представления

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

Логика формирования

templateClass — это перечень фиксированных шаблонов

ℹ️ Фиксированные шаблоны templateClass похожи на старые статические шаблоны, где они готовятся в коде и далее наполняются данными по alias и шаблонам

Наличие templateClass означает, что ячейка палитры будет заполняться значениями элементов с использованием связей через ключ alias в описании шаблона и ячейки.

В настоящее время приложения поддерживает представления — календарь (агрегирует задачи на дату), карта (агрегирует объекты по координатам в кластере) и payment.

Для них перед секциями добавляются еще два раздела: templateClass и aggregate.

Раздел templateClass задает тип представления — calendar, map, payment.

Раздел aggregate описывает параметр, по которому агрегируются данные (например, ДП), причем только ключи type и dataKey (без name и viewMode).

aggregate содержит element, который кратно описывает ДП или основной параметр для группировки

Пример шаблона с агрегацией:

"settings": {

"templateClass": "calendar",

"aggregate": {

"element": {

"type": "extparam",

"dataKey": 1321

},

"userFilter": {

"type": "mainParam",

"dataKey": "owner"

}

}

}

Так в примере задается агрегация по ДП 1321 (обычно это ДП типа дата/время, но может быть любой ДП, так как идет простое сравнение значений)

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

"type": "mainParam",

"dataKey": "dueDate"

То есть здесь используются урезанные версии элементов шаблона.

Сама агрегация делается локально на клиенте. Запрошенные за период видимых на экране дат события раскладываются по датам. При выборе даты показываются релевантные.

В фильтр-запросе фидов используется параметр aggregate для задания ограничения дат на текущий месяц. Если, например, это дата создания задачи, то мы запросим с сервера все задачи с датой начала между датами+время, которые видны на текущем экране в календаре.

userFilter (тоже используется элемент шаблона) задает фильтрацию отдачи по юзеру и означает, что при запросе задач в API будет включаться фильтр "я заказчик"

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

"type": "mainParam",

"dataKey": "subscribers"

"type": "mainParam",

"dataKey": "performers"

Payment представление:

Примеры ячеек payment В случае "templateClass":"payment" для элементов шаблона используются следующие alias: | -title — заголовок | первая строка | | -subtitle — подзаголовок | вторая строка | | -subtitle2 — второй подзаголовок | третья строка | | -value — строка значение | отображается справа | | -image — изображение слева от заголовков (иконка или аватар) | задается через ДП файл или ДП юзер селект (берется аватар в этом случае) |

-counter1 — левый счетчик -counter2  --- правый счетчик -leftImage — большое прямоугольное изображение слева в ячейке -rightImage — большое прямоугольное изображение справа в ячейке В случае избранных событий в календаре есть возможность задать следующие alias: -title -subtitle -rightImage Форматирование каждого текстового элемента или счетчика есть возможность задать стандартным образом через element.settings. Для ограничения кол-ва строк title, subtitle1, subtitle2 в settings ключ `maxLineCount`, по умолчанию равен 1, по необходимости можно переопределить(не более 3). Параметры `leftImage` и `rightImage` по факту ограничивают полезную ширину ячейки по краям; в настройках оба параметра сразу не используется никогда. Ширина задается ключом settings.width либо абсолютными значениями (120px), либо процентами от ширины ячейки (10%)

ℹ️ Важно помнить, что задается либо value, либо counter1 + counter2. Они отображаются по V-центру справа. Если заданы оба параметра, то будут браться value по умолчанию, без счетчиков.

В settings у leftImage и rightImage есть ключ `"verticalAlign": "center"/"top"/"bottom"` для выравнивания изображения в ячейке. Вертикальный стек из трех текстов title/subtitle/subtitle2 в целом выравнивается по V-центру ячейки. В качестве image данные будут браться из ДП файл в виде ссылки на картинку или из дп юзер селект в виде аватара контакта. Длина берётся из settings.height, иначе по умолчанию будет значение 44. У счетчиков размер фона задается исходя из размера шрифта (указан в settings). Фон счетчиков задается через settings.bgColor. Если значение счетчика равно нулю, то счетчик не будет отображаться. Наличие стрелки справа задается в общих settings шаблона "showDisclosureIndicator": true Календарное представление:

Пример календарного представления Пример настройки календарного представления можно посмотреть выше ⬆️ Показ значений в ячейке календаря базируется на ключе alias в элементах шаблона: -title — для заголовка события (максимум 2 строки) -location — 1 строка  по заголовков (ее может не быть в алиасах) -eventDate и eventEndDate — дата начала и конца события (eventDate обычно совпадает с параметром aggregate) Для отображения значений берутся все визуальные настройки settings из элемента шаблона, как это делается в лентах с кастомным шаблоном. Общий вид ячейки start-end задается на основе значений eventDate и eventEndDate Если eventEndDate нет, то пишется просто время HH:mm из eventDate. Если eventDate и eventEndDate есть и оба в текущем дне, то пишется HH:mm — HH:mm Если eventDate и eventEndDate есть и они в разных днях, то пишется HH:mm (до dd.MM.yyyy) Избранные события в календаре В шаблоне календаря возможна настройка "закрепленных" задач (см JSON ниже). Задачи могут запрашиваться из категории, task source, в том числе кастомного (на основе публикации). Нежелательно показывать более 3 задач. Пример:

"settings": {  "templateClass": "calendar",  "pinnedTasks": {          "taskSourceId": 4111,          "subcatId": 3020,          "url":"/app/v1.2/api/publications/action/mob-bonus-expectation"  } }

ℹ️ Порядок отрисовки данного экрана календаря будет следующий:

  1. Над календарем отображается все полученные задачи лентой

  2. Дальше рисуется календарь и под ним уже ячейки с задачами на выбранный день Отображение ячеек задач для такой ленты можно настроить через cell шаблон категории. Новости:

Данное динамическое представление templateClass является преемником статического шаблона новостей и требуется для отображения списка новостей в соответствующем формате, а также для отображения самой новости.

Новости

Карточка новости В случае "templateClass":"news" для элементов шаблона используются следующие alias: -title — тема новости -date — дата -text —  полный текст новости -annotation — аннотация -image — изображение обложки -video — видео обложки -rubric — рубрика -subrubric — подрубрика (в статическом шаблоне это industry) -author — автор новости (если не указан, то берется owner задачи) Пример настройки: {  "settings": {    "templateClass": "news"  },  "sections": [    {      "blocks": [        {          "elements": \            {              "alias": "author",              "dataKey": "owner",              "name": "Автор",              "type": "mainParam",              "viewMode": "normal"            },            {              "alias": "title",              "dataKey": "taskText",              "name": "Тема",              "type": "mainParam",              "viewMode": "normal"            },            {              "alias": "date",              "dataKey": 97410,              "name": "Дата",              "type": "extparam",              "viewMode": "normal"            },            {              "alias": "text",              "dataKey": 97380,              "name": "Текст",              "type": "extparam",              "viewMode": "normal"            },            {              "alias": "annotation",              "dataKey": 97370,              "name": "Аннотация",              "type": "extparam",              "viewMode": "normal"            },            {              "alias": "image",              "dataKey": 97340,              "name": "Изображение",              "type": "extparam",              "viewMode": "normal"            },            {              "alias": "rubric",              "dataKey": 97360,              "name": "Рубрика",              "type": "extparam",              "viewMode": "normal"            },            {              "alias": "subrubric",              "dataKey": 97350,              "name": "Подрубрика",              "type": "extparam",              "viewMode": "normal"            }        }      \,]      "name": "Новости"    }  ] } Описание настроек шаблонов задач в прежнем интерфейсе администрирования Полезные ссылки

Файл с конфигурациями мобильных шаблонов