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 if (!validateForm()) {
79 return;
80 }
81
82 write();
83
84 super.execute();
85 }
86
87 protected boolean validateForm() {
88 List<BindingValidationStatus<?>> bindingValidationErrors = getBindingValidationErrors();
89
90
91 if (!bindingValidationErrors.isEmpty()) {
92
93
94 for (BindingValidationStatus<?> validationStatus : bindingValidationErrors) {
95 Component field = (Component) validationStatus.getField();
96 Component parent = field.getParent();
97
98 while ((parent != null) && !(parent instanceof Component.Focusable)) {
99 parent = parent.getParent();
100 }
101
102 if (parent != null) {
103 ((Component.Focusable) parent).focus();
104 break;
105 }
106 }
107 return false;
108 }
109 return true;
110 }
111
112 protected List<BindingValidationStatus<?>> getBindingValidationErrors() {
113 List<BinderValidationStatus<?>> validationStatuses = form.validate();
114
115 return validationStatuses.stream()
116 .map(BinderValidationStatus::getFieldValidationErrors)
117 .flatMap(Collection::stream)
118 .collect(Collectors.toList());
119 }
120
121 protected void write() {
122 valueContext.getSingle().ifPresent(item -> {
123 form.write(item);
124 datasource.commit(item);
125 datasourceObservation.trigger();
126 });
127 }
128
129 }