Настраиваемые формы
Подход, описанный в предыдущем разделе, позволяет быстро преобразовать обычный экран Jmix в процеснную форму, упрощая привязку к элементу в Моделере. Однако, к элементу может быть привязан любой экран, независимо от того, использует ли он аннотации.
Форма Jmix
Чтобы отображать формы на экранах Start process или My tasks, реализуйте интерфейс ProcessFormViewCreator и зарегистрируйте его для типа формы custom.
Пример MyCustomProcessFormViewCreator, реализующего ProcessFormViewCreator:
@Component("MyCustomProcessFormViewCreator")
@Order(1) (1)
public class MyCustomProcessFormViewCreator implements ProcessFormViewCreator {
@Autowired
private DialogWindows dialogWindows;
@Override
public String isApplicableFor() {
return "custom";
}
@Override
public DialogWindow<?> createStartProcessView(CreationContext creationContext) { (2)
FormData formData = creationContext.getFormData();
View origin = creationContext.getOrigin();
String viewId = formData.getScreenId();
DialogWindow dialog = dialogWindows
.view(origin, viewId)
.open();
if (dialog.getView() instanceof AcceptsProcessDefinition) { (3)
((AcceptsProcessDefinition) dialog.getView())
.setProcessDefinition(creationContext.getProcessDefinition());
}
return dialog;
}
@Override
public DialogWindow<?> createUserTaskView(CreationContext creationContext) { (4)
FormData formData = creationContext.getFormData();
View origin = creationContext.getOrigin();
String viewId = formData.getScreenId();
DialogWindow dialog = dialogWindows
.view(origin, viewId)
.build();
if (dialog.getView() instanceof AcceptsTask) { (5)
((AcceptsTask) dialog.getView())
.setTask(creationContext.getTask());
}
return dialog;
}
}
| 1 | Аннотация @Order указывает, что эта реализация ProcessFornViewCreator будет использоваться первой. |
| 2 | Переопределение метода создания процессной формы запуска. |
| 3 | Проверка того, реализует ли экран AcceptsProcessDefinition. В таком случае необходимо установить ProcessDefiniton в экран. |
| 4 | Переопределение метода создания процессной формы задачи. |
| 5 | Проверка того, реализует ли экран AcceptsTask. В таком случае необходимо установить Task в экран. |
Код выше использует два вспомогательных интерфейса. Пример интерфейса AcceptsProcessDefinition:
public interface AcceptsProcessDefinition {
void setProcessDefinition(ProcessDefinition processDefinition);
}
Пример интерфейса AcceptsTask:
public interface AcceptsTask {
void setTask(Task task);
}
Эти интерфейсы должны быть реализованы в формах запуска и задачи.
Форма запуска
XML-дескриптор формы запуска, имеющей только кнопку Start process:
<view xmlns="http://jmix.io/schema/flowui/view"
title="msg://customStartForm.title">
<layout>
<button id="startProcessBtn" text="msg://startProcessBtn.caption"/>
</layout>
</view>
Контроллер экрана формы:
@ViewController(id = "CustomStartForm")
@ViewDescriptor(path = "custom-start-form.xml")
public class CustomStartForm extends StandardView implements AcceptsProcessDefinition {
private ProcessDefinition processDefinition;
@Autowired
private RuntimeService runtimeService;
@Override
public void setProcessDefinition(ProcessDefinition processDefinition) {
this.processDefinition = processDefinition;
}
@Subscribe(id = "startProcessBtn", subject = "clickListener")
public void onStartProcessBtnClick(final ClickEvent<JmixButton> event) {
runtimeService.startProcessInstanceByKey(processDefinition.getKey());
closeWithDefaultAction();
}
}
Форма задачи
XML-дескриптор формы задачи, имеющей только кнопку Task complete:
<view xmlns="http://jmix.io/schema/flowui/view"
title="msg://com.company.bpmex1.view.forms/customTaskForm.title">
<layout>
<button id="completeTaskBtn" text="msg://com.company.bpmex1.view.forms/completeTaskBtn.text"/>
</layout>
</view>
Контроллер экрана формы задачи:
@ViewController("CustomTaskForm")
@ViewDescriptor("custom-task-form.xml")
public class CustomTaskForm extends StandardView implements AcceptsTask {
private Task task;
@Autowired
private TaskService taskService;
@Subscribe("completeTaskBtn")
public void onCompleteTaskBtnClick(ClickEvent<JmixButton> event) {
taskService.complete(task.getId());
closeWithDefaultAction();
}
@Override
public void setTask(Task task) {
this.task = task;
}
}
Настройка элемента в Моделере
После создания формы можно привязать её к элементу:
-
Перейдите в Modeler.
-
Выберите нужный элемент (User Task или Start Event).
-
Установите значение
Customдля Form type. -
Укажите View id.
-
При необходимости задайте Form parameters и Outcomes; форма должна уметь читать параметры и возвращать результаты.
Использование альтернативной технологии UI
Формы также могут быть созданы с использованием альтернативной UI технологии (например, React), которые будут взаимодействовать с Jmix BPM через REST. Метаданные формы можно получить напрямую из Flowable через FormService:
-
StartFormData getStartFormData (String processDefinitionId) -
TaskFormData getTaskFormData (String taskId)
Также метаданные формы можно предоставить через ProcessFormDataExtractor в Jmix. Раздел Получение данных о процессной форме содержит пример реализации REST-контроллера.