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

Синтаксис JS

Методы для работы с ДП и основными параметрами задачи

В карточке задачи вся бизнес-логика (проверка значений на корректность и т.п.) срабатывает при вызове метода save().

Вставки для работы с ДП оформляются следующим образом:

Без использования jQuery С использованием jQuery
в карточке задачи: в карточке задачи:
window.addEventListener(\'MTFMainLoadFinished\', function() { JS-вставка}) \$window.on(\'MTFMainLoadFinished\', function() { JS-вставка });
в карточке новой задачи: в карточке новой задачи:
window.addEventListener(\'NewTaskLoadFinished\', function() { JS-вставка }) \$window.on(\'NewTaskLoadFinished\', function() { JS-вставка });

ℹ️ При переходе на новый МТФ для работы с карточкой задачи с использованием JS-вставки обязательно должно быть использовано событие MTFMainDestroyed. Для карточки создания новой задачи (НТФ) должно быть использовано событие \'NewTaskLoadFinished\'. Подробнее

ℹ️ В карточке новой задачи методы save() и update() недоступны, т.к. задача еще не существует (нет соответствующей записи в БД).

Если в JS-вставке для карточки задачи или для карточки создания новой задачи привязано событие change(), то callback-функция срабатывает на следующие пользовательские действия:

  • установка значения через кнопку выбора;

  • установка автодополнением (когда пользователь набирает в окне ввода часть значения и затем выбирает нужную запись из выпадающего списка, который автоматически предлагает ему система);

  • установка через .val("abc"), когда значение назначается в самой JS-вставке;

  • удаление значения с помощью значка удаления;

  • вызов ep.change().

Обращение к основным параметрам

В JS вставках в карточке задачи можно обращаться к номеру задачи — taskId, и статусу задачи — StateID.

ID пользователя, от имени которого ведется работа, доступно в SessionUserID.

ℹ️ Названия основных параметров регистрозависимые

Методы для работы с ДП

Метод Аналог Что делает
var ep = new ExtParam(1234) ДП.{Имя_ДП}() Пример: ДП.Спринт() Получает JS-объект для управления ДП с ID=1234 (обращения к jQuery или к DOM на данном этапе еще не производится, объект находится на стадии формирования)
ep.get() Возвращает jQ-объект, содержащий ДП
ep.label() Возвращает jQ-объект подписи
ep.label().html() Возвращает текст подписи
ep.label("text") Меняет текст подписи к ДП и возвращает jQ-объект
ep.show() Показывает ДП и подпись и возвращает объект управления
ep.hide() Скрывает ДП и подпись, а также и возвращает объект управления

ℹ️ При использовании ep.hide() в разметке страницы останется пустое пространство, хотя сам ДП отображаться не будет. Если вам необходимо скрыть ДП, не оставляя пустого места, используйте css-селектор со свойством display: none.

Метод Аналог Что делает
ep.val() Значение() Получает значение ДП
ep.textVal(); ТекстовоеЗначение() Получает значение ДП в текстовом виде. Пример результата для ДП "Lookup": '{"taskId":1507666,"taskText":"текс задачи","taskColor":"Grey","taskIcon":"task-list-document-text"}'
ep.val(param) {Имя_ДП}.Значение() Пример: Спринт.Значение() Устанавливает значение ДП, вызывает событие change.
Пример для ДП "Выпадающий список": ep.val(val({name:'Выпсписокjs', value:'1'})) Параметр "name" является опциональным.
Пример для ДП "Lookup": ep.val(val({taskId: 1234, taskText:'text'}))
ep.getAvailableValues(handler) ВозможныеЗначения() Получает список возможных значений ДП Lookup и Multilookup. handler — метод, принимающий массив элементов типа { text, value }, где text — список текстов задач, а value — список ID задач (см. пример использования)
ep.change() ИзменитьЗначение() Запускает обработчик change() для ДП
ep.change(handler) Подписывает на изменение ДП
ep.change(null) Отписывает все обработчики на изменение ДП
ep.save() Сохраняет изменения ДП на сервере
ep.save(handler) Подписывает на сохранение ДП
ep.save(null) Отписывает все обработчики на сохранение ДП
ep.update() Обновить() Обновляет ДП с сервера
ep.update(handler) Подписывает на обновление ДП с сервера
ep.update(null) Отписывает все обработчики на обновление ДП с сервера
(new ExtParam(1234)).val("123").save(handler).save().hide() Если логика не предусматривает иного, то повторно возвращает объект управления ДП
SaveEPsWithIDs([1234, 1235]) Сохраняет все ДП по массиву индексов. Срабатывают триггеры на save() для каждого из ДП
ep.isHidden() Скрыть() Принимает значение "true", если ДП нет на форме или он скрыт настройками категории
ep.freeze() Заблокировать() Делает ДП доступным только на чтение (принимает на вход значения "true" или "false")
ep.adaptDesign() Устаревшее, не работает, начиная с версии 2.256. При установке значения "true" при скрытии/показе ДП верстка будет адаптироваться автоматически.
Чтобы корректно скрыть элемент на форме, не оставляя пустого пространства, в новых версиях рекомендуется использовать свойство display в значении 'none'.
Пример: .querySelector('vh-ext-param-control-wrapper[ep-wrapper-id="ХХХ"]').style.display = 'none' где ХХХ — ID ДП

ℹ️ Для ДП "Выпадающий список" и "Выпадающий список с редактированием" в режиме только для чтения событие, вызванное смарт-автоматизацией, запускается дважды. Чтобы отследить это в JS-вставке, можно проверять new ExtParam().val() -- первый раз оно возвращает старое значение ДП, а второй раз новое.

ℹ️ Если на карточке расположены два связанных ДП, доступных для редактирования, то при вызове обработчика change() для родительского ДП значение подчиненного ДП сбрасывается. Пример JS-вставки для работы со связанными ДП можно посмотреть здесь

ℹ️ Для версий ниже 2.256 требуется учесть собенности работы со сквозными ДП:

ДП типа "Сквозной" создается методом new ExtParam(ID сквозного ДП). ID сквозного ДП формируется как строковое соединение ID текущего ДП и ID финального ДП. Например, если в категории есть сквозной ДП с ID=5555, который смотрит на ДП в другой категории с ID=9999, то для сквозного ДП ID будет равным 55559999. Если такой ДП уже существует в задаче, обертка сработает некорректно.

Таблица совместимости методов и типов ДП в карточке задачи

Методы, не указанные в таблице совместимости, работают для всех ДП.

Тип ДП ep.val() ep.val("text") ep.save() ep.update()
Флажок (checkbox) да да ("да"/"on"/true/1) да да
Дата да да да да
Дата и время да да да да
Файл нет нет нет нет
Lookup да (ID задачи) да (ID задачи) да да
Деньги да да да да
Выбор нескольких задач из категории (multilookup) да (JSON массив ID задач) да (JSON массив ID задач) да да
Нумератор да нет нет нет
Число да да да да
Выпадающий список да да да да
Выбор нескольких задач из категории да (ID задачи) да (ID задачи) да да
Выбор пользователей да (JSON массив) нет да да
Таблица да (html таблица) нет нет нет
Текст да да (без шаблона номера телефона) да да
Большой текст с форматированием да да да да
Большой текст без форматирования да да да да
Сквозной да да да да
Дерево нет нет нет нет
URL да да да да

Объекты и методы для нового ДП "Таблица"

Таблица

object EpTable: {
   savedRowsCount: numeric,
   filteredRows: [ object Row ],
   multiWindow: object MultiWindow
}

Строка таблицы

object Row: {
   cells: [ object Cells ],
   id: number
}

Ячейка таблицы

object Cell: {
   columnId: numeric,
   columnValue: mixed,
   tooltip: function
}

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

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

Множественный выбор

object MultiWindow: {
   filteredRows: [ object Row ]
}

Методы

Для таблицы:

  • onTableLoaded — загрузка/перезагрузка страницы, переключение страниц таблицы.

  • onTableRowAdded — добавление строки (передается объект строки).

  • onTableRowChanged — изменение значения ячейки.

  • onTableSaved — сохранение таблицы.

Для таблицы в режиме множественного выбора:

  • onTableMWLoaded — загрузка/перезагрузка страницы, переключение страниц таблицы.

  • onTableMWRowSelected — выбор строки (передается объект строки).

  • onTableMWRowChanged — изменение значения ячейки.

  • onTableMWClosed — закрытие окна множественного выбора.

Для ячейки:

  • tooltip() — подсказка, всплывающая при наведении мыши на ячейку.

ℹ️ Методы обновления ДП "Таблица" вызываются после отработки метода обновления карточки задачи (MTFMainLoadFinished).

Пример

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

function setTooltip (){
    var ept = window.firstForma.ep.table(11);     
    ept.filteredRows.forEach ( function( item, i, arr ) {
        item.cells.forEach ( function( item, i, carr ) {
            var tmp = 'TOOLTIP:' + i;
            item.tooltip ( tmp );
        });
    });
}
document.addEventListener('load', function(){ setTooltip (); });

где 11 — ID ДП "Таблица". Вместо 'TOOLTIP:' + i нужно подставить текст подсказки.

Методы для работы с пользователями

Изменение значения ДП

Для полной замены текущего значения ДП "Выбор пользователей" на новое значение в функцию ep.val() нужно передать JSON такого вида:

{"Users":[], "Groups":[], "OrgUnits":[]}

Например:

var ep123 = new ExtParam(123);
ep123.val('{"Users":[55,66], "Groups":[77], "OrgUnits":[]}');
ep123.save();

где 123 — ID ДП "Выбор пользователей".

Контроль изменений

При работе с ДП "Выбор пользователей" функция ep.val() возвращает JSON такого вида:

{"Users":{"Deleted":[],"Added":[],"Selected":[]},"Groups":{"Deleted":[],"Added":[],"Selected":[]},"OrgUnits":{"Deleted":[],"Added":[],"Selected":[]}}

Например:

// изменить

var ep123 = new ExtParam(123);
ep123.val('{"Users":[55,66], "Groups":[77], "OrgUnits":[]}');
ep123.save();

// посмотреть результат
console.log(ep123.val());

// получить ID пользователя, выбранного в ДП

var ep123 = new ExtParam(123);
obj = JSON.parse(ep123.val());
var userid = obj.Users.Selected[0];

где 123 — ID ДП "Выбор пользователей".

Текущий (сессионный) пользователь

Функция window.getSessionUserInfo() возвращает promise с ID текущего пользователя (userId), массив его групп (groups) и признак, является ли он администратором (isAdmin).

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

spaApi.getSessionUser().data.__zone_symbol__value.id

Методы для работы с кнопками перехода

Метод Что делает
var step = new TaskStepAPI(1234) Получает JS-объект для управления кнопкой перехода (в случае отсутствия кнопки перехода в JS консоль пишется соответствующее уведомление)
step.hide() Скрывает кнопку
step.show() Отображает кнопку
step.click() Эмулирует клик по кнопке с выполнением всех обработчиков
step.click(handler) Подписывает обработчик на клик
step.click(null) Отписывает все обработчики по клику (за исключением стандартного)
step.makeStep() Выполняет стандартное действие по клику
step.cancelDefaultAction() Снимает стандартный обработчик с события клика по кнопке перехода
step.restoreDefaultAction() Восстанавливает стандартный обработчик на событии клика по кнопке перехода

Методы для работы с порталами и виджетами

Для порталов flex

Подписка на событие загрузки виджета с ID = 123 оформляется следующим образом:

(window.firstForma.portal.block(123)).onLoaded(function(event){ });

В функцию подписки будет передан объект event, который содержит поля portal и block.

Объект portal относится к порталу в целом и имеет два свойства:

  • id (число) — идентификатор портала,

  • title (строка) — название портала.

Методы для портала не реализованы.

Объект block относится к виджетам на портале и имеет два свойства:

  • id (число) — идентификатор виджета,

  • title (строка) — название виджета.

Для порталов dashboard

Подписка на событие загрузки виджета с ID = 123 оформляется следующим образом:

(window.firstForma.portal.block(123)).onLoaded(function(event){ });

В функцию подписки будет передан объект event, который содержит объект data.

Получить идентификатор блока можно через event.data.blockId.

Информация о пользователе

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

Получить данные пользователя, который просматривает портал, можно с помощью функции getSessionUserInfo(). Функция возвращает ответ вызова метода /api/auth/info (Valhalla API версии 2.0).

В JS-вставках можно использовать переменную UserID, которая содержит ID пользователя.

Методы для виджетов

Метод Что делает
refresh() Обновляет виджет.
Пример: let widget = firstForma.portal.block(123); ... widget.refresh();

Для виджетов Smart Html:

Метод Что делает
spaApi.loadApexCharts() Загружает библиотеку ApexCharts из SPA-бандла и возвращает Promise, который резолвится в конструктор ApexCharts. Использует ту же копию библиотеки, что и сам SPA, — без повторной загрузки с CDN.
Пример: spaApi.loadApexCharts().then(function(ApexCharts) { var chart = new ApexCharts(document.getElementById('my-chart'), options); chart.render(); });
Метод доступен только в JS Include, привязанных к SmartHtml-блоку портала. CDN-загрузка (loadApexCharts/ensureApexCharts) устарела.
spaCommand(command, data) Выполняет команду из параметра command; в параметре data — JSON с данными для команды.
Команда openInContentArea — открыть модальное окно. В data передаются content и context. Пример: const ref = spaCommand('openInContentArea', { content: 'iframe', context: { url: 'spa/user/profile/99' } }); ref.close();
Команда openNewsInContentArea — открыть карточку просмотра новости. В data передается taskid. Пример: const ref = spaCommand('openNewsInContentArea', { taskId: 123456 }); ref.close();

Для виджетов "Таблица" и "Поиск задач":

Метод Что делает
reload() Перезагружает виджет
freeze() Делает виджет недоступным для работы (нельзя нажать на кнопку или кликнуть по ссылке)
unfreeze() Делает виджет доступным для работы (можно нажать на кнопку или кликнуть по ссылке)

Методы для фильтров

Метод Что делает
setFilters() Устанавливает значение параметров фильтра.
Пример: let widget = firstForma.portal.block(123); widget.setFilters({param:999}); widget.refresh();
filters() Возвращает параметры фильтра в виде массива. Каждый параметр фильтра имеет методы get и set.
Пример: let widget = firstForma.portal.block(123); let param = widget.filters[0]; param.set(999); widget.refresh();

Обращение к параметрам фильтра

Если для виджета настроен фильтр, а для наполнения виджета используется хранимая процедура, то из нее можно обращаться к параметрам фильтра через входящий параметр @XmlParam (см. пример).

Методы для работы с файлами

Из JS-вставок портала можно вызывать галерею для просмотра изображений:

Для вызова галереи используется функция window.firstForma.fileViewer(fileArray, fileIndex)

Параметр Описание
fileArray массив
url url источник файла
fileType тип файла (необязательный параметр)
Возможные значения: audio, video, image, pdf, eml.
Если тип не указан, то будет определяться автоматически по fileName и fileUrl. Если автоматически тип не определился, то принимается как image
name название, которое будет отображаться при наведении курсора мыши (необязательный параметр)
mime mime поле файла (необязательный параметр)
fileIndex По умолчанию 0. Определяет, какой по порядку файл из массива отображать сейчас (необязательный параметр)

Примеры:

window.firstForma.fileViewer([{
url:'./GetAttachment.ashx?id=1234&versionId=1',
fileType:'video',
mime:'video/mp4'
}])
window.firstForma.fileViewer([{
url:'https://ru.1forma.ru/GetAttachment.ashx?id=569754',
fileType:'image', 
name:'Свежая выпечка'
},
{
url:'https://ru.1forma.ru/GetAttachment.ashx?id=569753',
fileType:'image', 
name:'Витрина'
}])

Полный пример настройки галереи на портале описан здесь.

Методы для работы с телефонией

Используются при настроенной интеграции с IP-телефонией.

Открыть окно вызова:

GetTopWindow().TCHeader.CallHistory.Open(1234)

где 1234 — короткий номер.

Если вызов используется в портальном блоке (например, по ссылке), то открыть окно вызова можно так:

window.parent.TCHeader.CallHistory.Open(1234)