2.7.2. Контроллер экрана редактирования договора
Откройте экран ContractEdit
и замените его содержимое на следующий код:
package com.company.bpmdemo.web.screens.contract;
import com.haulmont.bpm.entity.ProcAttachment;
import com.haulmont.bpm.gui.procactionsfragment.ProcActionsFragment;
import com.haulmont.cuba.gui.app.core.file.FileDownloadHelper;
import com.haulmont.cuba.gui.components.Table;
import com.haulmont.cuba.gui.model.CollectionLoader;
import com.haulmont.cuba.gui.model.InstanceContainer;
import com.haulmont.cuba.gui.model.InstanceLoader;
import com.haulmont.cuba.gui.screen.*;
import com.company.bpmdemo.entity.Contract;
import javax.inject.Inject;
@UiController("bpmdemo_Contract.edit")
@UiDescriptor("contract-edit.xml")
@EditedEntityContainer("contractDc")
public class ContractEdit extends StandardEditor<Contract> {
private static final String PROCESS_CODE = "contractApproval";
@Inject
private CollectionLoader<ProcAttachment> procAttachmentsDl;
@Inject
private InstanceContainer<Contract> contractDc;
@Inject
protected ProcActionsFragment procActionsFragment;
@Inject
private Table<ProcAttachment> attachmentsTable;
@Inject
private InstanceLoader<Contract> contractDl;
@Subscribe
private void onBeforeShow(BeforeShowEvent event) {
contractDl.load();
procAttachmentsDl.setParameter("entityId",contractDc.getItem().getId());
procAttachmentsDl.load();
procActionsFragment.initializer()
.standard()
.init(PROCESS_CODE, getEditedEntity());
FileDownloadHelper.initGeneratedColumn(attachmentsTable, "file");
}
}
Рассмотрим код контроллера более подробно.
ProcessActionsFragment
− это стандартный фрагмент для отображения кнопок доступных в данный момент процессных действий. Во время инициализации фрагмента по двум параметрам (код процесса и сущность) ищется связанный экземпляр ProcInstance
. Если процесс не находится, то создается новый ProcInstance
, и фрагмент отображает кнопку запуска процесса. Если связанный с сущностью процесс найден, то проверяется, имеется ли незавершенная процессная задача для текущего пользователя, и если да, то отображаются кнопки завершения данной задачи. Подробнее о ProcActionsFragment
см. ProcActionsFragment.
В контроллере редактора договора инициализация фрагмента процессных действий происходит в методе onBeforeShow()
. Самая важная часть метода − вызов init(PROCESS_CODE, getEditedEntity())
. Константа PROCESS_CODE
хранит код процесса (contractApproval
− это значение мы видели при развёртывании процесса, см. Развёртывание модели процесса). Второй аргумент getEditedEntity()
− текущий договор.
Стандартная инициализация фрагмента (standard()
) делает следующее:
-
Инициализирует стандартные предикаты для действий запуска процесса и завершения задачи. Предикаты вызывают коммит редактора договора.
-
Инициализирует стандартные слушатели, вызываемые после завершения процессного действия. Данные слушатели отображают уведомления ("Процесс запущен", "Действие выполнено", и т.п.), а также обновляют
procActionsFragment
.