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.contentapp.browser.actionbar;
35
36 import info.magnolia.ui.actionbar.definition.ActionbarSectionDefinition;
37 import info.magnolia.ui.api.action.ActionDefinition;
38 import info.magnolia.ui.api.availability.AvailabilityDefinition;
39 import info.magnolia.ui.contentapp.browser.ActionExecutionService;
40 import info.magnolia.ui.contentapp.browser.context.ActionConfigurationContext;
41 import info.magnolia.ui.contentapp.browser.context.ValueContext;
42 import info.magnolia.ui.framework.datasource.components.SelectedItems;
43 import info.magnolia.ui.vaadin.actionbar.Actionbar;
44 import info.magnolia.ui.vaadin.gwt.client.actionbar.shared.ActionbarItem;
45
46 import java.util.List;
47 import java.util.Map;
48 import java.util.Optional;
49 import java.util.function.Predicate;
50
51 import javax.inject.Inject;
52
53 import org.apache.commons.lang3.StringUtils;
54
55
56
57
58
59
60
61
62 public class ActionbarPresenter<T> {
63
64 private final ActionExecutionService actionExecutionService;
65 private final ActionConfigurationContext actionConfiguration;
66 private final ValueContext<T> valueContext;
67
68 @Inject
69 ActionbarPresenter(
70 ValueContext<T> valueContext,
71 ActionConfigurationContext actionConfiguration,
72 ActionExecutionService actionExecutionService) {
73 this.actionExecutionService = actionExecutionService;
74 this.actionConfiguration = actionConfiguration;
75 this.valueContext = valueContext;
76 }
77
78 Optional<ActionbarItem> createActionItem(String actionName, String groupName) {
79 return actionConfiguration.actions().value().flatMap(actions -> {
80 final ActionDefinition actionDefinition = actions.get(actionName);
81 if (actionDefinition == null) {
82 return Optional.empty();
83 }
84
85 String label = actionDefinition.getLabel();
86 if (StringUtils.isBlank(label)) {
87 label = actionName;
88 }
89 String icon = actionDefinition.getIcon();
90
91
92 return Optional.of(new ActionbarItem(actionName, label, icon, groupName));
93 });
94 }
95
96 Optional<ActionbarSectionDefinition> getAvailableSection(List<ActionbarSectionDefinition> sectionAvailabilities) {
97 final SelectedItems<T> selectedItems = valueContext.current().value().orElseGet(SelectedItems::empty);
98
99 final Predicate<AvailabilityDefinition> availabilityFilter = actionExecutionService.getAvailabilityFilter(selectedItems);
100 return sectionAvailabilities
101 .stream()
102 .filter(actionbarSection -> availabilityFilter.test(actionbarSection.getAvailability()))
103 .findFirst();
104 }
105
106 boolean isEnableAction(String actionName) {
107 final SelectedItems<T> selectedItems = valueContext.current().value().orElseGet(SelectedItems::empty);
108 final Predicate<AvailabilityDefinition> availabilityFilter = actionExecutionService.getAvailabilityFilter(selectedItems);
109
110 Optional<Map<String, ActionDefinition>> actionConfigOpt = actionConfiguration.actions().value();
111 if (actionConfigOpt.isPresent() && actionConfigOpt.get().containsKey(actionName)) {
112 return availabilityFilter.test(actionConfigOpt.get().get(actionName).getAvailability());
113 }
114 return false;
115 }
116
117 public void fireAction(Actionbar.ActionTriggerEvent actionTriggerEvent) {
118 actionExecutionService.executeAction(getActionName(actionTriggerEvent.getActionName()),
119 valueContext.current().nullableValue());
120 }
121
122 private String getActionName(String actionToken) {
123 return StringUtils.substringAfterLast(actionToken, ":");
124 }
125 }