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 } else {
108 form.applyDefaults();
109 }
110
111 List<ActionExecution<T>> actionExecutions =
112 ActionExecution.<T>fromDefinitions(dialogDefinition.getActions().values(), form.getComponentProvider())
113 .collect(toList());
114
115 Window dialog = new DialogBuilder()
116 .withTitle(dialogDefinition.getLabel())
117 .withContent(form.asVaadinComponent())
118 .withShortcuts(actionExecutions)
119 .light(dialogDefinition.isLight())
120 .width(dialogDefinition.getWidth())
121 .withFooter(configureFooter(formDialogDefinition, actionExecutions, form).layout())
122 .buildAndOpen();
123
124 CloseHandler closeHandler = getCloseHandler(dialog);
125 dialog.addCloseListener((Window.CloseListener) e -> closeHandler.close());
126 form.bindInstance(CloseHandler.class, closeHandler);
127 }
128 } catch (Registry.InvalidDefinitionException | Registry.NoSuchDefinitionException e) {
129 throw new ActionExecutionException(e);
130 }
131 }
132
133 protected void populate(EditorView<T> form) {
134 valueContext.getSingle().ifPresent(form::populate);
135 }
136
137 protected EditorActionBar<T> configureFooter(FormDialogDefinition<T> dialogDefinition, List<ActionExecution<T>> actionExecutions, EditorView<T> form) {
138 EditorActionBar<T> editorActionBar = form.create(EditorActionBar.class);
139 editorActionBar
140 .withActions(actionExecutions)
141 .withLayoutDefinition(dialogDefinition.getFooterLayout());
142
143 if (dialogDefinition.getForm().hasI18NProperties()) {
144 LocaleSelector localeSelector = form.create(LocaleSelector.class);
145 editorActionBar = editorActionBar.withLabeledControl("localeSelector", localeSelector);
146 }
147 return editorActionBar;
148 }
149
150 protected CloseHandler getCloseHandler(Window dialog) {
151 return dialog::close;
152 }
153
154 protected DialogDefinition getDialogDefinition(DialogDefinitionRegistry dialogDefinitionRegistry, I18nizer i18nizer) {
155 return i18nizer.decorate(dialogDefinitionRegistry.getProvider(getDefinition().getDialogId()).get());
156 }
157
158 protected ValueContext<T> getValueContext() {
159 return valueContext;
160 }
161 }