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.actions;
35
36 import static java.util.stream.Collectors.toList;
37
38 import info.magnolia.config.registry.Registry;
39 import info.magnolia.i18nsystem.I18nizer;
40 import info.magnolia.ui.CloseHandler;
41 import info.magnolia.ui.UIComponent;
42 import info.magnolia.ui.ValueContext;
43 import info.magnolia.ui.api.action.AbstractAction;
44 import info.magnolia.ui.api.action.ActionExecutionException;
45 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
46 import info.magnolia.ui.dialog.ActionExecution;
47 import info.magnolia.ui.dialog.DialogBuilder;
48 import info.magnolia.ui.dialog.DialogDefinition;
49 import info.magnolia.ui.dialog.DialogDefinitionRegistry;
50 import info.magnolia.ui.dialog.EditorActionBar;
51 import info.magnolia.ui.dialog.FormDialogDefinition;
52 import info.magnolia.ui.editor.EditorView;
53 import info.magnolia.ui.editor.LocaleContext;
54 import info.magnolia.ui.field.LocaleSelector;
55
56 import java.util.List;
57
58 import javax.inject.Inject;
59
60 import com.vaadin.ui.Window;
61
62
63
64
65 public class OpenDialogAction<T> extends AbstractAction<OpenDialogActionDefinition> {
66
67 private final UIComponent parentView;
68 private final I18NAuthoringSupport<T> i18NAuthoringSupport;
69 private final DialogDefinitionRegistry dialogDefinitionRegistry;
70 private final LocaleContext localeContext;
71 private final ValueContext<T> valueContext;
72 private final I18nizer i18nizer;
73
74 @Inject
75 public OpenDialogAction(OpenDialogActionDefinition definition,
76 LocaleContext localeContext,
77 ValueContext<T> valueContext,
78 UIComponent parentView,
79 I18NAuthoringSupport<T> i18NAuthoringSupport,
80 DialogDefinitionRegistry dialogDefinitionRegistry,
81 I18nizer i18nizer) {
82 super(definition);
83 this.localeContext = localeContext;
84 this.valueContext = valueContext;
85 this.parentView = parentView;
86 this.i18NAuthoringSupport = i18NAuthoringSupport;
87 this.dialogDefinitionRegistry = dialogDefinitionRegistry;
88 this.i18nizer = i18nizer;
89 }
90
91 @Override
92 public void execute() throws ActionExecutionException {
93 try {
94 DialogDefinition dialogDefinition = getDialogDefinition(dialogDefinitionRegistry, i18nizer);
95 if (dialogDefinition instanceof FormDialogDefinition) {
96 valueContext.getSingle().ifPresent(item -> {
97 if (!localeContext.isPopulated()) {
98 localeContext.populateFromI18NAuthoringSupport(item, i18NAuthoringSupport);
99 }
100 });
101
102 FormDialogDefinition<T> formDialogDefinition = (FormDialogDefinition) dialogDefinition;
103 EditorView<T> form = parentView.create(formDialogDefinition.getForm());
104
105 if (getDefinition().isPopulate()) {
106 populate(form);
107 }
108
109 List<ActionExecution<T>> actionExecutions =
110 ActionExecution.<T>fromDefinitions(dialogDefinition.getActions().values(), form.getComponentProvider())
111 .collect(toList());
112
113 Window dialog = new DialogBuilder()
114 .withTitle(dialogDefinition.getLabel())
115 .withContent(form.asVaadinComponent())
116 .withShortcuts(actionExecutions)
117 .light(dialogDefinition.isLight())
118 .wide(dialogDefinition.isWide())
119 .withFooter(configureFooter(formDialogDefinition, actionExecutions, form).layout())
120 .buildAndOpen();
121
122 CloseHandler closeHandler = getCloseHandler(dialog);
123 dialog.addCloseListener((Window.CloseListener) e -> closeHandler.close());
124 form.bindInstance(CloseHandler.class, closeHandler);
125 }
126 } catch (Registry.InvalidDefinitionException | Registry.NoSuchDefinitionException e) {
127 throw new ActionExecutionException(e);
128 }
129 }
130
131 protected void populate(EditorView<T> form) {
132 valueContext.getSingle().ifPresent(form::populate);
133 }
134
135 protected EditorActionBar<T> configureFooter(FormDialogDefinition<T> dialogDefinition, List<ActionExecution<T>> actionExecutions, EditorView<T> form) {
136 EditorActionBar<T> editorActionBar = form.create(EditorActionBar.class);
137 editorActionBar
138 .withActions(actionExecutions)
139 .withLayoutDefinition(dialogDefinition.getFooterLayout());
140
141 if (dialogDefinition.getForm().hasI18NProperties()) {
142 LocaleSelector localeSelector = form.create(LocaleSelector.class);
143 editorActionBar = editorActionBar.withLabeledControl("localeSelector", localeSelector);
144 }
145 return editorActionBar;
146 }
147
148 protected CloseHandler getCloseHandler(Window dialog) {
149 return dialog::close;
150 }
151
152 protected DialogDefinition getDialogDefinition(DialogDefinitionRegistry dialogDefinitionRegistry, I18nizer i18nizer) {
153 return i18nizer.decorate(dialogDefinitionRegistry.getProvider(getDefinition().getDialogId()).get());
154 }
155
156 protected ValueContext<T> getValueContext() {
157 return valueContext;
158 }
159 }