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.pages.app.detail.action;
35
36 import info.magnolia.ui.api.action.AbstractAction;
37 import info.magnolia.ui.api.action.ActionExecutionException;
38 import info.magnolia.ui.datasource.jcr.JcrDatasource;
39 import info.magnolia.ui.observation.DatasourceObservation;
40 import info.magnolia.ui.vaadin.gwt.client.shared.AreaElement;
41
42 import java.util.Collections;
43 import java.util.Optional;
44
45 import javax.inject.Inject;
46 import javax.jcr.Node;
47 import javax.jcr.RepositoryException;
48 import javax.jcr.Session;
49
50 import com.vaadin.shared.ui.grid.DropLocation;
51
52
53
54
55 public class SortComponentAction extends AbstractAction<SortComponentActionDefinition> {
56
57 private static final String BEFORE = "before";
58
59 private final AreaElement areaElement;
60 private final JcrDatasource datasource;
61 private final DatasourceObservation.Manual datasourceObservation;
62
63 @Inject
64 public SortComponentAction(SortComponentActionDefinition definition, AreaElement areaElement, JcrDatasource datasource, DatasourceObservation.Manual datasourceObservation) {
65 super(definition);
66 this.areaElement = areaElement;
67 this.datasource = datasource;
68 this.datasourceObservation = datasourceObservation;
69 }
70
71 @Override
72 public void execute() throws ActionExecutionException {
73 try {
74 DropLocation dropLocation = Optional.of(areaElement)
75 .map(AreaElement::getSortOrder)
76 .filter(s -> !BEFORE.equals(s))
77 .map(s -> DropLocation.BELOW)
78 .orElse(DropLocation.ABOVE);
79
80 Session session = datasource.getJCRSession();
81 Node sourceComponent = session.getNode(areaElement.getSourceComponent().getPath());
82 Node targetComponent = session.getNode(areaElement.getTargetComponent().getPath());
83 datasource.moveItems(Collections.singleton(sourceComponent), targetComponent, dropLocation);
84 datasource.commit(sourceComponent);
85 datasourceObservation.trigger();
86 } catch (RepositoryException e) {
87 throw new ActionExecutionException(e);
88 }
89 }
90 }