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.apps.notifications.view.detail;
35
36 import info.magnolia.admincentral.apps.notifications.view.column.NotificationTypeValueProvider;
37 import info.magnolia.context.Context;
38 import info.magnolia.i18nsystem.I18nizer;
39 import info.magnolia.icons.MagnoliaIcons;
40 import info.magnolia.ui.admincentral.shellapp.pulse.item.definition.ItemViewDefinition;
41 import info.magnolia.ui.admincentral.shellapp.pulse.item.registry.ItemViewDefinitionRegistry;
42 import info.magnolia.ui.api.app.SubAppContext;
43 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
44 import info.magnolia.ui.api.location.Location;
45 import info.magnolia.ui.api.message.Message;
46 import info.magnolia.ui.contentapp.browser.actions.ActionbarPresenter;
47 import info.magnolia.ui.contentapp.browser.actions.ActionbarView;
48 import info.magnolia.ui.ValueContext;
49 import info.magnolia.ui.contentapp.detail.AbstractDetailSubApp;
50 import info.magnolia.ui.contentapp.detail.ContentDetailSubApp;
51 import info.magnolia.ui.contentapp.detail.DetailDescriptor;
52 import info.magnolia.ui.editor.LocaleContext;
53 import info.magnolia.ui.form.definition.DefinitionConverter;
54 import info.magnolia.ui.ViewDefinition;
55 import info.magnolia.ui.editor.ItemProviderStrategy;
56 import info.magnolia.ui.editor.FormView;
57 import info.magnolia.ui.datasource.DatasourceDefinition;
58 import info.magnolia.ui.framework.message.MessagesManager;
59
60 import javax.inject.Inject;
61
62 import org.apache.commons.lang3.StringUtils;
63
64
65
66
67
68 public class NotificationDetailSubApp extends AbstractDetailSubApp<NotificationFormView> {
69
70 public static final String DEFAULT_VIEW = "admincentral:default";
71
72 private final DetailDescriptor<Message, ?> subAppDescriptor;
73 private final ItemViewDefinitionRegistry itemViewDefinitionRegistry;
74 private final I18nizer i18nizer;
75 private final NotificationTypeValueProvider notificationTypeValueProvider;
76 private final String currentUserName;
77 private final ValueContext<Message> valueContext;
78 private final MessagesManager messagesManager;
79 private final DatasourceDefinition datasourceDefinition;
80 private final LocaleContext localeContext;
81 private final I18NAuthoringSupport i18NAuthoringSupport;
82 private ContentDetailSubApp.LocationContext locationContext;
83 private ItemProviderStrategy<Message, ContentDetailSubApp.DetailLocation> itemProviderStrategy;
84
85 @Inject
86 protected NotificationDetailSubApp(SubAppContext subAppContext,
87 ItemViewDefinitionRegistry itemViewDefinitionRegistry,
88 I18nizer i18nizer,
89 MessagesManager messagesManager,
90 Context context,
91 DatasourceDefinition datasourceDefinition,
92 DetailDescriptor<Message, ?> descriptor,
93 ValueContext<Message> valueContext,
94 LocaleContext localeContext, I18NAuthoringSupport i18NAuthoringSupport) {
95 super(subAppContext, new NotificationFormView());
96 this.messagesManager = messagesManager;
97 this.subAppDescriptor = descriptor;
98 this.itemViewDefinitionRegistry = itemViewDefinitionRegistry;
99 this.i18nizer = i18nizer;
100 this.valueContext = valueContext;
101 this.localeContext = localeContext;
102 this.i18NAuthoringSupport = i18NAuthoringSupport;
103 this.notificationTypeValueProvider = new NotificationTypeValueProvider();
104 this.currentUserName = context.getUser().getName();
105 this.datasourceDefinition = datasourceDefinition;
106 }
107
108 @Override
109 public NotificationFormView start(Location location) {
110 super.start(location);
111
112 final NotificationFormView view = getView();
113
114 this.locationContext = bindContext(ContentDetailSubApp.LocationContext.class);
115 this.locationContext.location().set(ContentDetailSubApp.DetailLocation.wrap(location));
116 this.itemProviderStrategy = create(subAppDescriptor.getItemProvider(), datasourceDefinition);
117 this.bindContext(LocaleContext.class).defaultLocale().set(getSubAppContext().getAuthoringLocale());
118
119 itemProviderStrategy.read(ContentDetailSubApp.DetailLocation.wrap(location)).ifPresent(message -> {
120 valueContext.set(message);
121 messagesManager.clearMessage(currentUserName, message.getId());
122
123 String itemView = StringUtils.defaultString(message.getView(), DEFAULT_VIEW);
124
125 ItemViewDefinition itemViewDefinition = itemViewDefinitionRegistry.getProvider(itemView).get();
126 itemViewDefinition = i18nizer.decorate(itemViewDefinition);
127
128 localeContext.populateFromI18NAuthoringSupport(message, i18NAuthoringSupport);
129
130 FormView<Message> form = (FormView<Message>) create(DefinitionConverter.FORM.convert(itemViewDefinition.getForm()), localeContext);
131 view.setCaption(message.getSubject());
132 subAppDescriptor.setLabel(message.getSubject());
133 notificationTypeValueProvider.getIcon(message).ifPresent(this::updateViewAndSubAppDescriptorIcons);
134
135 view.setSizeFull();
136 view.addStyleName("detail");
137 view.setMargin(false);
138 view.setSpacing(false);
139
140 subAppDescriptor.setActions(itemViewDefinition.getActions());
141
142 ActionbarPresenter actionbarPresenter = create(ActionbarPresenter.class, subAppDescriptor.getActions(), itemViewDefinition.getActionbar());
143 ActionbarView actionbar = (ActionbarView) create(
144 ViewDefinition.builder()
145 .withImplementationClass(ActionbarView.class)
146 .withName("actionbar")
147 .build(), itemViewDefinition.getActionbar(), actionbarPresenter);
148 view.setActionBar(actionbar);
149 view.setContent(form.asVaadinComponent());
150
151 locationContext.location().observeNullable(l -> itemProviderStrategy.read(l).ifPresent(msg -> {
152 valueContext.set(msg);
153 form.populate(msg);
154 view.setCaption(msg.getSubject());
155 subAppDescriptor.setLabel(msg.getSubject());
156 notificationTypeValueProvider.getIcon(msg).ifPresent(this::updateViewAndSubAppDescriptorIcons);
157 }));
158 });
159
160 return view;
161 }
162
163 private void updateViewAndSubAppDescriptorIcons(MagnoliaIcons icon) {
164 getView().setIcon(icon);
165 subAppDescriptor.setIcon(icon.getCssClass());
166 }
167
168 @Override
169 public void locationChanged(Location location) {
170 super.locationChanged(location);
171 this.locationContext.location().set(ContentDetailSubApp.DetailLocation.wrap(location));
172 }
173 }