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 .withFooter(configureFooter(formDialogDefinition, actionExecutions, form).layout())
119 .buildAndOpen();
120
121 CloseHandler closeHandler = getCloseHandler(dialog);
122 dialog.addCloseListener((Window.CloseListener) e -> closeHandler.close());
123 form.bindInstance(CloseHandler.class, closeHandler);
124 }
125 } catch (Registry.InvalidDefinitionException | Registry.NoSuchDefinitionException e) {
126 throw new ActionExecutionException(e);
127 }
128 }
129
130 protected void populate(EditorView<T> form) {
131 valueContext.getSingle().ifPresent(form::populate);
132 }
133
134 protected EditorActionBar<T> configureFooter(FormDialogDefinition<T> dialogDefinition, List<ActionExecution<T>> actionExecutions, EditorView<T> form) {
135 EditorActionBar<T> editorActionBar = form.create(EditorActionBar.class);
136 editorActionBar
137 .withActions(actionExecutions)
138 .withLayoutDefinition(dialogDefinition.getFooterLayout());
139
140 if (dialogDefinition.getForm().hasI18NProperties()) {
141 LocaleSelector localeSelector = form.create(LocaleSelector.class);
142 editorActionBar = editorActionBar.withLabeledControl("localeSelector", localeSelector);
143 }
144 return editorActionBar;
145 }
146
147 protected CloseHandler getCloseHandler(Window dialog) {
148 return dialog::close;
149 }
150
151 protected DialogDefinition getDialogDefinition(DialogDefinitionRegistry dialogDefinitionRegistry, I18nizer i18nizer) {
152 return i18nizer.decorate(dialogDefinitionRegistry.getProvider(getDefinition().getDialogId()).get());
153 }
154
155 protected ValueContext<T> getValueContext() {
156 return valueContext;
157 }
158 }