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