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() {