Добрый день.
В контроллере экрана (ListView) у меня есть подписка на действие startAgent:
@Subscribe("agentsDataGrid.startAgent")
public void onAgentsDataGridStartAgent(final ActionPerformedEvent event) {
Agent selectedAgent = agentsDataGrid.getSingleSelectedItem();
if (selectedAgent != null) {
agentService.startAgent(selectedAgent.getId());
agentsDl.load();
showNotification(messages.getMessage("ru.ctsg.damdbf.manager.view.agent/startAgent"));
}
}
Сейчас пытаюсь перенести логику из данного метода в метод actionPerform в action, но пока безуспешно. Не понимаю, где допускаю ошибку. Пока получил следующее, но это не работает. При нажатии кнопки в UI ничего не происходит:
@ActionType(StartAgentAction.ID)
public class StartAgentAction<E> extends ItemTrackingAction<E> {
public static final String ID = "startAgent";
@Autowired
private AgentService agentService;
@Autowired
private Notifications notifications;
@Autowired
private Messages messages;
public StartAgentAction(String id) {
super(id);
}
@Override
public void actionPerform(Component component) {
if (getTarget() != null) {
E selected = getTarget().getSingleSelectedItem();
if (selected != null) {
notifications.create(messages.getMessage("ru.ctsg.damdbf.manager.view.agent/stopAgent"))
.withType(Notifications.Type.SUCCESS)
.withPosition(Notification.Position.MIDDLE)
.show();
}
}
}
}
У меня следующие вопросы:
- От какого класса лучше экстендить свое действие: от ItemTrackingAction (на примере, как в документации Собственные типы действий :: Документация Jmix) или можно от BaseAction?
- Чтобы все заработало, мне нужно в подписке на кнопку вызвать свое действие и у него вызвать actionPerform? То есть сделать примерно следующее?
@Subscribe(id = "startAgentBtn", subject = "clickListener")
public void onStartAgentBtnClick(final ClickEvent<JmixButton> event) {
agentsDataGridStartAgent.actionPerform(agentsDataGrid);
agentsDl.load();
}