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.objectfactory.ComponentProvider;
40 import info.magnolia.registry.RegistrationException;
41 import info.magnolia.task.Task;
42 import info.magnolia.task.Task.Status;
43 import info.magnolia.task.TasksManager;
44 import info.magnolia.task.definition.TaskDefinition;
45 import info.magnolia.task.definition.registry.TaskDefinitionRegistry;
46 import info.magnolia.task.event.TaskEvent;
47 import info.magnolia.task.event.TaskEventHandler;
48 import info.magnolia.ui.admincentral.shellapp.pulse.item.ConfiguredPulseListDefinition;
49 import info.magnolia.ui.admincentral.shellapp.pulse.item.detail.PulseDetailPresenter;
50 import info.magnolia.ui.admincentral.shellapp.pulse.item.detail.PulseItemCategory;
51 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.AbstractPulseListPresenter;
52 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.PulseListActionExecutor;
53 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.footer.PulseListFooterPresenter;
54 import info.magnolia.ui.admincentral.shellapp.pulse.item.list.footer.PulseListFooterView;
55 import info.magnolia.ui.admincentral.shellapp.pulse.task.definition.TaskUiDefinition;
56 import info.magnolia.ui.api.availability.AvailabilityChecker;
57 import info.magnolia.ui.api.event.AdmincentralEventBus;
58 import info.magnolia.ui.api.view.View;
59
60 import java.util.Arrays;
61 import java.util.Set;
62 import java.util.stream.Collectors;
63
64 import javax.inject.Inject;
65 import javax.inject.Named;
66
67 import org.slf4j.Logger;
68 import org.slf4j.LoggerFactory;
69
70
71
72
73 public final class TasksListPresenter extends AbstractPulseListPresenter implements TasksListView.Listener, PulseDetailPresenter.Listener, TaskEventHandler {
74
75 private static final Logger log = LoggerFactory.getLogger(TasksListPresenter.class);
76
77 private final TasksListView view;
78 private final TasksManager tasksManager;
79 private final TaskDefinitionRegistry taskDefinitionRegistry;
80 private final ComponentProvider componentProvider;
81 private final String userId;
82
83 @Inject
84 public TasksListPresenter(final TasksDataProvider dataProvider, final TasksListView view, final TasksManager tasksManager,
85 final TaskDefinitionRegistry taskDefinitionRegistry, final ComponentProvider componentProvider, Context context,
86 @Named(AdmincentralEventBus.NAME) final EventBus admincentralEventBus, ConfiguredPulseListDefinition definition,
87 AvailabilityChecker availabilityChecker, PulseListActionExecutor pulseListActionExecutor, PulseListFooterPresenter pulseListFooterPresenter, I18nizer i18nizer) {
88 super(dataProvider, i18nizer.decorate(definition), availabilityChecker, pulseListActionExecutor, pulseListFooterPresenter);
89 this.view = view;
90 this.tasksManager = tasksManager;
91 this.taskDefinitionRegistry = taskDefinitionRegistry;
92 this.componentProvider = componentProvider;
93 this.userId = context.getUser().getName();
94
95 admincentralEventBus.addHandler(TaskEvent.class, this);
96 }
97
98 @Override
99 public View start() {
100 view.setListener(this);
101 view.setDataSource(dataProvider);
102 PulseListFooterView footer = pulseListFooterPresenter.start(definition.getBulkActions(), dataProvider.size());
103 view.setFooter(footer);
104
105 updateView();
106
107 return view;
108 }
109
110 @Override
111 public View openItem(String itemId) throws RegistrationException {
112 Task task = tasksManager.getTaskById(itemId);
113 TaskDefinition definition = taskDefinitionRegistry.get(task.getName());
114
115 TaskDetailPresenter taskPresenter;
116 if (definition instanceof TaskUiDefinition) {
117 taskPresenter = componentProvider.newInstance(((TaskUiDefinition) definition).getPresenterClass(), task, definition);
118 } else {
119 log.debug("Task definition is not an instance of TaskUiDefinition, the presenter can not be configured.");
120 taskPresenter = componentProvider.newInstance(DefaultTaskDetailPresenter.class, task, definition);
121 }
122 taskPresenter.setListener(this);
123 return taskPresenter.start();
124
125 }
126
127 @Override
128 public void onItemClicked(String itemId) {
129 listener.openItem(definition.getName(), itemId);
130 }
131
132 @Override
133 public void updateDetailView(String itemId) {
134 listener.openItem(definition.getName(), itemId);
135 }
136
137 @Override
138 public PulseItemCategory getCategory() {
139 return PulseItemCategory.TASKS;
140 }
141
142 @Override
143 public void taskClaimed(TaskEvent taskEvent) {
144 refresh();
145 }
146
147 @Override
148 public void taskAdded(TaskEvent taskEvent) {
149 refresh();
150 listener.updateView(PulseItemCategory.TASKS);
151 view.setTabActive(PulseItemCategory.UNCLAIMED);
152 }
153
154 @Override
155 public void taskResolved(TaskEvent taskEvent) {
156 refresh();
157 listener.updateView(PulseItemCategory.TASKS);
158 view.setTabActive(PulseItemCategory.UNCLAIMED);
159 }
160
161 @Override
162 public void taskFailed(TaskEvent taskEvent) {
163 refresh();
164 listener.updateView(PulseItemCategory.TASKS);
165 view.setTabActive(PulseItemCategory.FAILED);
166 }
167
168 @Override
169 public void taskArchived(TaskEvent taskEvent) {
170 refresh();
171 }
172
173 @Override
174 public void taskRemoved(TaskEvent taskEvent) {
175 }
176
177 @Override
178 public void taskScheduled(TaskEvent taskEvent) {
179 refresh();
180 listener.updateView(PulseItemCategory.TASKS);
181 view.setTabActive(PulseItemCategory.SCHEDULED);
182 }
183
184 private void refresh() {
185 listener.updatePulseCounter();
186 dataProvider.refreshAll();
187 updateView();
188 }
189
190 @Override
191 public int getPendingItemCount() {
192 return tasksManager.findPendingTasksByUser(userId).size();
193 }
194
195 private void updateView() {
196 for (Status status : Status.values()) {
197 doTasksStatusUpdate(status);
198 }
199 }
200
201 private void doTasksStatusUpdate(final Task.Status status) {
202
203 int count;
204
205 switch (status) {
206
207 case Created:
208 count = tasksManager.findTasksByUserAndStatus(userId, Arrays.asList(Status.Created)).size();
209 view.updateCategoryBadgeCount(PulseItemCategory.UNCLAIMED, count);
210 break;
211 case InProgress:
212 count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.InProgress)).size();
213 view.updateCategoryBadgeCount(PulseItemCategory.ONGOING, count);
214 break;
215 case Failed:
216 count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.Failed)).size();
217 view.updateCategoryBadgeCount(PulseItemCategory.FAILED, count);
218 break;
219 case Scheduled:
220 count = tasksManager.findTasksByAssigneeAndStatus(userId, Arrays.asList(Status.Scheduled)).size();
221 view.updateCategoryBadgeCount(PulseItemCategory.SCHEDULED, count);
222 break;
223 default:
224 break;
225 }
226 }
227
228 @Override
229 protected Set<String> getSelectedItemIds() {
230 return view.getSelectedItems().stream()
231 .map(item -> ((Task)item).getId())
232 .collect(Collectors.toSet());
233 }
234 }