You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@causeway.apache.org by ah...@apache.org on 2023/03/21 13:10:13 UTC

[causeway] branch master updated: CAUSEWAY-3391: fixes param (obj. ref.) not shown if it has no choices

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/causeway.git


The following commit(s) were added to refs/heads/master by this push:
     new b2819bc562 CAUSEWAY-3391: fixes param (obj. ref.) not shown if it has no choices
b2819bc562 is described below

commit b2819bc5620dd1d976e8eefd28b5d925820537af
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Mar 21 14:10:06 2023 +0100

    CAUSEWAY-3391: fixes param (obj. ref.) not shown if it has no choices
---
 .../viewer/commons/model/scalar/UiScalar.java      |  2 +-
 .../scalars/ScalarPanelSelectAbstract.java         | 22 +++---
 .../scalars/choices/ObjectChoicesSelect2Panel.java | 83 ++++++++++++----------
 .../ui/components/widgets/select2/Select2.java     | 25 ++++---
 4 files changed, 68 insertions(+), 64 deletions(-)

diff --git a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/scalar/UiScalar.java b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/scalar/UiScalar.java
index 65699b0c97..485c33b2b1 100644
--- a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/scalar/UiScalar.java
+++ b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/scalar/UiScalar.java
@@ -114,7 +114,7 @@ public interface UiScalar extends UiModel, HasMetaModelContext {
                 return ChoiceProviderSort.CHOICES;
             } else if(scalarModel.hasAutoComplete()) {
                 return ChoiceProviderSort.AUTO_COMPLETE;
-            } else if(Facets.autoCompleteIsPresent(scalarModel.getScalarTypeSpec())) {
+            } else if(scalarModel.hasObjectAutoComplete()) {
                 return ChoiceProviderSort.OBJECT_AUTO_COMPLETE;
             }
             return NO_CHOICES;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
index e6ca79487d..4c53035902 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/ScalarPanelSelectAbstract.java
@@ -66,19 +66,19 @@ extends ScalarPanelFormFieldAbstract<ManagedObject> {
                 choiceProviderFactory.apply(scalarModel),
                 getScalarModelChangeDispatcher());
         val settings = select2.getSettings();
+        settings.setPlaceholder(scalarModel.getFriendlyName());
+
         switch(scalarModel.getChoiceProviderSort()) {
         case CHOICES:
-            settings.setPlaceholder(scalarModel.getFriendlyName());
             break;
         case AUTO_COMPLETE:
-            settings.setPlaceholder(scalarModel.getFriendlyName());
             settings.setMinimumInputLength(scalarModel.getAutoCompleteMinLength());
             break;
         case OBJECT_AUTO_COMPLETE:
-            //TODO render object place holder?
             Facets.autoCompleteMinLength(scalarModel.getScalarTypeSpec())
             .ifPresent(settings::setMinimumInputLength);
             break;
+        case NO_CHOICES:
         default:
             // ignore if no choices
         }
@@ -94,14 +94,14 @@ extends ScalarPanelFormFieldAbstract<ManagedObject> {
          */
     }
 
