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.admincentral.usermenu;
35
36 import info.magnolia.admincentral.usermenu.actions.UserActionExecutor;
37 import info.magnolia.cms.security.MgnlUserManager;
38 import info.magnolia.cms.security.User;
39 import info.magnolia.icons.MagnoliaIcons;
40 import info.magnolia.ui.api.action.ActionExecutionException;
41 import info.magnolia.ui.api.message.Message;
42 import info.magnolia.ui.api.message.MessageType;
43 import info.magnolia.ui.api.view.View;
44 import info.magnolia.ui.framework.message.MessagesManager;
45 import info.magnolia.ui.theme.ResurfaceTheme;
46
47 import org.apache.commons.lang3.StringUtils;
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51 import com.vaadin.contextmenu.ContextMenu;
52 import com.vaadin.ui.Button;
53 import com.vaadin.ui.Component;
54 import com.vaadin.ui.UI;
55 import com.vaadin.ui.VerticalLayout;
56
57
58
59
60 public class UserMenu implements View {
61
62 private static final Logger log = LoggerFactory.getLogger(UserMenu.class);
63
64 private final UI ui;
65 private final UserActionExecutor actionExecutor;
66 private final MessagesManager messagesManager;
67 private final User user;
68
69 public UserMenu(UI ui, UserActionExecutor actionExecutor, MessagesManager messagesManager, User user) {
70 this.ui = ui;
71 this.actionExecutor = actionExecutor;
72 this.messagesManager = messagesManager;
73 this.user = user;
74 }
75
76 @Override
77 public Component asVaadinComponent() {
78 VerticalLayout layout = new VerticalLayout();
79 layout.setSizeUndefined();
80 layout.setMargin(true);
81 layout.setSpacing(false);
82 layout.addStyleName("menu-component");
83
84
85 Button hamburger = new Button(MagnoliaIcons.HAMBURGER_MENU);
86 hamburger.addStyleNames(ResurfaceTheme.BUTTON_ICON);
87 hamburger.setDescription(getUserName());
88 layout.addComponent(hamburger);
89
90 ContextMenu contextMenu = new ContextMenu(hamburger, false);
91 hamburger.addClickListener(event -> contextMenu.open());
92
93 actionExecutor.getActions().forEach(action -> contextMenu.addItem(action.getLabel(), MagnoliaIcons.forCssClass(action.getIcon()).orElse(null), selectedItem -> this.onAction(action.getName())));
94
95 return layout;
96 }
97
98 private String getUserName() {
99 String title = user.getProperty(MgnlUserManager.PROPERTY_TITLE);
100 String name = user.getName();
101 if (StringUtils.isNotEmpty(title) && !title.equals(name)) {
102 return String.format("%s (%s)", title, name);
103 } else {
104 return name;
105 }
106 }
107
108 private void onAction(String actionName) {
109 try {
110 actionExecutor.execute(actionName);
111 } catch (ActionExecutionException e) {
112 Message error = new Message(MessageType.ERROR, "An error occurred while executing an action.", e.getMessage());
113 log.error("An error occurred while executing action [{}]", actionName, e);
114 messagesManager.sendLocalMessage(error);
115 }
116 }
117 }