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.contentapp.action;
35
36 import info.magnolia.ui.api.action.ActionExecutionException;
37 import info.magnolia.ui.contentapp.browser.context.ValueContext;
38 import info.magnolia.ui.CloseHandler;
39 import info.magnolia.ui.framework.databinding.view.EditorView;
40
41 import java.util.Iterator;
42 import java.util.List;
43
44 import javax.inject.Inject;
45
46 import com.vaadin.data.BinderValidationStatus;
47 import com.vaadin.data.BindingValidationStatus;
48 import com.vaadin.ui.Component;
49
50
51
52
53 public class CommitAction<T> extends CloseAction {
54
55 private final ValueContext<T> valueContext;
56 private final EditorView<T> form;
57
58 @Inject
59 public CommitAction(CommitActionDefinition definition, CloseHandler closeHandler, ValueContext valueContext, EditorView form) {
60 super(definition, closeHandler);
61 this.valueContext = valueContext;
62 this.form = form;
63 }
64
65 @Override
66 public void execute() throws ActionExecutionException {
67 List<BinderValidationStatus<?>> validationStatuses = form.validate();
68 if (validationStatuses.stream()
69 .filter(BinderValidationStatus::hasErrors).findFirst()
70 .map(BinderValidationStatus::getFieldValidationErrors).map(List::iterator).filter(Iterator::hasNext).map(Iterator::next)
71 .map(BindingValidationStatus::getField)
72 .map(Component.class::cast).map(Component::getParent)
73 .filter(Component.Focusable.class::isInstance).map(Component.Focusable.class::cast)
74 .map(field -> {
75 field.focus();
76 return true;
77 })
78 .orElse(false)) {
79 return;
80 }
81
82 valueContext.getSingle().ifPresent(t -> {
83 form.write(t);
84 valueContext.set(t);
85 });
86 super.execute();
87 }
88 }