This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new 8848eea  ISIS-2340: vaa: fix action dialog params not bound to backend
8848eea is described below

commit 8848eea18e5b87ce903fe7b32b07044f73f22d9d
Author: Andi Huber <[email protected]>
AuthorDate: Fri Aug 28 07:36:46 2020 +0200

    ISIS-2340: vaa: fix action dialog params not bound to backend
---
 .../viewer/vaadin/ui/binding/BindingsVaa.java      | 49 ++++++++++++++++++----
 .../vaadin/ui/pages/main/UiActionHandlerVaa.java   |  2 +-
 2 files changed, 43 insertions(+), 8 deletions(-)

diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
index 2098f6a..951494e 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/binding/BindingsVaa.java
@@ -26,10 +26,12 @@ import com.vaadin.flow.component.HasValue;
 import com.vaadin.flow.data.binder.Binder;
 import com.vaadin.flow.data.binder.Binder.BindingBuilder;
 import com.vaadin.flow.data.binder.Result;
+import com.vaadin.flow.data.binder.Setter;
 import com.vaadin.flow.data.binder.ValueContext;
 import com.vaadin.flow.data.converter.Converter;
 import com.vaadin.flow.data.converter.DateToSqlDateConverter;
 import com.vaadin.flow.data.converter.LocalDateToDateConverter;
+import com.vaadin.flow.function.ValueProvider;
 
 import org.apache.isis.core.commons.binding.Bindable;
 import org.apache.isis.core.commons.binding.Observable;
@@ -48,8 +50,10 @@ import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.experimental.UtilityClass;
+import lombok.extern.log4j.Log4j2;
 
 @UtilityClass
+@Log4j2
 public final class BindingsVaa {
 
     /**
@@ -67,7 +71,35 @@ public final class BindingsVaa {
             uiField.setValue(_Casts.uncheckedCast(newValue.getPojo()));
         });
     }
-    
+
+    @RequiredArgsConstructor(staticName = "of")
+    private static class InternalBidirBinding<V> 
+    implements 
+        ValueProvider<Bindable<ManagedObject>, V>, 
+        Setter<Bindable<ManagedObject>, V> 
+    {
+
+        private static final long serialVersionUID = 1L;
+        private final @NonNull ObjectSpecification valueSpec;
+
+        //GETTER
+        @Override
+        public V apply(Bindable<ManagedObject> source) {
+            val newFieldValue = 
_Casts.<V>uncheckedCast(source.getValue().getPojo());
+            log.debug("InternalBidirBinding <<< {}", newFieldValue);
+            return newFieldValue;
+        }
+
+        //SETTER
+        @Override
+        public void accept(Bindable<ManagedObject> target, V fieldValue) {
+            log.debug("InternalBidirBinding {} >>>", fieldValue);
+            target.setValue(ManagedObject.of(valueSpec, fieldValue));
+        }
+
+
+    }
+
     /**
      * Binds the uiField's (rendered) value to a {@link Bindable}. 
      * @param <V>
@@ -81,16 +113,19 @@ public final class BindingsVaa {
 
         uiField.setReadOnly(false);
         val binder = new Binder<Bindable<ManagedObject>>();
+        val internalBinding = InternalBidirBinding.<V>of(valueSpec);
 
         //TODO does not account for changes originating from backend side
         //need to check whether true bi-dir binding is possible with Vaadin
         binder.forField(uiField)
         .bind(
-                
bindable->_Casts.<V>uncheckedCast(bindable.getValue().getPojo()), 
-                (bindable, 
newValuePojo)->bindable.setValue(ManagedObject.of(valueSpec, newValuePojo)) 
+                internalBinding::apply, 
+                internalBinding::accept
                 );
+        
+        binder.setBean(value);
     }
-    
+
     /**
      * Binds the uiField's (rendered) validation feedback to an {@link 
Observable}. 
      * @param <F>
@@ -106,11 +141,11 @@ public final class BindingsVaa {
             uiField.setInvalid(_Strings.isNotEmpty(newValue));
         });
     }
-    
+
 
     public static <V, F extends HasValue<?, V> & HasValidation>
     void bindFeature(F uiField, ManagedFeature managedFeature) {
-        
+
         val valueSpec = managedFeature.getSpecification();
 
         if(managedFeature instanceof ManagedParameter) {
@@ -230,7 +265,7 @@ public final class BindingsVaa {
 
             return validationMessage==null
                     ? Result.ok(newValue)
-                    : Result.error(validationMessage);
+                            : Result.error(validationMessage);
         }
 
         @Override
diff --git 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
index 6dd2972..391930a 100644
--- 
a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
+++ 
b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/pages/main/UiActionHandlerVaa.java
@@ -58,7 +58,7 @@ public class UiActionHandlerVaa {
                     uiComponentFactory, 
                     managedAction,
                     params->{
-                        log.info("param negotiation done");
+                        log.info("param negotiation done {}", params);
                         invoke(managedAction, params);
                         return true; //TODO handle vetoes
                     });

Reply via email to