-    protected final boolean isEditableWithEitherAutoCompleteOrChoices() {
-        if(scalarModel().getRenderingHint().isInTable()) {
-            return false;
-        }
-        // doesn't apply if not editable, either
-        if(scalarModel().isViewMode()) {
-            return false;
-        }
+    protected final boolean isEditable() {
+        val scalarModel = scalarModel();
+        // cannot edit if in table or is view-mode
+        return !scalarModel.getRenderingHint().isInTable()
+                && !scalarModel.isViewMode();
+    }
+
+    protected final boolean hasAnyChoices() {
         return scalarModel().getChoiceProviderSort().isChoicesAny();
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/choices/ObjectChoicesSelect2Panel.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/choices/ObjectChoicesSelect2Panel.java
index cc0c89213b..09bc96c812 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/choices/ObjectChoicesSelect2Panel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/scalars/choices/ObjectChoicesSelect2Panel.java
@@ -86,6 +86,7 @@ implements ChoiceTitleHandler {
 
     @Override
     protected FormComponent<ManagedObject> createFormComponent(final String id, final ScalarModel scalarModel) {
+
         this.entityLink = new ChoiceFormComponent(UiComponentType.ENTITY_LINK.getId(), this);
         entityLink.setRequired(scalarModel.isRequired());
 
@@ -171,47 +172,51 @@ implements ChoiceTitleHandler {
             }
         });
 
-        // syncLinkWithInputIfAutoCompleteOrChoices
-        if(isEditableWithEitherAutoCompleteOrChoices()) {
-
-            if(select2 == null) {
-                throw new IllegalStateException("select2 should be created already");
-            } else {
-                //
-                // the select2Choice already exists, so the widget has been rendered before.  If it is
-                // being re-rendered now, it may be because some other property/parameter was invalid.
-                // when the form was submitted, the selected object (its oid as a string) would have
-                // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
-                // would be correctly converted and processed by the select2Choice's choiceProvider.  However,
-                // an invalid property/parameter means that the webpage is re-rendered in another request,
-                // and the rawInput can no longer be interpreted.  The net result is that the field appears
-                // with no input.
-                //
-                // The fix is therefore (I think) simply to clear any rawInput, so that the select2Choice
-                // renders its state from its model.
-                //
-                // see: FormComponent#getInputAsArray()
-                // see: Select2Choice#renderInitializationScript()
-                //
-                select2.clearInput();
-            }
+        if(!isEditable()) {
+            WktComponents.permanentlyHide(entityLink, ID_AUTO_COMPLETE);
+            return;
+        }
 
-            if(fieldFrame != null) {
-                WktComponents.permanentlyHide(fieldFrame, ID_ENTITY_TITLE_IF_NULL);
-            }
+        if(fieldFrame != null) {
+            WktComponents.permanentlyHide(fieldFrame, ID_ENTITY_TITLE_IF_NULL);
+        }
+        WktComponents.permanentlyHide(entityLink, ID_ENTITY_TITLE_IF_NULL);
 
-            // syncUsability
-            if(select2 != null) {
-                final boolean mutability = entityLink.isEnableAllowed() && !getModel().isViewMode();
-                select2.setEnabled(mutability);
-            }
+        if(select2 == null) {
+            throw new IllegalStateException("select2 should be created already");
+        }
 
-            WktComponents.permanentlyHide(entityLink, ID_ENTITY_TITLE_IF_NULL);
-        } else {
-            // this is horrid; adds a label to the id
-            // should instead be a 'temporary hide'
-            WktComponents.permanentlyHide(entityLink, ID_AUTO_COMPLETE);
-            // setSelect2(null); // this forces recreation next time around
+        // set mutability
+        select2.setEnabled(entityLink.isEnableAllowed()
+                && !getModel().isViewMode());
+
+        /* XXX not sure if required any more
+        if(hasAnyChoices()) {
+
+            // the select2Choice already exists, so the widget has been rendered before.  If it is
+            // being re-rendered now, it may be because some other property/parameter was invalid.
+            // when the form was submitted, the selected object (its oid as a string) would have
+            // been saved as rawInput.  If the property/parameter had been valid, then this rawInput
+            // would be correctly converted and processed by the select2Choice's choiceProvider.  However,
+            // an invalid property/parameter means that the webpage is re-rendered in another request,
+            // and the rawInput can no longer be interpreted.  The net result is that the field appears
+            // with no input.
+            //
+            // The fix is therefore (I think) simply to clear any rawInput, so that the select2Choice
+            // renders its state from its model.
+            //
+            // see: FormComponent#getInputAsArray()
+            // see: Select2Choice#renderInitializationScript()
+            //
+            select2.clearInput();
+
+        }*/
+
+        if(!hasAnyChoices()) {
+            //TODO for editable, but no choices (eg. param as domain-object reference, with default but without choices)
+            // if the param is optional (not mandatory) and has a default, we should provide 2 choices
+            // - 1: empty choice (none)
+            // - 2: the param's default value
         }
 
     }
@@ -241,7 +246,7 @@ implements ChoiceTitleHandler {
         val scalarModel = scalarModel();
         val pendingValue = scalarModel.proposedValue().getValue();
 
-        if(isEditableWithEitherAutoCompleteOrChoices()) {
+        if(isEditable()) {
 
             // flush changes to pending model
             val adapter = select2.getConvertedInputValue();
diff --git a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java
index 7d8a4a4600..773cc989b9 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/components/widgets/select2/Select2.java
@@ -41,10 +41,8 @@ import org.apache.causeway.viewer.wicket.model.models.ScalarModelWithSingleChoic
 import org.apache.causeway.viewer.wicket.model.util.WktContext;
 import org.apache.causeway.viewer.wicket.ui.components.scalars.ScalarModelChangeDispatcher;
 import org.apache.causeway.viewer.wicket.ui.components.widgets.select2.providers.ChoiceProviderAbstract;
-import org.apache.causeway.viewer.wicket.ui.components.widgets.select2.providers.ChoiceProviderAbstractForScalarModel;
 
 import lombok.NonNull;
-import lombok.SneakyThrows;
 import lombok.val;
 
 /**
@@ -97,18 +95,19 @@ implements
     }
 
     // not sure if required any more
-    @SneakyThrows
+//    @SneakyThrows
+    @Deprecated
     public void rebuildChoiceProvider() {
-        val oldProvider = (ChoiceProviderAbstractForScalarModel)
-                select2Choice.fold(
-                        Select2ChoiceExt::getProvider,
-                        Select2MultiChoiceExt::getProvider);
-        val scalarModel = oldProvider.scalarModel();
-        val constr = oldProvider.getClass().getConstructor(ScalarModel.class);
-        val newProvider = constr.newInstance(scalarModel);
-        select2Choice.accept(
-                single->single.setProvider(newProvider),
-                multi->multi.setProvider(newProvider));
+//        val oldProvider = (ChoiceProviderAbstractForScalarModel)
+//                select2Choice.fold(
+//                        Select2ChoiceExt::getProvider,
+//                        Select2MultiChoiceExt::getProvider);
+//        val scalarModel = oldProvider.scalarModel();
+//        val constr = oldProvider.getClass().getConstructor(ScalarModel.class);
+//        val newProvider = constr.newInstance(scalarModel);
+//        select2Choice.accept(
+//                single->single.setProvider(newProvider),
+//                multi->multi.setProvider(newProvider));
     }
 
     public AbstractSelect2Choice<ObjectMemento, ?> asComponent() {