Настраиваемая форма
Настраиваемые процессные формы могут быть полезны, если вам нужно отобразить форму нестандартным способом. Для настраиваемой формы в моделере можно указать 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;
}
}