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 9136cf0 ISIS-2319: proposed fix 9136cf0 is described below commit 9136cf0a17355d70d5238cd1db2ba2c3e36e2afc Author: Andi Huber <ahu...@apache.org> AuthorDate: Mon May 4 20:01:40 2020 +0200 ISIS-2319: proposed fix moves even more responsibility from components to model --- .../wicket/model/models/ActionArgumentModel.java | 11 ++ .../viewer/wicket/model/models/ActionModel.java | 151 +++++++++++++----- .../viewer/wicket/model/models/ScalarModel.java | 7 +- .../wicket/model/models/ScalarParameterModel.java | 58 +++---- .../wicket/model/models/ScalarPropertyModel.java | 7 +- .../components/actions/ActionParametersForm.java | 44 +++--- .../components/scalars/ScalarPanelAbstract2.java | 176 ++++++++------------- .../scalars/ScalarPanelSelect2Abstract.java | 32 ++-- .../scalars/ScalarPanelTextFieldAbstract.java | 17 +- .../isisapplib/IsisBlobOrClobPanelAbstract.java | 35 ++-- .../components/scalars/primitive/BooleanPanel.java | 10 +- .../scalars/reference/ReferencePanel.java | 16 +- .../valuechoices/ValueChoicesSelect2Panel.java | 15 +- ...derForReferenceParamOrPropertyAutoComplete.java | 16 +- 14 files changed, 328 insertions(+), 267 deletions(-) diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java index 6f46c38..b769062 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java @@ -23,12 +23,16 @@ import org.apache.wicket.model.IModel; import org.apache.isis.core.metamodel.spec.ManagedObject; import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento; public interface ActionArgumentModel extends IModel<ManagedObject> { ActionParameterMemento getParameterMemento(); String getCssClass(); + + // transient storage + void setActionArgsHint(PendingParameterModel pendingArgs); // -- SHORTCUTS @@ -36,8 +40,15 @@ public interface ActionArgumentModel extends IModel<ManagedObject> { return getParameterMemento().getActionParameter(specificationLoader); } + /** param index */ default int getNumber() { return getParameterMemento().getNumber(); } + + /** param value */ + default ManagedObject getValue() { + return getObject(); + } + } diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java index 2d18f61..20cee03 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java @@ -23,6 +23,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -89,7 +90,7 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For } // -- FACTORY METHODS - + /** * @param entityModel * @param action @@ -100,11 +101,11 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For val actionModel = new ActionModel(entityModel, homePageActionMemento); return actionModel; } - + public static ActionModel createForPersistent( IsisWebAppCommonContext commonContext, PageParameters pageParameters) { - + val entityModel = newEntityModelFrom(commonContext, pageParameters); val actionMemento = newActionMementoFrom(commonContext, pageParameters); val actionModel = new ActionModel(entityModel, actionMemento); @@ -122,8 +123,8 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For ManagedObject.stringify(adapter) .ifPresent(oidStr-> - PageParameterNames.OBJECT_OID.addStringTo(pageParameters, oidStr) - ); + PageParameterNames.OBJECT_OID.addStringTo(pageParameters, oidStr) + ); val actionType = objectAction.getType(); PageParameterNames.ACTION_TYPE.addEnumTo(pageParameters, actionType); @@ -150,22 +151,22 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For if (!matcher.matches()) { return Optional.empty(); } - + try { - + val intLiteral = matcher.group(1); val oidStr = matcher.group(2); - + val parseResult = _Ints.parseInt(intLiteral, 10); if(parseResult.isPresent()) { val paramNum = parseResult.getAsInt(); return Optional.of(ParamNumAndOidString.of(paramNum, oidStr)); } - + } catch (final Exception e) { // ignore and fall through } - + return Optional.empty(); } @@ -241,22 +242,22 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For private final EntityModel entityModel; private final ActionMemento actionMemento; - + // lazy in support of serialization of this class private transient ActionArgumentCache argCache; private ActionArgumentCache argCache() { return argCache!=null ? argCache - : (argCache = new ActionArgumentCache( - entityModel, - actionMemento, - getActionMemento().getAction(getSpecificationLoader()))); + : (argCache = new ActionArgumentCache( + entityModel, + actionMemento, + getActionMemento().getAction(getSpecificationLoader()))); } - + private static ActionMemento newActionMementoFrom( IsisWebAppCommonContext commonContext, PageParameters pageParameters) { - + final ObjectSpecId owningSpec = ObjectSpecId.of(PageParameterNames.ACTION_OWNING_SPEC.getStringFrom(pageParameters)); final ActionType actionType = PageParameterNames.ACTION_TYPE.getEnumFrom(pageParameters, ActionType.class); final String actionNameParms = PageParameterNames.ACTION_ID.getStringFrom(pageParameters); @@ -267,7 +268,7 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For private static EntityModel newEntityModelFrom( IsisWebAppCommonContext commonContext, PageParameters pageParameters) { - + val rootOid = oidFor(pageParameters); val memento = commonContext.mementoFor(rootOid); return EntityModel.ofMemento(commonContext, memento); @@ -301,7 +302,7 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For } private void setArgumentsIfPossible(final PageParameters pageParameters) { - + final List<String> args = PageParameterNames.ACTION_ARGS.getListFrom(pageParameters); val action = actionMemento.getAction(getSpecificationLoader()); @@ -494,12 +495,12 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For * @see {@link PendingParameterModelHead#defaults()} */ public void clearArguments() { - + val defaultsFixedPoint = getAction() .newPendingParameterModelHead(getTargetAdapter()) .defaults() .getParamValues(); - + argCache().resetTo(defaultsFixedPoint); } @@ -658,9 +659,10 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For public void clearParameterValue(ObjectActionParameter actionParameter) { setParameterValue(actionParameter, null); } - + @Value(staticConstructor = "of") public static class ActionArgumentModelAndConsents { + final PendingParameterModel pendingArgs; final ActionArgumentModel actionArgumentModel; final Consent visibilityConsent; final Consent usabilityConsent; @@ -670,30 +672,101 @@ public class ActionModel extends BookmarkableModel<ManagedObject> implements For val specificationLoader = getSpecificationLoader(); val targetAdapter = this.getTargetAdapter(); - val realTargetAdapter = this.getActionMemento().getAction(specificationLoader) + val realTargetAdapter = this.getActionMemento() + .getAction(specificationLoader) .realTargetAdapter(targetAdapter); - val actionArgsHint = argCache().snapshot(); - - return argCache().streamActionArgumentModels() - .map(actionArgumentModel->{ - - // visibility - val visibilityConsent = actionArgumentModel.getActionParameter(specificationLoader) - .isVisible(realTargetAdapter, actionArgsHint, InteractionInitiatedBy.USER); - - // usability - val usabilityConsent = actionArgumentModel.getActionParameter(specificationLoader) - .isUsable(realTargetAdapter, actionArgsHint, InteractionInitiatedBy.USER); + val pendingArgs = getArgumentsAsParamModel(); + val pendingArgValues = pendingArgs.getParamValues(); + + return argCache() + .streamActionArgumentModels() + .map(actionArgumentModel->{ + + actionArgumentModel.setActionArgsHint(pendingArgs); + + val objectActionParamter = actionArgumentModel.getActionParameter(specificationLoader); + + // visibility + val visibilityConsent = objectActionParamter + .isVisible(realTargetAdapter, pendingArgValues, InteractionInitiatedBy.USER); + + // usability + val usabilityConsent = objectActionParamter + .isUsable(realTargetAdapter, pendingArgValues, InteractionInitiatedBy.USER); + + return ActionArgumentModelAndConsents.of( + pendingArgs, actionArgumentModel, visibilityConsent, usabilityConsent); + + }); + + } + + public void reassessActionArgumentModels(int skipCount) { + + val specificationLoader = getSpecificationLoader(); + val pendingArgs = getArgumentsAsParamModel(); + + argCache() + .streamActionArgumentModels() + .skip(skipCount) + .forEach(actionArgumentModel->{ + + val actionParameter = actionArgumentModel.getActionParameter(specificationLoader); + val paramValue = actionArgumentModel.getValue(); + val hasChoices = actionParameter.hasChoices(); + val hasAutoComplete = actionParameter.hasAutoComplete(); + val isEmpty = ManagedObject.isNullOrUnspecifiedOrEmpty(paramValue); + // if we have choices or autoSelect, don't override any param value, already chosen by the user + val vetoDefaultsToBeSet = !isEmpty + && (hasChoices||hasAutoComplete); - return ActionArgumentModelAndConsents.of( - actionArgumentModel, visibilityConsent, usabilityConsent); + if(!vetoDefaultsToBeSet) { + val paramDefaultValue = actionParameter.getDefault(pendingArgs); + if (ManagedObject.isNullOrUnspecifiedOrEmpty(paramDefaultValue)) { + clearParameterValue(actionParameter); + } else { + setParameterValue(actionParameter, paramDefaultValue); + } + return; + } + boolean shouldBlankout = false; + + if(!isEmpty) { + if(hasChoices) { + // make sure the object is one of the choices, else blank it out. + + val choices = actionParameter + .getChoices(pendingArgs, InteractionInitiatedBy.USER); + + shouldBlankout = + ! isPartOfChoicesConsideringDependentArgs(paramValue, choices); + + } else if(hasAutoComplete) { + + //XXX poor man's implementation: don't blank-out, even though could fail validation later + shouldBlankout = false; + } + } + + if(shouldBlankout) { + clearParameterValue(actionParameter); + } + }); - } - + private boolean isPartOfChoicesConsideringDependentArgs( + ManagedObject paramValue, + Can<ManagedObject> choices) { + + val pendingValue = paramValue.getPojo(); + + return choices + .stream() + .anyMatch(choice->Objects.equals(pendingValue, choice.getPojo())); + } } diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java index b73e622..3c03448 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java @@ -41,6 +41,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.core.webapp.context.memento.ObjectMemento; import org.apache.isis.viewer.wicket.model.links.LinkAndLabel; import org.apache.isis.viewer.wicket.model.links.LinksProvider; @@ -276,10 +277,10 @@ implements LinksProvider, FormExecutorContext { public abstract String getFileAccept(); public abstract boolean hasChoices(); - public abstract Can<ManagedObject> getChoices(Can<ManagedObject> pendingArgs); + public abstract Can<ManagedObject> getChoices(PendingParameterModel pendingArgs); public abstract boolean hasAutoComplete(); - public abstract Can<ManagedObject> getAutoComplete(Can<ManagedObject> pendingArg, String searchTerm); + public abstract Can<ManagedObject> getAutoComplete(PendingParameterModel pendingArgs, String searchTerm); /** * for {@link BigDecimal}s only. @@ -506,7 +507,7 @@ implements LinksProvider, FormExecutorContext { public abstract int getAutoCompleteOrChoicesMinLength(); - public abstract ManagedObject getDefault(Can<ManagedObject> pendingArgs); + public abstract ManagedObject getDefault(PendingParameterModel pendingArgs); public int getAutoCompleteMinLength() { return getAutoCompleteOrChoicesMinLength(); diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java index d3c9402..45486c7 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java @@ -20,7 +20,6 @@ package org.apache.isis.viewer.wicket.model.models; import java.util.Collections; import java.util.List; -import java.util.function.BiFunction; import org.apache.isis.applib.annotation.Where; import org.apache.isis.core.commons.collections.Can; @@ -37,6 +36,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter; import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModelHead; import org.apache.isis.core.webapp.context.memento.ObjectMemento; import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento; @@ -57,7 +57,7 @@ implements ActionArgumentModel { * @implNote transient because only temporary hint. */ @Getter @Setter - private transient Can<ManagedObject> actionArgsHint; + private transient PendingParameterModel actionArgsHint; /** * Creates a model representing an action parameter of an action of a parent @@ -118,7 +118,6 @@ implements ActionArgumentModel { final ObjectActionParameter parameter = getParameterMemento().getActionParameter( getSpecificationLoader()); try { - //XXX lombok issue, no val ManagedObject parentAdapter = getParentEntityModel().load(); final String invalidReasonIfAny = parameter.isValid(parentAdapter, proposedPojoAsStr, InteractionInitiatedBy.USER @@ -134,7 +133,6 @@ implements ActionArgumentModel { final ObjectActionParameter parameter = getParameterMemento().getActionParameter( getSpecificationLoader()); try { - //XXX lombok issue, no val ManagedObject parentAdapter = getParentEntityModel().load(); final String invalidReasonIfAny = parameter.isValid(parentAdapter, proposedAdapter.getPojo(), InteractionInitiatedBy.USER @@ -161,11 +159,9 @@ implements ActionArgumentModel { @Override public ManagedObject getDefault( - @NonNull final Can<ManagedObject> pendingArgs) { + @NonNull final PendingParameterModel pendingArgs) { - return withPendingParamsDo(pendingArgs, (pendingParamsModel, actionParameter)-> - actionParameter.getDefault( - pendingParamsModel)); + return getParameter().getDefault(pendingArgs); } @Override @@ -176,13 +172,8 @@ implements ActionArgumentModel { } @Override public Can<ManagedObject> getChoices( - @NonNull final Can<ManagedObject> pendingArgs) { - - return withPendingParamsDo(pendingArgs, (pendingParamsModel, actionParameter)-> - actionParameter.getChoices( - pendingParamsModel, - InteractionInitiatedBy.USER)); - + @NonNull final PendingParameterModel pendingArgs) { + return getParameter().getChoices(pendingArgs, InteractionInitiatedBy.USER); } @Override @@ -193,17 +184,11 @@ implements ActionArgumentModel { } @Override public Can<ManagedObject> getAutoComplete( - @NonNull final Can<ManagedObject> pendingArgs, + @NonNull final PendingParameterModel pendingArgs, final String searchArg) { - return withPendingParamsDo(pendingArgs, (pendingParamsModel, actionParameter)-> - actionParameter.getAutoComplete( - pendingParamsModel, - searchArg, - InteractionInitiatedBy.USER)); + return getParameter().getAutoComplete(pendingArgs, searchArg, InteractionInitiatedBy.USER); } - - @Override public int getAutoCompleteOrChoicesMinLength() { @@ -298,21 +283,24 @@ implements ActionArgumentModel { public String toStringOf() { return getName() + ": " + getParameterMemento().toString(); } - - // pending args helper - private <T> T withPendingParamsDo( - @NonNull final Can<ManagedObject> pendingArgs, - final BiFunction<PendingParameterModel, ObjectActionParameter, T> function) { - val parameterMemento = getParameterMemento(); - val actionParameter = parameterMemento.getActionParameter(getSpecificationLoader()); - val actionOwner = getParentEntityModel().load(); - val pendingParamsModel = actionParameter.getAction().newPendingParameterModelHead(actionOwner) - .model(pendingArgs); - return function.apply(pendingParamsModel, actionParameter); - } @Override protected List<ObjectAction> calcAssociatedActions() { return Collections.emptyList(); } + + public ObjectActionParameter getParameter() { + val parameterMemento = getParameterMemento(); + val actionParameter = parameterMemento.getActionParameter(getSpecificationLoader()); + return actionParameter; + } + + public PendingParameterModelHead getPendingParamHead() { + val actionParameter = getParameter(); + val actionOwner = getParentEntityModel().load(); + return actionParameter.getAction().newPendingParameterModelHead(actionOwner); + } + + + } diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java index 3e4f4b6..cc42369 100644 --- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java +++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java @@ -37,6 +37,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.core.webapp.context.memento.ObjectMemento; import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento; @@ -173,7 +174,7 @@ public class ScalarPropertyModel extends ScalarModel { @Override public ManagedObject getDefault( - final Can<ManagedObject> pendingArgs /*not used*/) { + final PendingParameterModel pendingArgs /*not used*/) { final PropertyMemento propertyMemento = getPropertyMemento(); final OneToOneAssociation property = propertyMemento @@ -191,7 +192,7 @@ public class ScalarPropertyModel extends ScalarModel { @Override public Can<ManagedObject> getChoices( - final Can<ManagedObject> pendingArgs /*not used*/) { + final PendingParameterModel pendingArgs /*not used on properties*/) { final PropertyMemento propertyMemento = getPropertyMemento(); final OneToOneAssociation property = propertyMemento @@ -213,7 +214,7 @@ public class ScalarPropertyModel extends ScalarModel { @Override public Can<ManagedObject> getAutoComplete( - final Can<ManagedObject> pendingArgs, /*not used*/ + final PendingParameterModel pendingArgs, /*not used on properties*/ final String searchArg) { final PropertyMemento propertyMemento = getPropertyMemento(); diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java index 8e375cd..c3b4fdc 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java @@ -28,6 +28,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.repeater.RepeatingView; +import org.apache.isis.core.commons.internal.base._Strings; import org.apache.isis.core.commons.internal.exceptions._Exceptions; import org.apache.isis.viewer.common.model.decorator.confirm.ConfirmUiModel; import org.apache.isis.viewer.common.model.decorator.confirm.ConfirmUiModel.Placement; @@ -35,7 +36,6 @@ import org.apache.isis.viewer.wicket.model.hints.IsisActionCompletedEvent; import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings; import org.apache.isis.viewer.wicket.model.models.ActionArgumentModel; import org.apache.isis.viewer.wicket.model.models.ActionModel; -import org.apache.isis.viewer.wicket.model.models.ScalarParameterModel; import org.apache.isis.viewer.wicket.ui.ComponentType; import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2; import org.apache.isis.viewer.wicket.ui.panels.FormExecutorStrategy; @@ -76,8 +76,6 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> { .forEach(argsAndConsents->{ val actionArgumentModel = argsAndConsents.getActionArgumentModel(); - val visibilityConsent = argsAndConsents.getVisibilityConsent(); - val usabilityConsent = argsAndConsents.getUsabilityConsent(); val container = new WebMarkupContainer(repeatingView.newChildId()); repeatingView.add(container); @@ -85,8 +83,8 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> { newParamPanel(container, actionArgumentModel) .ifPresent(paramPanel->{ paramPanels.add(paramPanel); - paramPanel.setVisible(visibilityConsent.isAllowed()); - //paramPanel.onInitializeReadonly(usabilityConsent.getReason()); + //val paramModel = (ScalarParameterModel) paramPanel.getModel(); + paramPanel.postInit(argsAndConsents); }); }); @@ -106,7 +104,9 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> { if(component instanceof MarkupContainer) { val markupContainer = (MarkupContainer) component; val css = actionArgumentModel.getCssClass(); - CssClassAppender.appendCssClassTo(markupContainer, CssClassAppender.asCssStyle(css)); + if (!_Strings.isNullOrEmpty(css)) { + CssClassAppender.appendCssClassTo(markupContainer, CssClassAppender.asCssStyle(css)); + } } val paramPanel = @@ -150,26 +150,22 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> { @Override public void onUpdate(final AjaxRequestTarget target, final ScalarPanelAbstract2 scalarPanelUpdated) { - final ActionModel actionModel = getActionModel(); - - val paramModel = (ScalarParameterModel)scalarPanelUpdated.getModel(); + val actionModel = getActionModel(); + val paramModel = (ActionArgumentModel)scalarPanelUpdated.getModel(); + final int paramNumberUpdated = paramModel.getNumber(); + // only updates subsequent parameter panels starting from (paramNumberUpdated + 1) + final int skipCount = paramNumberUpdated + 1; - final int paramNumberUpdated = paramModel.getParameterMemento().getNumber(); + actionModel.reassessActionArgumentModels(skipCount); - val action = actionModel.getAction(); - - final int numParams = action.getParameterCount(); - - // only updates subsequent parameter panels starting from [paramNumberUpdated + 1] - for (int i = paramNumberUpdated + 1; i < numParams; i++) { - - val paramNumToUpdate = i; + actionModel.streamActionArgumentModels() + .skip(skipCount) + .forEach(argAndConsents->{ + + val paramNumToUpdate = argAndConsents.getActionArgumentModel().getNumber(); val paramPanel = paramPanels.get(paramNumToUpdate); - val repaint = paramPanel - .updateIfNecessary(actionModel, paramNumberUpdated, paramNumToUpdate, target); + val repaint = paramPanel.updateIfNecessary(argAndConsents, Optional.of(target)); - //final boolean multiPart = isMultiPart(); // side-effects(?) or remove - switch (repaint) { case ENTIRE_FORM: target.add(this); @@ -182,7 +178,9 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> { default: throw _Exceptions.unmatchedCase(repaint); } - } + + }); + // previously this method was also doing: // target.add(this); diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java index 3473d3c..560a653 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java @@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.ui.components.scalars; import java.util.List; import java.util.Objects; +import java.util.Optional; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; @@ -41,21 +42,16 @@ import org.apache.isis.applib.annotation.ActionLayout; import org.apache.isis.applib.annotation.PromptStyle; import org.apache.isis.applib.services.metamodel.BeanSort; import org.apache.isis.applib.services.metamodel.MetaModelService; -import org.apache.isis.core.commons.collections.Can; import org.apache.isis.core.commons.internal.base._Strings; import org.apache.isis.core.commons.internal.collections._Lists; -import org.apache.isis.core.metamodel.consent.Consent; -import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy; import org.apache.isis.core.metamodel.facets.all.named.NamedFacet; import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet; import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet; import org.apache.isis.core.metamodel.spec.ManagedObject; import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.ObjectAction; -import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter; -import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.viewer.wicket.model.links.LinkAndLabel; -import org.apache.isis.viewer.wicket.model.models.ActionModel; +import org.apache.isis.viewer.wicket.model.models.ActionModel.ActionArgumentModelAndConsents; import org.apache.isis.viewer.wicket.model.models.ActionPrompt; import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider; import org.apache.isis.viewer.wicket.model.models.EntityModel; @@ -77,6 +73,7 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract; import org.apache.isis.viewer.wicket.ui.util.Components; import org.apache.isis.viewer.wicket.ui.util.CssClassAppender; +import lombok.NonNull; import lombok.val; import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel; @@ -120,92 +117,67 @@ implements ScalarModelSubscriber2 { NOTHING } + /** this is a hack for the ScalarParameterModel, which does not support usability constraints in the model*/ + private Runnable postInit; + public void postInit(@NonNull final ActionArgumentModelAndConsents argsAndConsents) { + this.postInit = () ->{ + // visibility + val visibilityConsent = argsAndConsents.getVisibilityConsent(); + setVisible(visibilityConsent.isAllowed()); + + // usability + val usabilityConsent = argsAndConsents.getUsabilityConsent(); + if(usabilityConsent.isAllowed()) { + onInitializeEditable(); + } else { + onInitializeReadonly(usabilityConsent.getReason()); + } + }; + } + /** * * @param actionModel - the action being invoked - * @param paramNumUpdated - the # of the param that has just been updated by the user - * @param paramNumToPossiblyUpdate - the # of the param to be updated if necessary (will be > paramNumUpdated) * * @param target - in case there's more to be repainted... * * @return - true if changed as a result of these pending arguments. */ public Repaint updateIfNecessary( - final ActionModel actionModel, - final int paramNumUpdated, - final int paramNumToPossiblyUpdate, - final AjaxRequestTarget target) { - - final ObjectAction action = actionModel.getAction(); - final PendingParameterModel pendingArguments = actionModel.getArgumentsAsParamModel(); - final Can<ManagedObject> pendingArgumentsReadonly = pendingArguments.getParamValues(); + @NonNull final ActionArgumentModelAndConsents argsAndConsents, + @NonNull final Optional<AjaxRequestTarget> target) { + val argModel = argsAndConsents.getActionArgumentModel(); - // could almost certainly simplify this... (used by visibility and usability checks) - final ObjectActionParameter actionParameter = action.getParameters().getElseFail(paramNumToPossiblyUpdate); - val targetAdapter = actionModel.getTargetAdapter(); - val realTargetAdapter = action.realTargetAdapter(targetAdapter); - - // check visibility - final Consent visibilityConsent = actionParameter - .isVisible(realTargetAdapter, pendingArgumentsReadonly, InteractionInitiatedBy.USER); - - final boolean visibilityBefore = isVisible(); - final boolean visibilityAfter = visibilityConsent.isAllowed(); + // visibility + val visibilityConsent = argsAndConsents.getVisibilityConsent(); + val visibilityBefore = isVisible(); + val visibilityAfter = visibilityConsent.isAllowed(); setVisible(visibilityAfter); - - // check usability - final Consent usabilityConsent = actionParameter - .isUsable(realTargetAdapter, pendingArgumentsReadonly, InteractionInitiatedBy.USER); - - final boolean usabilityBefore = isEnabled(); - final boolean usabilityAfter = usabilityConsent.isAllowed(); + // usability + val usabilityConsent = argsAndConsents.getUsabilityConsent(); + val usabilityBefore = isEnabled(); + val usabilityAfter = usabilityConsent.isAllowed(); if(usabilityAfter) { - onEnabled(target); + onEditable(target); } else { onNotEditable(usabilityConsent.getReason(), target); } - // even if now invisible or unusable, we recalculate args and ensure compatible - // (else can hit complicated edge cases with stale data when next re-enable/make visible) - final ScalarModel model = getModel(); - val defaultIfAny = model.getDefault(pendingArgumentsReadonly); - - val pendingArg = pendingArgumentsReadonly.getElseFail(paramNumToPossiblyUpdate); + val paramValue = argModel.getValue(); + val valueChanged = !Objects.equals(scalarModel.getObject(), paramValue); - if (defaultIfAny != null) { - scalarModel.setObject(defaultIfAny); - scalarModel.setPendingAdapter(defaultIfAny); - actionModel.setParameterValue(actionParameter, defaultIfAny); - - } else { - - boolean shouldBlankout = false; - - if(ManagedObject.isNullOrUnspecifiedOrEmpty(pendingArg)) { - if(scalarModel.hasChoices()) { - // make sure the object is one of the choices, else blank it out. - val choices = scalarModel - .getChoices(pendingArgumentsReadonly); - - shouldBlankout = - ! isPartOfChoicesConsideringDependentArgs(scalarModel, pendingArg, choices); - - } else if(scalarModel.hasAutoComplete()) { - - // poor man's implementation: blank-out in any case - shouldBlankout = true; - } - } - - if(shouldBlankout) { + if(valueChanged) { + if(ManagedObject.isNullOrUnspecifiedOrEmpty(paramValue)) { scalarModel.setObject(null); scalarModel.setPending(null); - actionModel.clearParameterValue(actionParameter); - } - + } else { + scalarModel.setObject(paramValue); + scalarModel.setPendingAdapter(paramValue); + } } + // repaint the entire form if visibility has changed if (!visibilityBefore || !visibilityAfter) { @@ -218,24 +190,11 @@ implements ScalarModelSubscriber2 { } // also repaint the param if its pending arg has changed. - return scalarModel.getObject() != pendingArg + return valueChanged ? Repaint.PARAM_ONLY : Repaint.NOTHING; } - // blank out the parameter n based on dependent params 0 .. n-1 - private boolean isPartOfChoicesConsideringDependentArgs( - ScalarModel scalarModel, - ManagedObject pendingArg, - Can<ManagedObject> choices) { - - val pendingValue = pendingArg.getPojo(); - - return choices - .stream() - .anyMatch(choice->Objects.equals(pendingValue, choice.getPojo())); - } - public static class InlinePromptConfig { private final boolean supported; private final Component componentToHideIfAny; @@ -308,19 +267,26 @@ implements ScalarModelSubscriber2 { final ScalarModel scalarModel = getModel(); - final String disableReasonIfAny = scalarModel.whetherDisabled(); - final boolean mustBeEditable = scalarModel.mustBeEditable(); - if (disableReasonIfAny != null) { - if(mustBeEditable) { - onInitializeNotEditable(); - } else { - onInitializeReadonly(disableReasonIfAny); - } + if(postInit!=null) { + // ScalarParameterModel hack + postInit.run(); + postInit=null; } else { - if (scalarModel.isViewMode()) { - onInitializeNotEditable(); - } else { - onInitializeEditable(); + + final String disableReasonIfAny = scalarModel.whetherDisabled(); + final boolean mustBeEditable = scalarModel.mustBeEditable(); + if (disableReasonIfAny != null) { + if(mustBeEditable) { + onInitializeNotEditable(); + } else { + onInitializeReadonly(disableReasonIfAny); + } + } else { + if (scalarModel.isViewMode()) { + onInitializeNotEditable(); + } else { + onInitializeEditable(); + } } } @@ -460,7 +426,7 @@ implements ScalarModelSubscriber2 { /** * The widget starts off read-only, and CANNOT be activated into edit mode. */ - protected void onInitializeReadonly(final String disableReason) { + protected void onInitializeReadonly(String disableReason) { } /** @@ -470,25 +436,18 @@ implements ScalarModelSubscriber2 { } /** - * The widget is no longer editable. - * @apiNote - * the semantics here aren't the same as 'onInitializeWhenDisabled' (the latter is never editable). + * The widget is no longer editable, but should be possible to activate into edit mode. */ - protected void onNotEditable(final String disableReason, final AjaxRequestTarget target) { + protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) { } /** * The widget should be made editable. * - * <p> - * TODO: perhaps rename to 'onEditable'? - * </p> */ - protected void onEnabled(final AjaxRequestTarget target) { + protected void onEditable(@NonNull final Optional<AjaxRequestTarget> target) { } - - private void addCssFromMetaModel() { final String cssForMetaModel = getModel().getCssClass(); if (!_Strings.isNullOrEmpty(cssForMetaModel)) { @@ -960,4 +919,7 @@ implements ScalarModelSubscriber2 { } + + + } diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java index ca03d4b..72ce315 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java @@ -20,6 +20,7 @@ package org.apache.isis.viewer.wicket.ui.components.scalars; import java.util.List; +import java.util.Optional; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -32,10 +33,9 @@ import org.apache.wicket.validation.IValidator; import org.apache.wicket.validation.ValidationError; import org.wicketstuff.select2.ChoiceProvider; -import org.apache.isis.core.commons.collections.Can; -import org.apache.isis.core.metamodel.spec.ManagedObject; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.core.webapp.context.memento.ObjectMemento; -import org.apache.isis.viewer.wicket.model.models.ActionModel; +import org.apache.isis.viewer.wicket.model.models.ActionModel.ActionArgumentModelAndConsents; import org.apache.isis.viewer.wicket.model.models.ScalarModel; import org.apache.isis.viewer.wicket.model.models.ScalarParameterModel; import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup; @@ -44,6 +44,7 @@ import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.Obj import org.apache.isis.viewer.wicket.ui.util.CssClassAppender; import org.apache.isis.viewer.wicket.ui.util.Tooltips; +import lombok.NonNull; import lombok.val; public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 { @@ -117,7 +118,9 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 { /** * sets up the choices, also ensuring that any currently held value is compatible. */ - private void setProviderAndCurrAndPending(Select2 select2, Can<ManagedObject> pendingArgs) { + private void setProviderAndCurrAndPending( + final Select2 select2, + final PendingParameterModel pendingArgs) { final ChoiceProvider<ObjectMemento> choiceProvider = buildChoiceProvider(pendingArgs); @@ -136,7 +139,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 { /** * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2, List<ManagedObject>)}) */ - protected abstract ChoiceProvider<ObjectMemento> buildChoiceProvider(Can<ManagedObject> pendingArgs); + protected abstract ChoiceProvider<ObjectMemento> buildChoiceProvider(PendingParameterModel pendingArgs); /** * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2, List<ManagedObject>)}) @@ -159,12 +162,12 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 { } @Override - protected void onNotEditable(final String disableReason, final AjaxRequestTarget target) { + protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) { setEnabled(false); } @Override - protected void onEnabled(final AjaxRequestTarget target) { + protected void onEditable(final Optional<AjaxRequestTarget> target) { setEnabled(true); } @@ -180,17 +183,12 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 { */ @Override public Repaint updateIfNecessary( - final ActionModel actionModel, - final int paramNumUpdated, - final int paramNumToPossiblyUpdate, - final AjaxRequestTarget target) { - - final Can<ManagedObject> arguments = actionModel.getArgumentsAsParamModel() - .getParamValues(); + @NonNull final ActionArgumentModelAndConsents argsAndConsents, + @NonNull final Optional<AjaxRequestTarget> target) { - val repaint = super.updateIfNecessary(actionModel, paramNumUpdated, paramNumToPossiblyUpdate, target); + val repaint = super.updateIfNecessary(argsAndConsents, target); - final boolean choicesUpdated = updateChoices(arguments); + final boolean choicesUpdated = updateChoices(argsAndConsents.getPendingArgs()); if (repaint == Repaint.NOTHING) { if (choicesUpdated) { @@ -203,7 +201,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 { } } - private boolean updateChoices(Can<ManagedObject> pendingArgs) { + private boolean updateChoices(final PendingParameterModel pendingArgs) { if (select2 == null) { return false; } diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java index 1dc37a3..5f21b24 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java @@ -20,6 +20,7 @@ package org.apache.isis.viewer.wicket.ui.components.scalars; import java.io.Serializable; +import java.util.Optional; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; @@ -351,21 +352,25 @@ implements TextFieldValueModel.ScalarModelProvider { } @Override - protected void onNotEditable(final String disableReason, final AjaxRequestTarget target) { + protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) { textField.setEnabled(false); inlinePromptLink.setEnabled(false); setTooltip(disableReason); - target.add(textField); - target.add(inlinePromptLink); + target.ifPresent(ajax->{ + ajax.add(textField); + ajax.add(inlinePromptLink); + }); } @Override - protected void onEnabled(final AjaxRequestTarget target) { + protected void onEditable(final Optional<AjaxRequestTarget> target) { textField.setEnabled(true); inlinePromptLink.setEnabled(true); clearTooltip(); - target.add(textField); - target.add(inlinePromptLink); + target.ifPresent(ajax->{ + ajax.add(textField); + ajax.add(inlinePromptLink); + }); } private void setTooltip(final String tooltip) { diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java index 18aafdf..358beb5 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java @@ -22,6 +22,7 @@ import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.List; +import java.util.Optional; import javax.activation.MimeType; import javax.imageio.ImageIO; @@ -236,13 +237,17 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e } @Override - protected void onNotEditable(final String disableReason, final AjaxRequestTarget target) { - updateRegularFormComponents(InputFieldVisibility.VISIBLE, InputFieldEditability.NOT_EDITABLE, disableReason, target); + protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) { + updateRegularFormComponents( + InputFieldVisibility.VISIBLE, InputFieldEditability.NOT_EDITABLE, + disableReason, target); } @Override - protected void onEnabled(final AjaxRequestTarget target) { - updateRegularFormComponents(InputFieldVisibility.VISIBLE, InputFieldEditability.EDITABLE, null, target); + protected void onEditable(final Optional<AjaxRequestTarget> target) { + updateRegularFormComponents( + InputFieldVisibility.VISIBLE, InputFieldEditability.EDITABLE, + null, target); } protected abstract T getBlobOrClobFrom(final List<FileUpload> fileUploads); @@ -261,7 +266,7 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e final InputFieldVisibility visibility, final InputFieldEditability editability, final String disabledReason, - final AjaxRequestTarget target) { + final Optional<AjaxRequestTarget> target) { MarkupContainer formComponent = (MarkupContainer) getComponentForRegular(); sync(formComponent, visibility, editability, disabledReason, target); @@ -290,7 +295,7 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e final InputFieldVisibility visibility, final InputFieldEditability editability, final String disabledReason, - final AjaxRequestTarget target) { + final Optional<AjaxRequestTarget> target) { if(component == null) { return; @@ -299,7 +304,10 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e if(visibility != null) { component.setVisible(visibility == InputFieldVisibility.VISIBLE); - Components.addToAjaxRequest(target, component); + target.ifPresent(ajax->{ + Components.addToAjaxRequest(ajax, component); + }); + } @@ -360,7 +368,7 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e private void updateClearLink( final InputFieldVisibility visibility, final InputFieldEditability editability, - final AjaxRequestTarget target) { + final Optional<AjaxRequestTarget> target) { final MarkupContainer formComponent = (MarkupContainer) getComponentForRegular(); formComponent.setOutputMarkupId(true); // enable ajax link @@ -385,11 +393,12 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e clearButton.setVisible(blobOrClob != null && visibility == InputFieldVisibility.VISIBLE); clearButton.setEnabled(blobOrClob != null); - if(target != null) { - target.add(formComponent); - target.add(clearButton); - target.add(ajaxLink); - } + target.ifPresent(ajax->{ + ajax.add(formComponent); + ajax.add(clearButton); + ajax.add(ajaxLink); + }); + } private MarkupContainer updateDownloadLink(String downloadId, MarkupContainer container) { diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java index 57cff91..9e39485 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java @@ -19,6 +19,8 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.primitive; +import java.util.Optional; + import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; @@ -228,16 +230,18 @@ public class BooleanPanel extends ScalarPanelAbstract2 { } @Override - protected void onNotEditable(final String disableReason, final AjaxRequestTarget target) { + protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) { checkBox.setEnabled(false); final AttributeModifier title = new AttributeModifier("title", Model.of(disableReason != null ? disableReason : "")); checkBox.add(title); - target.add(checkBox); + target.ifPresent(ajax->{ + ajax.add(checkBox); + }); } @Override - protected void onEnabled(final AjaxRequestTarget target) { + protected void onEditable(final Optional<AjaxRequestTarget> target) { checkBox.setEnabled(true); } diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java index 63f4de7..3104547 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java @@ -19,6 +19,8 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.reference; +import java.util.Optional; + import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; @@ -31,10 +33,9 @@ import org.apache.wicket.model.Model; import org.wicketstuff.select2.ChoiceProvider; import org.wicketstuff.select2.Settings; -import org.apache.isis.core.commons.collections.Can; import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet; -import org.apache.isis.core.metamodel.spec.ManagedObject; import org.apache.isis.core.metamodel.spec.ObjectSpecification; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.core.webapp.context.memento.ObjectMemento; import org.apache.isis.viewer.wicket.model.models.EntityModel; import org.apache.isis.viewer.wicket.model.models.EntityModelForReference; @@ -218,7 +219,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract { } @Override - protected void onNotEditable(final String disableReason, final AjaxRequestTarget target) { + protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) { super.onNotEditable(disableReason, target); entityLink.setEnabled(false); @@ -226,8 +227,8 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract { } @Override - protected void onEnabled(final AjaxRequestTarget target) { - super.onEnabled(target); + protected void onEditable(final Optional<AjaxRequestTarget> target) { + super.onEditable(target); entityLink.setEnabled(true); entityLink.add(new AttributeModifier("title", Model.of(""))); @@ -336,7 +337,8 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract { // ////////////////////////////////////// @Override - protected ChoiceProvider<ObjectMemento> buildChoiceProvider(Can<ManagedObject> pendingArgs) { + protected ChoiceProvider<ObjectMemento> buildChoiceProvider( + final PendingParameterModel pendingArgs) { val commonContext = super.getCommonContext(); @@ -347,7 +349,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract { } if(getModel().hasAutoComplete()) { - val autoCompleteMementos = pendingArgs + val autoCompleteMementos = pendingArgs.getParamValues() .map(commonContext::mementoForParameter); return new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete( getModel(), autoCompleteMementos); diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java index 0bf0e3e..0307ae0 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java @@ -18,6 +18,8 @@ */ package org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices; +import java.util.Optional; + import org.apache.wicket.Component; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -29,7 +31,7 @@ import org.wicketstuff.select2.ChoiceProvider; import org.apache.isis.core.commons.collections.Can; import org.apache.isis.core.commons.internal.base._Strings; -import org.apache.isis.core.metamodel.spec.ManagedObject; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.core.webapp.context.memento.ObjectMemento; import org.apache.isis.viewer.wicket.model.models.ScalarModel; import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelect2Abstract; @@ -71,7 +73,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract { } - private Can<ObjectMemento> getChoiceMementos(final Can<ManagedObject> pendingArgs) { + private Can<ObjectMemento> getChoiceMementos(final PendingParameterModel pendingArgs) { val commonContext = super.getCommonContext(); @@ -137,7 +139,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract { } @Override - protected void onNotEditable(final String disableReason, final AjaxRequestTarget target) { + protected void onNotEditable(final String disableReason, final Optional<AjaxRequestTarget> target) { super.onNotEditable(disableReason, target); setTitleAttribute(disableReason); @@ -145,8 +147,8 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract { } @Override - protected void onEnabled(final AjaxRequestTarget target) { - super.onEnabled(target); + protected void onEditable(final Optional<AjaxRequestTarget> target) { + super.onEditable(target); setTitleAttribute(""); select2.setEnabled(true); @@ -161,7 +163,8 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract { // in corresponding code in ReferencePanelFactory, these is a branch for different types of providers // (choice vs autoComplete). Here though - because values don't currently support autoComplete - no branch is required @Override - protected ChoiceProvider<ObjectMemento> buildChoiceProvider(Can<ManagedObject> pendingArgs) { + protected ChoiceProvider<ObjectMemento> buildChoiceProvider( + final PendingParameterModel pendingArgs) { final Can<ObjectMemento> choicesMementos = getChoiceMementos(pendingArgs); return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos); } diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java index f24d73d..f816748 100644 --- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java +++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java @@ -21,8 +21,10 @@ package org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers; import org.apache.isis.core.commons.collections.Can; import org.apache.isis.core.commons.internal.base._NullSafe; import org.apache.isis.core.metamodel.spec.ManagedObject; +import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel; import org.apache.isis.core.webapp.context.memento.ObjectMemento; import org.apache.isis.viewer.wicket.model.models.ScalarModel; +import org.apache.isis.viewer.wicket.model.models.ScalarParameterModel; import lombok.NonNull; import lombok.val; @@ -45,13 +47,15 @@ extends ObjectAdapterMementoProviderAbstract { @Override protected Can<ObjectMemento> obtainMementos(String term) { - if (getScalarModel().hasAutoComplete()) { + val parameterModel = (ScalarParameterModel)getScalarModel(); + + if (parameterModel.hasAutoComplete()) { val commonContext = super.getCommonContext(); // recover any pendingArgs - val pendingArgs = reconstructDependentArgs(dependentArgMementos); - return getScalarModel() + val pendingArgs = reconstructDependentArgs(parameterModel, dependentArgMementos); + return parameterModel .getAutoComplete(pendingArgs, term) .map(commonContext::mementoFor); @@ -61,7 +65,8 @@ extends ObjectAdapterMementoProviderAbstract { } - private Can<ManagedObject> reconstructDependentArgs( + private PendingParameterModel reconstructDependentArgs( + final ScalarParameterModel parameterModel, final Can<ObjectMemento> dependentArgMementos) { val commonContext = super.getCommonContext(); @@ -70,7 +75,8 @@ extends ObjectAdapterMementoProviderAbstract { .map(ManagedObject.class::cast) .collect(Can.toCan()); - return pendingArgsList; + return parameterModel.getPendingParamHead() + .model(pendingArgsList); } }