You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2019/05/02 07:21:05 UTC

[isis] 01/02: ISIS-2001: adds 'title' attribute if disabled

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

danhaywood pushed a commit to branch ISIS-2001
in repository https://gitbox.apache.org/repos/asf/isis.git

commit f154378adc9a28cf830bc684e8b282ac45031ecd
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu May 2 06:15:17 2019 +0100

    ISIS-2001: adds 'title' attribute if disabled
    
    for parameters.
    
    Also adds support for Blob panel (as well as text previously; still
    need to check others).
    
    However, exception if hit 'cancel' on a blob panel
---
 .../isis/core/metamodel/facetapi/FacetUtil.java    |  2 +-
 .../facets/members/disabled/DisabledFacet.java     |  5 ++
 .../disabled/DisabledFacetAbstractImpl.java        |  2 +-
 .../actionprompt/ActionPromptModalWindow.java      |  1 -
 .../actionpromptsb/ActionPromptSidebar.java        | 10 ++-
 .../components/actions/ActionParametersForm.java   |  2 +-
 .../components/scalars/ScalarPanelAbstract2.java   | 42 ++++++++--
 .../scalars/ScalarPanelSelect2Abstract.java        | 19 ++++-
 .../scalars/ScalarPanelTextFieldAbstract.java      | 15 ++++
 .../isisapplib/IsisBlobOrClobPanelAbstract.java    | 95 ++++++++++++++++++----
 .../components/scalars/primitive/BooleanPanel.java | 10 +++
 .../scalars/reference/ReferencePanel.java          | 19 ++++-
 .../valuechoices/ValueChoicesSelect2Panel.java     | 22 ++++-
 .../wicket/ui/panels/PromptFormAbstract.java       |  1 +
 14 files changed, 210 insertions(+), 35 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
