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.ui.dialog.formdialog;
35
36 import info.magnolia.i18nsystem.I18nizer;
37 import info.magnolia.i18nsystem.SimpleTranslator;
38 import info.magnolia.objectfactory.ComponentProvider;
39 import info.magnolia.ui.api.action.ActionDefinition;
40 import info.magnolia.ui.api.availability.AvailabilityChecker;
41 import info.magnolia.ui.api.context.UiContext;
42 import info.magnolia.ui.api.overlay.OverlayCloser;
43 import info.magnolia.ui.dialog.BaseDialogPresenter;
44 import info.magnolia.ui.dialog.Dialog;
45 import info.magnolia.ui.dialog.DialogCloseHandler;
46 import info.magnolia.ui.dialog.DialogView;
47 import info.magnolia.ui.dialog.actionarea.DialogActionExecutor;
48 import info.magnolia.ui.dialog.definition.FormDialogDefinition;
49 import info.magnolia.ui.dialog.registry.DialogDefinitionRegistry;
50 import info.magnolia.ui.form.EditorCallback;
51 import info.magnolia.ui.form.EditorValidator;
52 import info.magnolia.ui.form.FormPresenter;
53 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
54
55 import java.util.ArrayList;
56 import java.util.Arrays;
57 import java.util.Iterator;
58 import java.util.List;
59
60 import javax.inject.Inject;
61
62 import org.apache.commons.lang3.StringUtils;
63 import org.slf4j.Logger;
64 import org.slf4j.LoggerFactory;
65
66 import com.vaadin.v7.data.Item;
67 import com.vaadin.v7.data.Property;
68
69
70
71
72 public class FormDialogPresenterImpl extends BaseDialogPresenter implements FormDialogPresenter, EditorValidator {
73
74 private static final Logger log = LoggerFactory.getLogger(FormDialogPresenterImpl.class);
75
76 private EditorCallback callback;
77
78 private DialogDefinitionRegistry dialogDefinitionRegistry;
79
80 private ContentConnector contentConnector;
81
82 private AvailabilityChecker checker;
83
84 private FormPresenter formPresenter;
85
86 private FormView formView;
87
88 private Item item;
89
90 @Inject
91 public FormDialogPresenterImpl(final DialogDefinitionRegistry dialogDefinitionRegistry, ComponentProvider componentProvider, DialogActionExecutor executor, FormView view, I18nizer i18nizer, SimpleTranslator i18n, AvailabilityChecker checker, ContentConnector contentConnector, FormPresenter formPresenter) {
92 super(componentProvider, executor, view, i18nizer, i18n);
93 this.dialogDefinitionRegistry = dialogDefinitionRegistry;
94 this.checker = checker;
95 this.contentConnector = contentConnector;
96 this.formPresenter = formPresenter;
97 this.componentProvider = componentProvider;
98 this.formView = view;
99 }
100
101
102
103
104
105
106 @Deprecated
107 public FormDialogPresenterImpl(DialogDefinitionRegistry dialogDefinitionRegistry, FormBuilder formBuilder, ComponentProvider componentProvider, DialogActionExecutor executor, FormView view, I18nizer i18nizer, SimpleTranslator i18n) {
108 this(dialogDefinitionRegistry, componentProvider, executor, view, i18nizer, i18n, componentProvider.getComponent(AvailabilityChecker.class), componentProvider.getComponent(ContentConnector.class), componentProvider.getComponent(FormPresenter.class));
109 }
110
111
112
113
114 @Deprecated
115 public FormDialogPresenterImpl(final DialogDefinitionRegistry dialogDefinitionRegistry, FormBuilder formBuilder, ComponentProvider componentProvider, DialogActionExecutor executor, FormView view, I18nizer i18nizer, SimpleTranslator i18n, AvailabilityChecker checker, ContentConnector contentConnector) {
116 this(dialogDefinitionRegistry, componentProvider, executor, view, i18nizer, i18n, checker, contentConnector, componentProvider.getComponent(FormPresenter.class));
117 }
118
119 @Override
120 public DialogView start(Item item, FormDialogDefinition dialogDefinition, UiContext uiContext, EditorCallback callback, ContentConnector contentConnector) {
121 this.contentConnector = contentConnector;
122 return start(item, dialogDefinition, uiContext, callback);
123 }
124
125 @Override
126 public DialogView start(Item item, String dialogId, final UiContext uiContext, EditorCallback callback) {
127 FormDialogDefinition dialogDefinition = (FormDialogDefinition) dialogDefinitionRegistry.getProvider(dialogId).get();
128 return start(item, dialogDefinition, uiContext, callback);
129 }
130
131
132
133
134
135
136
137
138
139
140
141 @Override
142 public DialogView start(Item item, FormDialogDefinition dialogDefinition, final UiContext uiContext, EditorCallback callback) {
143 this.callback = callback;
144 this.item = item;
145
146 super.start(dialogDefinition, uiContext);
147 getExecutor().setDialogDefinition(getDefinition());
148 buildView(getDefinition());
149
150 final OverlayCloser overlayCloser = uiContext.openOverlay(getView(), getView().getModalityLevel());
151 getView().addDialogCloseHandler(new DialogCloseHandler() {
152 @Override
153 public void onDialogClose(DialogView dialogView) {
154 overlayCloser.close();
155 }
156 });
157 getView().setClosable(true);
158 return getView();
159 }
160
161 private void buildView(FormDialogDefinition dialogDefinition) {
162 final Dialog dialog = new Dialog(dialogDefinition);
163 formPresenter.presentView(formView, dialogDefinition.getForm(), item, dialog);
164
165 final String description = dialogDefinition.getDescription();
166 final String label = dialogDefinition.getLabel();
167
168 if (StringUtils.isNotBlank(description) && !isMessageKey(description)) {
169 getView().setDescription(description);
170 }
171
172 if (StringUtils.isNotBlank(dialogDefinition.getDialogLabelItemProperty()) && item != null) {
173 Property labelProperty = item.getItemProperty(dialogDefinition.getDialogLabelItemProperty());
174 if (labelProperty != null && labelProperty.getValue() != null) {
175 getView().setCaption(String.valueOf(labelProperty.getValue()));
176 }
177 } else if (StringUtils.isNotBlank(label) && !isMessageKey(label)) {
178 getView().setCaption(label);
179 }
180 }
181
182 @Override
183 public FormView getView() {
184 return formView;
185 }
186
187 @Override
188 public void showValidation(boolean visible) {
189 getView().showValidation(visible);
190 }
191
192 @Override
193 public boolean isValid() {
194 return formPresenter.isValid();
195 }
196
197 @Override
198 protected DialogActionExecutor getExecutor() {
199 return (DialogActionExecutor) super.getExecutor();
200 }
201
202 @Override
203 protected Iterable<ActionDefinition> filterActions() {
204 List<ActionDefinition> actions = new ArrayList<ActionDefinition>(getDefinition().getActions().values());
205 Iterator<ActionDefinition> it = actions.iterator();
206 Object itemId = contentConnector.getItemId(item);
207 if (itemId != null) {
208 while (it.hasNext()) {
209 ActionDefinition action = it.next();
210 if (!checker.isAvailable(action.getAvailability(), Arrays.asList(itemId))) {
211 it.remove();
212 }
213 }
214 } else {
215 log.info("Could not resolve itemId for item {}:{}, will not restrict availability of dialog actions.", item.getClass().getName(), item);
216 }
217 return actions;
218 }
219
220 @Override
221 protected Object[] getActionParameters(String actionName) {
222 return new Object[] { this, item, callback };
223 }
224
225 @Override
226 protected FormDialogDefinition getDefinition() {
227 return (FormDialogDefinition) super.getDefinition();
228 }
229
230
231
232
233 private boolean isMessageKey(final String text) {
234 return !text.contains(" ") && text.contains(".") && !text.endsWith(".");
235 }
236
237 @Override
238 protected void onCancel () {
239 if (callback != null) {
240 callback.onCancel();
241 }
242 }
243
244 @Override
245 public Item getRelatedItem() {
246 return item;
247 }
248 }