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.CloseHandler;
37 import info.magnolia.ui.ValueContext;
38 import info.magnolia.ui.api.action.ActionExecutionException;
39 import info.magnolia.ui.contentapp.Datasource;
40 import info.magnolia.ui.editor.EditorView;
41 import info.magnolia.ui.observation.DatasourceObservation;
42
43 import java.util.Collection;
44 import java.util.List;
45 import java.util.stream.Collectors;
46
47 import javax.inject.Inject;
48
49 import com.vaadin.data.BinderValidationStatus;
50 import com.vaadin.data.BindingValidationStatus;
51 import com.vaadin.ui.Component;
52
53 import lombok.AccessLevel;
54 import lombok.Getter;
55
56
57
58
59 @Getter(AccessLevel.PROTECTED)
60 public class CommitAction<T> extends CloseAction<CommitActionDefinition> {
61
62 private final ValueContext<T> valueContext;
63 private final EditorView<T> form;
64 private final Datasource<T> datasource;
65 private final DatasourceObservation.Manual datasourceObservation;
66
67 @Inject
68 public CommitAction(CommitActionDefinition definition, CloseHandler closeHandler, ValueContext<T> valueContext, EditorView<T> form, Datasource<T> datasource, DatasourceObservation.Manual datasourceObservation) {
69 super(definition, closeHandler);
70 this.valueContext = valueContext;
71 this.form = form;
72 this.datasource = datasource;
73 this.datasourceObservation = datasourceObservation;
74 }
75
76 @Override
77 public void execute() throws ActionExecutionException {
78 List<BinderValidationStatus<?>> validationStatuses = form.validate();
79 boolean hasValidationErrors = validationStatuses.stream().anyMatch(BinderValidationStatus::hasErrors);
80
81
82 if (hasValidationErrors) {
83
84 List<BindingValidationStatus<?>> bindingValidationStatuses = validationStatuses.stream()
85 .map(BinderValidationStatus::getFieldValidationErrors)
86 .flatMap(Collection::stream).collect(Collectors.toList());
87
88
89 for (BindingValidationStatus<?> validationStatus : bindingValidationStatuses) {
90 Component field = (Component) validationStatus.getField();
91 Component parent = field.getParent();
92
93 while ((parent != null) && !(parent instanceof Component.Focusable)) {
94 parent = parent.getParent();
95 }
96
97 if (parent != null) {
98 ((Component.Focusable) parent).focus();
99 break;
100 }
101 }
102 return;
103 }
104
105 write();
106
107 super.execute();
108 }
109
110 protected void write() {
111 valueContext.getSingle().ifPresent(item -> {
112 form.write(item);
113 datasource.commit(item);
114 datasourceObservation.trigger();
115 });
116 }
117
118 }