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