index 0c8b6d3..267aceb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
@@ -165,7 +165,7 @@ public final class FacetUtil {
     }
 
     public static void copyFacets(final FacetHolder source, final FacetHolder target) {
-        final Class<? extends Facet>[] facetTypes = source.getFacetTypes();
+        final ArrayList<Class<? extends Facet>> facetTypes = Lists.newArrayList(source.getFacetTypes());
         for (Class<? extends Facet> facetType : facetTypes) {
             final Facet facet = source.getFacet(facetType);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java
index d1f3988..cd1edbe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacet.java
@@ -35,6 +35,11 @@ import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
 public interface DisabledFacet extends WhenAndWhereValueFacet, DisablingInteractionAdvisor {
 
     /**
+     * "Special" phrase returned for facets which are always disabled.
+     */
+    String ALWAYS_DISABLED_REASON = "Always disabled";
+
+    /**
      * The reason why the (feature of the) target object is currently disabled,
      * or <tt>null</tt> if enabled.
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java
index fdf7349..14d1300 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/DisabledFacetAbstractImpl.java
@@ -53,7 +53,7 @@ public abstract class DisabledFacetAbstractImpl extends DisabledFacetAbstract {
     @Override
     public String disabledReason(final ObjectAdapter targetAdapter) {
         if (when() == When.ALWAYS) {
-            return disabledReasonElse("Always disabled");
+            return disabledReasonElse(ALWAYS_DISABLED_REASON);
         } else if (when() == When.NEVER) {
             return null;
         }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptModalWindow.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptModalWindow.java
index b3880c9..f228e44 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptModalWindow.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptModalWindow.java
@@ -16,7 +16,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.actionprompt;
 
-import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.markup.head.IHeaderResponse;
 import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionpromptsb/ActionPromptSidebar.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionpromptsb/ActionPromptSidebar.java
index 289ad64..5c13972 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionpromptsb/ActionPromptSidebar.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionpromptsb/ActionPromptSidebar.java
@@ -97,7 +97,15 @@ public class ActionPromptSidebar
 
         setVisible(false);
 
-        addOrReplace(new WebMarkupContainer(getContentId()));
+        // we no longer remove the panel, because hitting 'Esc' seems to cause the
+        // cancelButton callback to be fired twice, resulting in a stack trace:
+        //
+        // org.apache.wicket.core.request.handler.ComponentNotFoundException: Component
+        // 'theme:actionPromptSidebar:actionPrompt:parameters:inputForm:cancelButton' has been removed from page.)
+
+        // addOrReplace(new WebMarkupContainer(getContentId()));
+
+
         addOrReplace(new WebMarkupContainer(getExtraContentId()));
 
         if (target != null) {
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
index f3f1d85..586abdc 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
@@ -171,7 +171,7 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> {
             for (int paramNumToUpdate = paramNumberUpdated + 1; paramNumToUpdate < numParams; paramNumToUpdate++) {
                 final ScalarPanelAbstract2 paramPanel = paramPanels.get(paramNumToUpdate);
                 final ScalarPanelAbstract2.Repaint repaint = paramPanel
-                        .updateIfNecessary(actionModel, paramNumberUpdated, paramNumToUpdate);
+                        .updateIfNecessary(actionModel, paramNumberUpdated, paramNumToUpdate, target);
 
                 switch (repaint) {
                 case ENTIRE_FORM:
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index 1b67a7b..7c86750 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -51,6 +51,7 @@ 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.members.disabled.DisabledFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -125,12 +126,15 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
      * @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 &gt; 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 int paramNumToPossiblyUpdate,
+            final AjaxRequestTarget target) {
 
         final ObjectAction action = actionModel.getActionMemento().getAction(getSpecificationLoader());
         final ObjectAdapter[] pendingArguments = actionModel.getArgumentsAsArray();
@@ -154,8 +158,11 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
 
         final boolean usabilityBefore = isEnabled();
         final boolean usabilityAfter = usabilityConsent.isAllowed();
-        setEnabled(usabilityAfter);
-
+        if(usabilityAfter) {
+            onEnabled(target);
+        } else {
+            onDisabled(usabilityConsent.getReason(), target);
+        }
 
 
         // even if now invisible or unusable, we recalculate args and ensure compatible
@@ -291,16 +298,21 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
 
         final ScalarModel scalarModel = getModel();
 
-        if (scalarModel.isViewMode()) {
-            onInitializeWhenViewMode();
-        } else {
-            final String disableReasonIfAny = scalarModel.whetherDisabled();
-            if (disableReasonIfAny != null) {
+        final String disableReasonIfAny = scalarModel.whetherDisabled();
+        if (disableReasonIfAny != null) {
+            if(disableReasonIfAny.contains(DisabledFacet.ALWAYS_DISABLED_REASON)) {
+                onInitializeWhenViewMode();
+            } else {
                 onInitializeWhenDisabled(disableReasonIfAny);
+            }
+        } else {
+            if (scalarModel.isViewMode()) {
+                onInitializeWhenViewMode();
             } else {
                 onInitializeWhenEnabled();
             }
         }
+
     }
 
     /**
@@ -465,6 +477,20 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
     protected void onInitializeWhenEnabled() {
     }
 
+    /**
+     * Optional hook.
+     */
+    protected void onDisabled(final String disableReason, final AjaxRequestTarget target) {
+    }
+
+    /**
+     * Optional hook.
+     * @param target
+     */
+    protected void onEnabled(final AjaxRequestTarget target) {
+    }
+
+
 
     private void addCssFromMetaModel() {
         final String cssForMetaModel = getModel().getCssClass();
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
index eec4336..0f513c5 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
@@ -158,6 +158,18 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
 
     }
 
+    @Override
+    protected void onDisabled(final String disableReason, final AjaxRequestTarget target) {
+        setEnabled(false);
+    }
+
+    @Override
+    protected void onEnabled(final AjaxRequestTarget target) {
+        setEnabled(true);
+
+    }
+
+
     // //////////////////////////////////////
 
     /**
@@ -168,12 +180,15 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
      */
     @Override
     public Repaint updateIfNecessary(
-            final ActionModel actionModel, final int paramNumUpdated, final int paramNumToPossiblyUpdate) {
+            final ActionModel actionModel,
+            final int paramNumUpdated,
+            final int paramNumToPossiblyUpdate,
+            final AjaxRequestTarget target) {
 
         final ObjectAdapter[] argumentsAsArray = actionModel.getArgumentsAsArray();
 
         final Repaint repaint =
-                super.updateIfNecessary(actionModel, paramNumUpdated, paramNumToPossiblyUpdate);
+                super.updateIfNecessary(actionModel, paramNumUpdated, paramNumToPossiblyUpdate, target);
 
         final boolean choicesUpdated = updateChoices(argumentsAsArray);
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 31361c9..a16a2c2 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -24,6 +24,7 @@ import java.io.Serializable;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.basic.Label;
@@ -337,6 +338,20 @@ public abstract class ScalarPanelTextFieldAbstract<T extends Serializable> exten
         inlinePromptLink.add(title);
     }
 
+    @Override
+    protected void onDisabled(final String disableReason, final AjaxRequestTarget target) {
+        textField.setEnabled(false);
+        inlinePromptLink.setEnabled(false);
+        setTitleAttribute(disableReason);
+    }
+
+    @Override
+    protected void onEnabled(final AjaxRequestTarget target) {
+        textField.setEnabled(true);
+        inlinePromptLink.setEnabled(true);
+        setTitleAttribute("");
+    }
+
 
 
     // //////////////////////////////////////
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
index fc8d527..d61dc50 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.java
@@ -81,8 +81,11 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
     private Label fileNameLabel;
 
     protected enum InputFieldVisibility {
-            VISIBLE, NOT_VISIBLE
-        }
+        VISIBLE, NOT_VISIBLE
+    }
+    protected enum InputFieldEditability{
+        EDITABLE, NOT_EDITABLE
+    }
 
     @Override
     protected FormGroup createComponentForRegular() {
@@ -191,15 +194,15 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
     // //////////////////////////////////////
 
     protected void onInitializeWhenViewMode() {
-        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE);
+        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE, null, null, null);
     }
 
     protected void onInitializeWhenDisabled(final String disableReason) {
-        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE);
+        updateRegularFormComponents(InputFieldVisibility.NOT_VISIBLE, null, null, null);
     }
 
     protected void onInitializeWhenEnabled() {
-        updateRegularFormComponents(InputFieldVisibility.VISIBLE);
+        updateRegularFormComponents(InputFieldVisibility.VISIBLE, null, null, null);
     }
 
     private FileUploadField createFileUploadField(String componentId) {
@@ -233,6 +236,16 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         return fileUploadField;
     }
 
