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.action;
35
36 import info.magnolia.ui.api.action.AbstractAction;
37 import info.magnolia.ui.api.action.ActionExecutionException;
38 import info.magnolia.ui.api.app.AppDescriptor;
39 import info.magnolia.ui.contentapp.Datasource;
40 import info.magnolia.ui.ValueContext;
41 import info.magnolia.ui.chooser.definition.AppAwareWorkbenchChooserDefinition;
42 import info.magnolia.ui.chooser.definition.SingleItemWorkbenchChooserDefinition;
43 import info.magnolia.ui.framework.overlay.ChooserController;
44
45 import java.util.List;
46 import java.util.Optional;
47 import java.util.stream.Collectors;
48 import java.util.stream.Stream;
49
50 import javax.inject.Inject;
51
52 import org.apache.commons.lang3.StringUtils;
53
54 import com.vaadin.shared.ui.grid.DropLocation;
55
56
57
58
59 public class MoveAction<T> extends AbstractAction<MoveActionDefinition> {
60
61 private final ChooserController chooserController;
62 private final Datasource<T> datasource;
63 private final ValueContext<T> valueContext;
64 private final AppDescriptor appDescriptor;
65
66 @Inject
67 public MoveAction(MoveActionDefinition<T> actionDefinition, ChooserController chooserController, Datasource<T> datasource, ValueContext<T> valueContext, AppDescriptor appDescriptor) {
68 super(actionDefinition);
69 this.chooserController = chooserController;
70 this.datasource = datasource;
71 this.valueContext = valueContext;
72 this.appDescriptor = appDescriptor;
73 }
74
75 @Override
76 public void execute() throws ActionExecutionException {
77 SingleItemWorkbenchChooserDefinition<T> chooser = Optional.ofNullable(getDefinition().getChooser())
78 .orElseGet(() -> {
79 MoveActionDefinition.MoveWorkbenchDefinition<T> workbenchDefinition = new MoveActionDefinition.MoveWorkbenchDefinition<>();
80 final AppAwareWorkbenchChooserDefinition<T> workbenchChooser = new AppAwareWorkbenchChooserDefinition<>();
81 workbenchChooser.setAppName(appDescriptor.getName());
82 workbenchDefinition.setWorkbenchChooser(workbenchChooser);
83 getDefinition().setChooser(workbenchDefinition);
84 return getDefinition().getChooser();
85 });
86
87 final ChooserController.OnItemChosen<T> onItemChosen = chooserController.openChooser(chooser);
88 onItemChosen
89 .whenComplete((chooseResult, err) -> {
90 if (err != null) {
91 throw new RuntimeException(err);
92 }
93 final List<T> items = valueContext.get().collect(Collectors.toList());
94 final T target = chooseResult.getChoice().orElseThrow(IllegalArgumentException::new);
95 final DropLocation dropLocation = Optional.of(onItemChosen.getAction())
96 .flatMap(action -> Stream.of(DropLocation.values()).filter(location -> StringUtils.equalsIgnoreCase(location.name(), action)).findFirst())
97 .orElse(DropLocation.ON_TOP);
98 datasource.moveItems(items, target, dropLocation);
99 });
100 }
101 }