Настраиваемые формы

Подход, описанный в предыдущем разделе, позволяет быстро преобразовать обычный экран 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;
    }
}

Настройка элемента в Моделере

После создания формы можно привязать её к элементу:

  1. Перейдите в Modeler.

  2. Выберите нужный элемент (User Task или Start Event).

    custom form
  3. Установите значение Custom для Form type.

  4. Укажите View id.

  5. При необходимости задайте Form parameters и Outcomes; форма должна уметь читать параметры и возвращать результаты.

Использование альтернативной технологии UI

Формы также могут быть созданы с использованием альтернативной UI технологии (например, React), которые будут взаимодействовать с Jmix BPM через REST. Метаданные формы можно получить напрямую из Flowable через FormService:

  • StartFormData getStartFormData (String processDefinitionId)

  • TaskFormData getTaskFormData (String taskId)

Также метаданные формы можно предоставить через ProcessFormDataExtractor в Jmix. Раздел Получение данных о процессной форме содержит пример реализации REST-контроллера.