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;
35
36 import static com.vaadin.server.Sizeable.Unit.PERCENTAGE;
37
38 import info.magnolia.i18nsystem.SimpleTranslator;
39 import info.magnolia.ui.AlertBuilder;
40 import info.magnolia.ui.DialogBuilder;
41 import info.magnolia.ui.api.context.UiContext;
42 import info.magnolia.ui.api.ioc.AdmincentralScoped;
43 import info.magnolia.ui.api.message.Message;
44 import info.magnolia.ui.api.message.MessageType;
45 import info.magnolia.ui.api.overlay.AlertCallback;
46 import info.magnolia.ui.api.overlay.ConfirmationCallback;
47 import info.magnolia.ui.api.overlay.MessageStyleType;
48 import info.magnolia.ui.api.overlay.NotificationCallback;
49 import info.magnolia.ui.api.overlay.OverlayCloser;
50 import info.magnolia.ui.api.overlay.OverlayLayer;
51 import info.magnolia.ui.api.shell.ConfirmationHandler;
52 import info.magnolia.ui.api.shell.Shell;
53 import info.magnolia.ui.api.view.View;
54 import info.magnolia.ui.dialog.DialogView;
55 import info.magnolia.ui.framework.message.MessagesManager;
56 import info.magnolia.ui.vaadin.overlay.MessageStyleTypeEnum;
57
58 import javax.inject.Inject;
59
60 import com.vaadin.server.Page;
61 import com.vaadin.ui.Component;
62 import com.vaadin.ui.Notification;
63 import com.vaadin.ui.UI;
64 import com.vaadin.ui.Window;
65
66
67
68
69
70
71 @AdmincentralScoped
72 public class ResurfaceShell implements Shell, UiContext {
73
74 private final MessagesManager messagesManager;
75
76 private final SimpleTranslator i18n;
77
78 @Inject
79 public ResurfaceShell(MessagesManager messagesManager, SimpleTranslator i18n) {
80 this.messagesManager = messagesManager;
81 this.i18n = i18n;
82 }
83
84
85
86 @Override
87 public void askForConfirmation(String message, ConfirmationHandler listener) {
88
89 AlertBuilder.confirmDialog("confirm")
90 .withBody(message)
91 .withConfirmationHandler(listener::onConfirm)
92 .withConfirmButtonCaption(i18n.translate("button.confirm"))
93 .withDeclineButtonCaption(i18n.translate("button.decline"))
94 .buildAndOpen();
95 }
96
97 @Override
98 public void showNotification(String message) {
99 showMessage(message, MessageType.INFO);
100 }
101
102 @Override
103 public void showError(String message, Exception e) {
104 showMessage(message, MessageType.ERROR);
105 }
106
107 private void showMessage(String messageText, MessageType type) {
108 final Message message = new Message();
109 message.setMessage(messageText);
110 message.setType(type);
111 messagesManager.sendLocalMessage(message);
112 }
113
114
115
116 @Override
117 public String getFragment() {
118 return Page.getCurrent().getUriFragment();
119 }
120
121 @Override
122 public void setFragment(String fragment) {
123 Page.getCurrent().setUriFragment(fragment);
124 }
125
126
127
128 @Override
129 public OverlayCloser openOverlayOnView(View view, View parent, ModalityDomain modalityLocation, ModalityLevel modalityLevel) {
130 return openOverlay(view, modalityLevel);
131 }
132
133 @Override
134 public OverlayCloser openOverlay(View view) {
135 return openOverlay(view, ModalityLevel.STRONG);
136 }
137
138 @Override
139 public OverlayCloser openOverlay(View view, ModalityLevel modalityLevel) {
140 final Component component = view.asVaadinComponent();
141 final Window window;
142 if (component instanceof Window) {
143 window = (Window) component;
144 } else if (view instanceof DialogView) {
145 final DialogView dialogView = (DialogView) view;
146 final Component contentComponent = dialogView.asVaadinComponent();
147 final Component actionAreaComponent = dialogView.getActionAreaView().asVaadinComponent();
148
149
150 contentComponent.setParent(null);
151 actionAreaComponent.setParent(null);
152
153 window = new Window(dialogView.getTitle());
154 window.addCloseListener(listener -> dialogView.close());
155
156 window.setContent(DialogBuilder.dialog()
157 .withContent(contentComponent)
158 .withFooter(actionAreaComponent)
159 .withTitle(dialogView.getTitle())
160 .build());
161 } else {
162 window = new Window();
163 window.setCaption(component.getCaption());
164 window.setContent(component);
165 }
166
167 window.addStyleNames("dialog");
168 window.setWidth(95, PERCENTAGE);
169 window.setDraggable(false);
170 window.setResizable(true);
171 window.setModal(ModalityLevel.STRONG == modalityLevel);
172 window.center();
173
174 UI.getCurrent().addWindow(window);
175
176 return window::close;
177 }
178
179
180
181 @Override
182 public void openNotification(MessageStyleType messageType, boolean doesTimeout, String title) {
183 Notification notification = Notification.show(title, notificationTypeOf(messageType));
184 if (doesTimeout) {
185 notification.setDelayMsec(3600);
186 }
187 }
188
189 @Override
190 public void openNotification(MessageStyleType messageType, boolean doesTimeout, View viewToShow) {
191 throw new UnsupportedOperationException();
192 }
193
194 @Override
195 public void openNotification(MessageStyleType messageType, boolean doesTimeout, String title, String linkText, NotificationCallback cb) {
196 throw new UnsupportedOperationException();
197 }
198
199 @Override
200 public void openAlert(MessageStyleType messageType, String title, String body, String okButton, AlertCallback callback) {
201 Window window = AlertBuilder.alert(title)
202 .withLevel(notificationTypeOf(messageType))
203 .withBody(body)
204 .withConfirmationHandler(callback::onOk)
205 .withOkButtonCaption(okButton)
206 .buildAndOpen();
207
208 window.addStyleName(messageType.getCssClass());
209 }
210
211 @Override
212 public void openAlert(MessageStyleType messageType, View content, String okButton, AlertCallback callback) {
213 Window window = AlertBuilder.alert("")
214 .withLevel(notificationTypeOf(messageType))
215 .withContent(content.asVaadinComponent())
216 .withConfirmationHandler(callback::onOk)
217 .withOkButtonCaption(okButton)
218 .buildAndOpen();
219
220 window.addStyleName(messageType.getCssClass());
221 }
222
223 @Override
224 public void openAlert(MessageStyleType messageType, String title, View content, String okButton, AlertCallback callback) {
225 Window window = AlertBuilder.alert(title)
226 .withLevel(notificationTypeOf(messageType))
227 .withContent(content.asVaadinComponent())
228 .withConfirmationHandler(callback::onOk)
229 .withOkButtonCaption(okButton)
230 .buildAndOpen();
231
232 window.addStyleName(messageType.getCssClass());
233 }
234
235 @Override
236 public void openConfirmation(MessageStyleType messageType, String title, String body, String confirmButton, String cancelButton, boolean cancelIsDefault, ConfirmationCallback callback) {
237 Window confirmDialog = AlertBuilder.confirmDialog(title)
238 .withLevel(notificationTypeOf(messageType))
239 .withBody(body)
240 .withConfirmationHandler(callback::onSuccess)
241 .withConfirmButtonCaption(confirmButton)
242 .withDeclineButtonCaption(cancelButton)
243 .buildAndOpen();
244
245 confirmDialog.addStyleName(messageType.getCssClass());
246 }
247
248 @Override
249 public void openConfirmation(MessageStyleType messageType, View content, String confirmButton, String cancelButton, boolean cancelIsDefault, ConfirmationCallback callback) {
250 Window confirmDialog = AlertBuilder.confirmDialog("")
251 .withLevel(notificationTypeOf(messageType))
252 .withContent(content.asVaadinComponent())
253 .withConfirmationHandler(callback::onSuccess)
254 .withConfirmButtonCaption(confirmButton)
255 .withDeclineButtonCaption(cancelButton)
256 .buildAndOpen();
257
258 confirmDialog.addStyleName(messageType.getCssClass());
259 }
260
261 @Override
262 public void openConfirmation(MessageStyleType messageType, String title, View content, String confirmButton, String cancelButton, boolean cancelIsDefault, ConfirmationCallback callback) {
263 Window confirmDialog = AlertBuilder.confirmDialog(title)
264 .withLevel(notificationTypeOf(messageType))
265 .withContent(content.asVaadinComponent())
266 .withConfirmationHandler(callback::onSuccess)
267 .withConfirmButtonCaption(confirmButton)
268 .withDeclineButtonCaption(cancelButton)
269 .buildAndOpen();
270
271 confirmDialog.addStyleName(messageType.getCssClass());
272 }
273
274 @Override
275 public OverlayLayer getOverlayDelegate() {
276 return this;
277 }
278
279
280
281
282
283
284
285 private static Notification.Type notificationTypeOf(MessageStyleType messageStyleType) {
286 if (messageStyleType instanceof MessageStyleTypeEnum) {
287 switch ((MessageStyleTypeEnum) messageStyleType) {
288 case INFO:
289 return Notification.Type.HUMANIZED_MESSAGE;
290 case WARNING:
291 return Notification.Type.WARNING_MESSAGE;
292 case ERROR:
293 return Notification.Type.ERROR_MESSAGE;
294 }
295 }
296 return Notification.Type.HUMANIZED_MESSAGE;
297 }
298 }