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

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

Если вы используете альтернативную технологию UI (например, React), вам необходимо получить информацию о форме и отобразить форму, используя эту информацию. Ее можно получить с помощью интерфейса FormService, который имеет следующие методы:

  • StartFormData getStartFormData(String processDefinitionId)

  • TaskFormData getTaskFormData(String taskId)

Для отображения настраиваемых форм на экранах Start process или My tasks необходимо определить ProcessFormScreenCreator для типа формы custom. Чтобы переопределить значение по умолчанию ProcessFormScreenCreator, добавьте аннотацию @Order.

Давайте посмотрим на пример MyCustomProcessFormScreenCreator, которая реализует ProcessFormScreenCreator:

@Component("samples_MyCustomProcessFormScreenCreator")
@Order(1) (1)
public class MyCustomProcessFormScreenCreator implements ProcessFormScreenCreator {

    @Autowired
    private ScreenBuilders screenBuilders;

    @Override
    public String isApplicableFor() { (2)
        return "custom";
    }

    @Override
    public Screen createStartProcessScreen(CreationContext creationContext) { (3)
        Screen screen = screenBuilders.screen(creationContext.getFrameOwner())
                .withScreenId(creationContext.getFormData().getScreenId())
                .withOpenMode(OpenMode.DIALOG)
                .build();
        if (screen instanceof AcceptsProcessDefinition) { (4)
            ((AcceptsProcessDefinition) screen)
                    .setProcessDefinition(creationContext.getProcessDefinition());
        }
        return screen;
    }

    @Override
    public Screen createUserTaskScreen(CreationContext creationContext) { (5)
        Screen screen = screenBuilders.screen(creationContext.getFrameOwner())
                .withScreenId(creationContext.getFormData().getScreenId())
                .withOpenMode(OpenMode.DIALOG)
                .build();
        if (screen instanceof AcceptsTask) { (6)
            ((AcceptsTask) screen).setTask(creationContext.getTask());
        }
        return screen;
    }
}
1 Аннотация @Order указывает, что эта реализация ProcessForScreenCreator будет использоваться первой.
2 ScreenCreator будет применяться к настраиваемым процессным формам.
3 Переопределение метода создания процессной формы запуска.
4 Проверка того, реализует ли экран AcceptsProcessDefinition. В таком случае необходимо установить ProcessDefiniton в экран.
5 Переопределение метода создания процессной формы задачи.
6 Проверка того, реализует ли экран AcceptsTask. В таком случае необходимо установить Task в экран.

Пример интерфейса AcceptsProcessDefinition:

public interface AcceptsProcessDefinition {
    void setProcessDefinition(ProcessDefinition processDefinition);
}

Пример интерфейса AcceptsTask:

public interface AcceptsTask {
    void setTask(Task task);
}

XML-дескриптор настраиваемой формы запуска, имеющей только кнопку Start process:

<window xmlns="http://jmix.io/schema/ui/window"
        caption="msg://customStartForm.caption">
    <layout>
        <button id="startProcessBtn" caption="msg://startProcessBtn.caption"/>
    </layout>
</window>

Контроллер экрана настраиваемой стартовой формы:

@UiController("smpl_CustomStartForm")
@UiDescriptor("custom-start-form.xml")
public class CustomStartForm extends Screen implements AcceptsProcessDefinition {

    private ProcessDefinition processDefinition;

    @Autowired
    private RuntimeService runtimeService;

    @Subscribe("startProcessBtn")
    public void onStartProcessBtnClick(Button.ClickEvent event) {
        runtimeService.startProcessInstanceById(processDefinition.getId());
        closeWithDefaultAction();
    }

    @Override
    public void setProcessDefinition(ProcessDefinition processDefinition) {
        this.processDefinition = processDefinition;
    }
}

XML-дескриптор настраиваемой формы задачи, имеющей только кнопку Task complete:

<window xmlns="http://jmix.io/schema/ui/window"
        caption="msg://customTaskForm.caption">
    <layout>
        <button id="completeTaskBtn" caption="msg://completeTaskBtn.caption"/>
    </layout>
</window>

Контроллер экрана настраиваемой формы задачи:

@UiController("smpl_CustomTaskForm")
@UiDescriptor("custom-task-form.xml")
public class CustomTaskForm extends Screen implements AcceptsTask {

    private Task task;

    @Autowired
    private TaskService taskService;

    @Subscribe("completeTaskBtn")
    public void onCompleteTaskBtnClick(Button.ClickEvent event) {
        taskService.complete(task.getId());
        closeWithDefaultAction();
    }

    @Override
    public void setTask(Task task) {
        this.task = task;
    }
}