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.context.Context;
40 import info.magnolia.icons.MagnoliaIcons;
41 import info.magnolia.ui.api.action.ActionExecutionException;
42 import info.magnolia.ui.api.message.Message;
43 import info.magnolia.ui.api.message.MessageType;
44 import info.magnolia.ui.framework.message.MessagesManager;
45 import info.magnolia.ui.theme.ResurfaceTheme;
46
47 import javax.inject.Inject;
48
49 import org.apache.commons.lang3.StringUtils;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
52
53 import com.vaadin.contextmenu.ContextMenu;
54 import com.vaadin.shared.ui.ContentMode;
55 import com.vaadin.ui.Button;
56 import com.vaadin.ui.Composite;
57 import com.vaadin.ui.CssLayout;
58 import com.vaadin.ui.Label;
59 import com.vaadin.ui.VerticalLayout;
60
61
62
63
64 public class UserMenu extends Composite {
65
66 private static final Logger log = LoggerFactory.getLogger(UserMenu.class);
67
68 private final UserActionExecutor actionExecutor;
69 private final MessagesManager messagesManager;
70
71 @Inject
72 public UserMenu(UserActionExecutor actionExecutor, MessagesManager messagesManager, Context context) {
73
74 this.actionExecutor = actionExecutor;
75 this.messagesManager = messagesManager;
76
77 VerticalLayout layout = new VerticalLayout();
78 layout.setSizeUndefined();
79 layout.setMargin(true);
80 layout.setSpacing(false);
81 layout.addStyleNames("header-component", "menu-component");
82
83 Label userIcon = new Label();
84 userIcon.setStyleName("user-icon");
85 userIcon.setContentMode(ContentMode.HTML);
86 userIcon.setValue("<span class='" + MagnoliaIcons.USER_PUBLIC.getCssClass() + "'></span>");
87
88 Button openArrow = new Button(MagnoliaIcons.ARROW1_S);
89 openArrow.addStyleNames(ResurfaceTheme.BUTTON_ICON, "open-arrow");
90 openArrow.setDescription(getUserName(context.getUser()));
91
92 CssLayout cssLayout = new CssLayout();
93 cssLayout.addComponents(userIcon, openArrow);
94
95 Label label = new Label(getUserName(context.getUser()));
96 label.addStyleName("label");
97
98 layout.addComponents(cssLayout, label);
99
100 ContextMenu contextMenu = new ContextMenu(openArrow, false);
101 openArrow.addClickListener(event -> contextMenu.open(event.getClientX(), event.getClientY()));
102
103 actionExecutor.getActions()
104 .forEach(action -> contextMenu.addItem(action.getLabel(),
105 MagnoliaIcons.forCssClass(action.getIcon())
106 .orElse(null), selectedItem -> this.onAction(action.getName())));
107
108 setCompositionRoot(layout);
109 }
110
111 private String getUserName(User user) {
112 String title = user.getProperty(MgnlUserManager.PROPERTY_TITLE);
113 String name = user.getName();
114 if (StringUtils.isNotEmpty(title) && !title.equals(name)) {
115 return String.format("%s (%s)", title, name);
116 } else {
117 return name;
118 }
119 }
120
121 private void onAction(String actionName) {
122 try {
123 actionExecutor.execute(actionName);
124 } catch (ActionExecutionException e) {
125 Message error = new Message(MessageType.ERROR, "An error occurred while executing an action.", e.getMessage());
126 log.error("An error occurred while executing action [{}]", actionName, e);
127 messagesManager.sendLocalMessage(error);
128 }
129 }
130 }