Думаю, многие сталкивались с довольно частым запросом:
Пользователь заполняет задачу, но пока не готов её выполнить. Хочется нажать «Сохранить», закрыть форму и вернуться к заполнению позже.
Из коробки отдельного сохранения данных задачи без её выполнения в ELMA365 нет.
Обычно эту задачу решают примерно так:
Задача → переход → эта же задача
Пользователь нажимает условное «Сохранить», текущая задача завершается и сразу создаётся новая.
Работает? Да. Но есть нюанс: это уже другая задача.
Старая закрывается, появляется новая, меняются даты, идентификаторы и история выполнения. В результате, например, исполнительская дисциплина уже не отражает реальную картину.
Поэтому я сделал небольшой универсальный виджет «Сохранить изменения», который можно добавить практически на любую форму задачи.
Подключается он через обычный виджет «Код»:
Код:
<%= UI.widget.render(
'ext_f418f0b8-d580-45bc-9f74-906057ea7eb1@task_save', //здесь нужно указать расположение вашего виджета
{ task_context: Context }
) %>
В самом виджете есть поле task_context типа «Произвольный тип».
То есть при открытии задачи мы просто передаём в него весь её контекст. А дальше всё довольно просто
По кнопке «Сохранить изменения» собираем данные формы и обновляем контекст уже запущенного экземпляра процесса:
Код:
async function save(): Promise<void> {
const processId =
Context.data.task_context.dataWithControls.context.contextId;
if (!processId) return;
const context = {} as any;
for (const key in Context.data.task_context._fields) {
if (key.includes('__')) continue;
context[key] =
Context.data.task_context.data[key];
}
const process = await System.processes
._searchInstances()
.where(f => f.__id.eq(processId))
.first();
if (!process) {
console.log(`process with id=${processId} not found`);
return;
}
await process.updateContext(
context,
'Сохранение данных задачи'
);
}
В результате пользователь может:
открыть задачу → что-то заполнить → сохранить → продолжить позже
При этом:
— задача не выполняется
— новая задача не создаётся
— текущий маршрут процесса никуда не двигается
— введённые данные сохраняются в контексте процесса
Сам виджет при этом универсальный: создали его один раз и дальше просто подключаем на нужные формы задач.
Получилось буквально несколько строк кода, но закрывает довольно распространённый запрос без переходов «из задачи в саму себя» и прочих обходных схем.
Еще больше полезной информации в ТГ канале WhatDaELMA365