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.dam.app.assets.field;
35
36 import info.magnolia.cms.security.Permission;
37 import info.magnolia.cms.security.PermissionUtil;
38 import info.magnolia.cms.util.PathUtil;
39 import info.magnolia.context.MgnlContext;
40 import info.magnolia.event.EventBus;
41 import info.magnolia.jcr.util.NodeTypes;
42 import info.magnolia.jcr.util.NodeUtil;
43 import info.magnolia.ui.api.action.ActionDefinition;
44 import info.magnolia.ui.api.event.ChooseDialogEventBus;
45 import info.magnolia.ui.api.view.View;
46 import info.magnolia.ui.dialog.actionarea.ActionListener;
47 import info.magnolia.ui.dialog.actionarea.renderer.DefaultEditorActionRenderer;
48 import info.magnolia.ui.framework.action.AbstractRepositoryAction;
49 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeItemId;
50 import info.magnolia.ui.workbench.event.SelectionChangedEvent;
51
52 import java.util.Set;
53
54 import javax.inject.Inject;
55 import javax.inject.Named;
56 import javax.jcr.RepositoryException;
57
58 import com.vaadin.ui.Button;
59
60
61
62
63
64 public class UploadAndEditActionRenderer extends DefaultEditorActionRenderer {
65
66 private final EventBus chooseDialogEventBus;
67
68 @Inject
69 public UploadAndEditActionRenderer(@Named(ChooseDialogEventBus.NAME) EventBus chooseDialogEventBus) {
70 this.chooseDialogEventBus = chooseDialogEventBus;
71 }
72
73 @Override
74 public View start(ActionDefinition definition, ActionListener listener) {
75 View view = super.start(definition, listener);
76 final Button button = (Button) view.asVaadinComponent();
77 button.addClickListener(event -> event.getButton().setEnabled(true));
78
79 chooseDialogEventBus.addHandler(SelectionChangedEvent.class, event -> {
80
81 Set<Object> itemIds = event.getItemIds();
82 if (itemIds == null || itemIds.isEmpty()) {
83 return;
84 }
85 try {
86 JcrNodeItemId nodeItemId = (JcrNodeItemId) itemIds.iterator().next();
87 javax.jcr.Node node = MgnlContext.getJCRSession(nodeItemId.getWorkspace()).getNodeByIdentifier(nodeItemId.getUuid());
88 boolean uploadAllowed = itemIds.size() == 1;
89 if (uploadAllowed) {
90 uploadAllowed = NodeUtil.isNodeType(node, NodeTypes.Folder.NAME) || NodeUtil.getAncestors(node).isEmpty();
91
92 uploadAllowed &= PermissionUtil.isGranted(node, Permission.WRITE)
93 && PermissionUtil.isGranted(node.getSession(), PathUtil.createPath(node.getPath(), AbstractRepositoryAction.DEFAULT_NEW_ITEM_NAME), Permission.WRITE);
94 }
95 button.setEnabled(uploadAllowed);
96 } catch (RepositoryException e) {
97 button.setEnabled(false);
98 }
99 });
100 return view;
101 }
102 }