1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.admincentral.shellapp.pulse.task;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.event.EventBus;
38 import info.magnolia.i18nsystem.I18nizer;
39 import info.magnolia.i18nsystem.SimpleTranslator;
40 import info.magnolia.objectfactory.ComponentProvider;
41 import info.magnolia.registry.RegistrationException;
42 import info.magnolia.task.Task;
43 import info.magnolia.task.Task.Status;
44 import info.magnolia.task.TasksManager;
45 import info.magnolia.task.definition.TaskDefinition;
46 import info.magnolia.task.definition.registry.TaskDefinitionRegistry;
47 import info.magnolia.task.event.TaskEvent;
48 import info.magnolia.task.event.TaskEventHandler;
49 import info.magnolia.ui.admincentral.shellapp.pulse.item.ConfiguredPulseListDefinition;
50 import info.magnolia.ui.admincentral.shellapp.pulse.item.detail.PulseDetailPresenter;
51 import info.magnolia.ui.admincentral.shellapp.pulse.item.detail.PulseItemCategory;
52 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.AbstractPulseListPresenter;
53 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.PulseListActionExecutor;
54 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.footer.PulseListFooterPresenter;
55 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.footer.PulseListFooterView;
56 import info.magnolia.ui.admincentral.shellapp.pulse.task.definition.TaskUiDefinition;
57 import info.magnolia.ui.api.availability.AvailabilityChecker;
58 import info.magnolia.ui.api.event.AdmincentralEventBus;
59 import info.magnolia.ui.api.view.View;
60 import info.magnolia.ui.framework.shell.ShellImpl;
61 import info.magnolia.ui.vaadin.overlay.MessageStyleTypeEnum;
62
63 import java.util.Arrays;
64 import java.util.List;
65 import java.util.Set;
66
67 import javax.inject.Inject;
68 import javax.inject.Named;
69
70 import org.slf4j.Logger;
71 import org.slf4j.LoggerFactory;
72
73
74
75
76 public final class TasksListPresenter extends AbstractPulseListPresenter implements TasksListView.Listener, PulseDetailPresenter.Listener, TaskEventHandler {
77
78 private static final Logger log = LoggerFactory.getLogger(TasksListPresenter.class);
79
80 private final TasksListView view;
81 private final TasksManager tasksManager;
82 private final ShellImpl shell;
83 private final TaskDefinitionRegistry taskDefinitionRegistry;
84 private final ComponentProvider componentProvider;
85 private final SimpleTranslator i18n;
86 private final String userId;
87
88
89
90
91
92 @Deprecated
93 public TasksListPresenter(final TasksContainer container, final TasksListView view, final ShellImpl shellImpl, final TasksManager tasksManager,
94 final TaskDefinitionRegistry taskDefinitionRegistry, final ComponentProvider componentProvider, final SimpleTranslator i18n, Context context,
95 @Named(AdmincentralEventBus.NAME) final EventBus admincentralEventBus, ConfiguredPulseListDefinition definition) {
96 this(container, view, shellImpl, tasksManager, taskDefinitionRegistry, componentProvider, i18n, context, admincentralEventBus, definition,
97 componentProvider.getComponent(AvailabilityChecker.class), componentProvider.getComponent(PulseListActionExecutor.class),
98 componentProvider.getComponent(PulseListFooterPresenter.class), componentProvider.getComponent(I18nizer.class));
99 }
100
101 @Inject
102 public TasksListPresenter(final TasksContainer container, final TasksListView view, final ShellImpl shellImpl, final TasksManager tasksManager,
103 final TaskDefinitionRegistry taskDefinitionRegistry, final ComponentProvider componentProvider, final SimpleTranslator i18n, Context context,
104 @Named(AdmincentralEventBus.NAME) final EventBus admincentralEventBus, ConfiguredPulseListDefinition definition,
105 AvailabilityChecker availabilityChecker, PulseListActionExecutor pulseListActionExecutor, PulseListFooterPresenter pulseListFooterPresenter, I18nizer i18nizer) {
106 super(container, i18nizer.decorate(definition), availabilityChecker, pulseListActionExecutor, pulseListFooterPresenter);
107 this.view = view;
108 this.shell = shellImpl;
109 this.tasksManager = tasksManager;
110 this.taskDefinitionRegistry = taskDefinitionRegistry;
111 this.componentProvider = componentProvider;
112 this.i18n = i18n;
113 this.userId = context.getUser().getName();
114
115 admincentralEventBus.addHandler(TaskEvent.class, this);
116 }
117
118 @Override
119 public View start() {
120 view.setListener(this);
121 view.setDataSource(container.getVaadinContainer());
122 PulseListFooterView footer = pulseListFooterPresenter.start(definition.getBulkActions(), getTotalEntriesAmount());
123 view.setFooter(footer);
124
125 updateView();
126 filterByItemCategory(PulseItemCategory.UNCLAIMED);
127
128 return view;
129 }
130
131 @Override
132 public View openItem(String itemId) throws RegistrationException {
133 Task task = tasksManager.getTaskById(itemId);
134 TaskDefinition definition = taskDefinitionRegistry.get(task.getName());
135
136 TaskDetailPresenter taskPresenter;
137 if (definition instanceof TaskUiDefinition) {
138 taskPresenter = componentProvider.newInstance(((TaskUiDefinition) definition).getPresenterClass(), task, definition);
139 } else {
140 log.debug("Task definition is not an instance of TaskUiDefinition, the presenter can not be configured.");
141 taskPresenter = componentProvider.newInstance(DefaultTaskDetailPresenter.class, task, definition);
142 }
143 taskPresenter.setListener(this);
144 return taskPresenter.start();
145
146 }
147
148 @Override
149 public long getTotalEntriesAmount() {
150 return container.size();
151 }
152
153 @Override
154 public void onItemClicked(String itemId) {
155 listener.openItem(definition.getName(), itemId);
156 }
157
158 @Override
159 public void updateDetailView(String itemId) {
160 listener.openItem(definition.getName(), itemId);
161 }
162
163 @Override
164 @Deprecated
165 public void deleteItems(final Set<String> itemIds) {
166 if (itemIds == null || itemIds.isEmpty()) {
167 return;
168 }
169
170 for (String taskId : itemIds) {
171 Task task = tasksManager.getTaskById(taskId);
172 if (task.getStatus() != Status.Resolved) {
173
174 shell.openNotification(MessageStyleTypeEnum.WARNING, true, i18n.translate("pulse.tasks.cantRemove", task.getName()));
175 return;
176 }
177 tasksManager.archiveTask(taskId);
178 }
179
180 refresh();
181 }
182
183 @Override
184 @Deprecated
185 public void claimTask(final Set<String> itemIds) {
186 if (itemIds == null || itemIds.isEmpty()) {
187 return;
188 }
189 for (String taskId : itemIds) {
190 Task task = tasksManager.getTaskById(taskId);
191 if (task.getStatus() != Status.Created) {
192
193 shell.openNotification(MessageStyleTypeEnum.WARNING, true, i18n.translate("pulse.tasks.cantAssign", task.getName(), task.getStatus()));
194 return;
195 }
196 tasksManager.claim(taskId, userId);
197 }
198 refresh();
199 }
200
201 @Override
202 public PulseItemCategory getCategory() {
203 return PulseItemCategory.TASKS;
204 }
205
206 @Override
207 public void taskClaimed(TaskEvent taskEvent) {
208 refresh();
209 }
210
211 @Override
212 public void taskAdded(TaskEvent taskEvent) {
213 refresh();
214 listener.updateView(PulseItemCategory.TASKS);
215 view.setTabActive(PulseItemCategory.UNCLAIMED);
216 }
217
218 @Override
219 public void taskResolved(TaskEvent taskEvent) {
220 refresh();
221 listener.updateView(PulseItemCategory.TASKS);
222 view.setTabActive(PulseItemCategory.UNCLAIMED);
223 }
224
225 @Override
226 public void taskFailed(TaskEvent taskEvent) {
227 refresh();
228 listener.updateView(PulseItemCategory.TASKS);
229 view.setTabActive(PulseItemCategory.FAILED);
230 }
231
232 @Override
233 public void taskArchived(TaskEvent taskEvent) {
234 refresh();
235 }
236
237 @Override
238 public void taskRemoved(TaskEvent taskEvent) {
239 }
240
241 @Override
242 public void taskScheduled(TaskEvent taskEvent) {
243 refresh();
244 listener.updateView(PulseItemCategory.TASKS);
245 view.setTabActive(PulseItemCategory.SCHEDULED);
246 }
247
248 private void refresh() {
249 listener.updatePulseCounter();
250 container.refresh();
251 updateView();
252 }
253
254 @Override
255 public int getPendingItemCount() {
256 return tasksManager.findPendingTasksByUser(userId).size();
257 }
258
259 private void updateView() {
260 for (Status status : Status.values()) {
261 doTasksStatusUpdate(status);
262 }
263 }
264
265 private void doTasksStatusUpdate(final Task.Status status) {
266
267 int count;
268
269 switch (status) {
270
271 case Created:
272 count = tasksManager.findTasksByUserAndStatus(userId, Arrays.asList(Status.Created)).size();
273 view.updateCategoryBadgeCount(PulseItemCategory.UNCLAIMED, count);
274 break;
275 case InProgress:
276 count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.InProgress)).size();
277 view.updateCategoryBadgeCount(PulseItemCategory.ONGOING, count);
278 break;
279 case Failed:
280 count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.Failed)).size();
281 view.updateCategoryBadgeCount(PulseItemCategory.FAILED, count);
282 break;
283 case Scheduled:
284 count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.Scheduled)).size();
285 view.updateCategoryBadgeCount(PulseItemCategory.SCHEDULED, count);
286 break;
287 default:
288 break;
289 }
290 }
291
292 @Override
293 protected List<Object> getSelectedItemIds() {
294 return view.getSelectedItemIds();
295 }
296
297 }