+    @Override
+    protected void onDisabled(final String disableReason, final AjaxRequestTarget target) {
+        updateRegularFormComponents(null, InputFieldEditability.NOT_EDITABLE, disableReason, target);
+    }
+
+    @Override
+    protected void onEnabled(final AjaxRequestTarget target) {
+        updateRegularFormComponents(null, InputFieldEditability.EDITABLE, null, target);
+    }
+
     protected abstract T getBlobOrClobFrom(final List<FileUpload> fileUploads);
 
     @SuppressWarnings("unchecked")
@@ -245,25 +258,61 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         super(id, scalarModel);
     }
 
-    private void updateRegularFormComponents(final InputFieldVisibility visibility) {
+    private void updateRegularFormComponents(
+            final InputFieldVisibility visibility,
+            final InputFieldEditability editability,
+            final String disabledReason,
+            final AjaxRequestTarget target) {
+
         MarkupContainer formComponent = (MarkupContainer) getComponentForRegular();
-        formComponent.get(ID_SCALAR_VALUE).setVisible(visibility == InputFieldVisibility.VISIBLE);
-        
-        addAcceptFilterTo(formComponent.get(ID_SCALAR_VALUE));
+        sync(formComponent, visibility, editability, disabledReason, target);
+
+        final Component component = formComponent.get(ID_SCALAR_VALUE);
+        sync(component, visibility, editability, disabledReason, target);
+
+        addAcceptFilterTo(component);
         fileNameLabel = updateFileNameLabel(ID_FILE_NAME, formComponent);
 
-        updateClearLink(visibility);
+        updateClearLink(visibility, editability, target);
 
         // the visibility of download link is intentionally 'backwards';
         // if in edit mode then do NOT show
         final MarkupContainer downloadLink = updateDownloadLink(ID_SCALAR_IF_REGULAR_DOWNLOAD, formComponent);
-        if (downloadLink != null) {
-            downloadLink.setVisible(visibility == InputFieldVisibility.NOT_VISIBLE);
-        }
+        sync(downloadLink, visibility, editability, disabledReason, target);
         // ditto any image
-        if(wicketImage != null) {
-            wicketImage.setVisible(visibility == InputFieldVisibility.NOT_VISIBLE);
+        sync(wicketImage, visibility, editability, disabledReason, target);
+    }
+
+    private void sync(
+            final Component component,
+            final InputFieldVisibility visibility,
+            final InputFieldEditability editability,
+            final String disabledReason,
+            final AjaxRequestTarget target) {
+
+        if(component == null) {
+            return;
+        }
+        component.setOutputMarkupId(true); // enable ajax link
+
+        if(visibility != null) {
+            component.setVisible(visibility == InputFieldVisibility.VISIBLE);
+            if (target != null) {
+                target.add(component);
+            }
+        }
+        if(editability != null) {
+            component.setEnabled(editability == InputFieldEditability.EDITABLE);
+
+            final AttributeModifier title = new AttributeModifier("title", Model.of(disabledReason != null ? disabledReason : ""));
+            component.add(title);
+
+            if (target != null) {
+                target.add(component);
+            }
         }
+
+
     }
 
 	private String getAcceptFilter(){
@@ -301,7 +350,11 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         return fileNameLabel;
     }
 
-    private void updateClearLink(InputFieldVisibility visibility) {
+    private void updateClearLink(
+            final InputFieldVisibility visibility,
+            final InputFieldEditability editability,
+            final AjaxRequestTarget target) {
+
         final MarkupContainer formComponent = (MarkupContainer) getComponentForRegular();
         formComponent.setOutputMarkupId(true); // enable ajax link
     
@@ -321,7 +374,15 @@ public abstract class IsisBlobOrClobPanelAbstract<T extends NamedWithMimeType> e
         formComponent.addOrReplace(ajaxLink);
     
         final T blobOrClob = getBlobOrClobFromModel();
-        formComponent.get(ID_SCALAR_IF_REGULAR_CLEAR).setVisible(blobOrClob != null && visibility == InputFieldVisibility.VISIBLE);
+        final Component component = formComponent.get(ID_SCALAR_IF_REGULAR_CLEAR);
+        component.setVisible(blobOrClob != null && visibility == InputFieldVisibility.VISIBLE);
+        component.setEnabled(blobOrClob != null && editability == InputFieldEditability.EDITABLE);
+
+        if(target != null) {
+            target.add(formComponent);
+            target.add(component);
+            target.add(ajaxLink);
+        }
     }
 
     private MarkupContainer updateDownloadLink(String downloadId, MarkupContainer container) {
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
index 4e1b9ba..9b9438e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
@@ -22,6 +22,7 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
@@ -214,6 +215,15 @@ public class BooleanPanel extends ScalarPanelAbstract2 {
         checkBox.setEnabled(false);
     }
 
+    @Override
+    protected void onDisabled(final String disableReason, final AjaxRequestTarget target) {
+        checkBox.setEnabled(false);
+    }
+
+    @Override
+    protected void onEnabled(final AjaxRequestTarget target) {
+        checkBox.setEnabled(true);
+    }
 
     @Override
     public String getVariation() {
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 3b1688a..32ed670 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -226,7 +226,24 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract {
         entityLink.add(new AttributeModifier("title", Model.of(disableReason)));
     }
 
-    
+    @Override
+    protected void onDisabled(final String disableReason, final AjaxRequestTarget target) {
+        super.onDisabled(disableReason, target);
+
+        entityLink.setEnabled(false);
+        entityLink.add(new AttributeModifier("title", Model.of(disableReason)));
+    }
+
+    @Override
+    protected void onEnabled(final AjaxRequestTarget target) {
+        super.onEnabled(target);
+
+        entityLink.setEnabled(true);
+        entityLink.add(new AttributeModifier("title", Model.of("")));
+    }
+
+
+
     // //////////////////////////////////////
     // syncWithInput
     // //////////////////////////////////////
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index ec60511..6f72989 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -23,6 +23,7 @@ import com.google.common.collect.Lists;
 import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.model.IModel;
@@ -109,7 +110,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
         // Edit: read/write
         select2.setEnabled(true);
 
-        // TODO: should the title AttributeModifier installed in onBeforeWhenDisabled be removed here?
+        setTitleAttribute("");
     }
 
     @Override
@@ -123,7 +124,24 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
         getComponentForRegular().add(new AttributeModifier("title", Model.of(titleAttribute)));
     }
 
-    
+    @Override
+    protected void onDisabled(final String disableReason, final AjaxRequestTarget target) {
+        super.onDisabled(disableReason, target);
+
+        setTitleAttribute(disableReason);
+        select2.setEnabled(false);
+    }
+
+    @Override
+    protected void onEnabled(final AjaxRequestTarget target) {
+        super.onEnabled(target);
+
+        setTitleAttribute("");
+        select2.setEnabled(true);
+    }
+
+
+
     // //////////////////////////////////////
 
 
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
index b89b978..8cf8168 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -164,6 +164,7 @@ public abstract class PromptFormAbstract<T extends BookmarkableModel<ObjectAdapt
 
             @Override
             public void onSubmit(final AjaxRequestTarget target, Form<?> form) {
+                //form.setMultiPart(true);
                 closePromptIfAny(target);
 
                 onCancelSubmitted(target);