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 2017/06/02 14:03:46 UTC

isis git commit: ISIS-1633: adds support for INLINE_AS_IF_EDIT prompt style

Repository: isis
Updated Branches:
  refs/heads/master 07e3653ba -> 8c0f7d207


ISIS-1633: adds support for INLINE_AS_IF_EDIT prompt style


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/8c0f7d20
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/8c0f7d20
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/8c0f7d20

Branch: refs/heads/master
Commit: 8c0f7d207e49f1f44c16a98d4770d27f45455ac4
Parents: 07e3653
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jun 2 15:02:03 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jun 2 15:02:03 2017 +0100

----------------------------------------------------------------------
 .../applib/layout/component/component.xsd       |   1 +
 .../rgant/_rgant-ActionLayout_promptStyle.adoc  |   6 +-
 .../_rgant-PropertyLayout_promptStyle.adoc      |   2 +-
 .../ugvw/_ugvw_configuration-properties.adoc    |   1 +
 .../isis/applib/annotation/PromptStyle.java     |  28 ++++-
 ...omptStyleFacetForActionLayoutAnnotation.java |   1 +
 ...ptStyleFacetForPropertyLayoutAnnotation.java |   2 +
 .../metamodel/spec/feature/ObjectAction.java    |  16 ++-
 .../PromptStyleConfiguration_Test.java          |  12 +++
 .../viewer/wicket/model/links/LinkAndLabel.java |  10 ++
 .../viewer/wicket/model/models/ActionModel.java |  16 ++-
 .../model/models/EntityModelForReference.java   |   3 +-
 .../viewer/wicket/model/models/ScalarModel.java |  15 ++-
 .../components/property/PropertyEditForm.java   |   2 +-
 .../scalars/ScalarPanelAbstract2.java           | 101 +++++++++++++++----
 .../scalars/primitive/BooleanPanel.java         |   8 +-
 .../scalars/reference/ReferencePanel.java       |  11 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java |   2 +-
 .../wicket/ui/panels/PromptFormAbstract.java    |   6 +-
 19 files changed, 189 insertions(+), 54 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
index 7471bc1..a8d1edc 100644
--- a/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
+++ b/adocs/documentation/src/main/asciidoc/applib/layout/component/component.xsd
@@ -114,6 +114,7 @@
     <xs:restriction base="xs:string">
       <xs:enumeration value="DIALOG"/>
       <xs:enumeration value="INLINE"/>
+      <xs:enumeration value="INLINE_AS_IF_EDIT"/>
       <xs:enumeration value="AS_CONFIGURED"/>
     </xs:restriction>
   </xs:simpleType>

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
index 4363633..a569fd2 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
@@ -30,7 +30,11 @@ public class Customer {
 }
 ----
 <1> associate this action with the "notes" property
-<2> prompt for the action's parameters using an inline panel
+<2> prompt for the action's parameters using an inline panel.
+
+Exactly one action for a given property can be specified with `INLINE_AS_IF_EDIT`.
+Assuming that the corresponding property is not itself editable, this means that the property will be rendered as if it is editable, but the action's prompt form will be rendered instead.
+The net effect is that a property conceptually consisting of different parts (eg a name, an address or a date) can be updated using an action that lets each separate part be specified independently.
 
 
 As an alternative to using the annotation, the dynamic xref:../ugvw/ugvw.adoc#_ugvw_layout_file-based[file-based layout] can be used instead, eg:

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-PropertyLayout_promptStyle.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-PropertyLayout_promptStyle.adoc b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-PropertyLayout_promptStyle.adoc
index bcbe637..6e61798 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-PropertyLayout_promptStyle.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-PropertyLayout_promptStyle.adoc
@@ -23,7 +23,7 @@ public class Customer {
 }
 ----
 <1> prompt for the new value for the property using an inline panel
-
+Note that the value `INLINE_AS_EDIT` does not make sense for properties; if specified then it will be interpreted as just `INLINE`.
 
 Alternatively, the `promptStyle()` can be specified using xref:../ugvw/ugvw.adoc#_ugvw_layout_file-based[file-based layouts].
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc
----------------------------------------------------------------------
diff --git a/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc b/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc
index 35ad690..ab7271e 100644
--- a/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc
@@ -141,6 +141,7 @@ for further details).
 |(`1.15.0-SNAPSHOT`) whether the prompt for editing a domain object property or invoking an action (associated with a property) is shown inline within the property's form, or instead shown in a modal dialog box.
 Can be overridden on a property-by-property basis using xref:../rgant/rgant.adoc#_rgant-PropertyLayout_promptStyle[`@Property#promptStyle()`]) or  xref:../rgant/rgant.adoc#_rgant-ActionLayout_promptStyle[`@Action#promptStyle()`]).
 
+Note that `inline_as_edit` does not make sense for a configuration property default, and will instead be interpreted as `inline`.
 
 |`isis.viewer.wicket.` +
 `redirectEvenIfSameObject`

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
index efe8664..175c763 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/annotation/PromptStyle.java
@@ -42,5 +42,31 @@ public enum PromptStyle {
     /**
      * Show the form inline, temporarily replacing the rendering of the property.
      */
-    INLINE
+    INLINE,
+    /**
+     * Applies only to actions, show the form inline, invoked as if editing the property.
+     *
+     * <p>Note that:
+     * <ul>
+     * <li>
+     *     Only one such action should have this attribute set per property.  If there are multiple actions, then
+     *     the first one discovered with the attribute is used.
+     * </li>
+     * <li>
+     *     If the property is editable, then this attribute is ignored (and the action is treated as having a prompt style of {@link #INLINE}).
+     * </li>
+     * <li>
+     *     If applied to a property, then is the property's prompt style is simply treated as {@link #INLINE}.
+     * </li>
+     * </ul>
+     * </p>
+     *
+     */
+    INLINE_AS_IF_EDIT;
+
+    public boolean isDialog() { return this == DIALOG; }
+    public boolean isInline() { return this == INLINE; }
+    public boolean isInlineAsIfEdit() { return this == INLINE_AS_IF_EDIT; }
+
+    public boolean isInlineOrInlineAsIfEdit() { return this == INLINE || this == INLINE_AS_IF_EDIT; }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
index 0656db8..be71839 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
@@ -57,6 +57,7 @@ public class PromptStyleFacetForActionLayoutAnnotation extends PromptStyleFacetA
             switch (promptStyle) {
                 case DIALOG:
                 case INLINE:
+                case INLINE_AS_IF_EDIT:
                     return new PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
 
                 case AS_CONFIGURED:

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
index 68bbb14..3aa08c3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
@@ -58,6 +58,8 @@ public class PromptStyleFacetForPropertyLayoutAnnotation extends PromptStyleFace
                 case DIALOG:
                 case INLINE:
                     return new PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
+                case INLINE_AS_IF_EDIT:
+                    return new PromptStyleFacetForPropertyLayoutAnnotation(PromptStyle.INLINE, holder);
 
                 case AS_CONFIGURED:
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index 80e4b6b..6ec249d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.Bulk;
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filter;
@@ -49,6 +50,7 @@ import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPosition;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+import org.apache.isis.core.metamodel.facets.object.promptStyle.PromptStyleFacet;
 import org.apache.isis.core.metamodel.facets.object.wizard.WizardFacet;
 import org.apache.isis.core.metamodel.interactions.ValidatingInteractionAdvisor;
 import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
@@ -355,7 +357,19 @@ public interface ObjectAction extends ObjectMember {
             return userActions;
         }
 
-
+        public static PromptStyle promptStyleFor(final ObjectAction objectAction) {
+            PromptStyleFacet facet = objectAction.getFacet(PromptStyleFacet.class);
+            if(facet == null) {
+                // don't think this can occur, see PromptStyleFallback
+                return PromptStyle.INLINE;
+            }
+            final PromptStyle promptStyle = facet.value();
+            if(promptStyle == PromptStyle.AS_CONFIGURED) {
+                // don't think this can occur, see PromptStyleConfiguration
+                return PromptStyle.INLINE;
+            }
+            return promptStyle;
+        }
     }
 
     //endregion

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleConfiguration_Test.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleConfiguration_Test.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleConfiguration_Test.java
index b74d156..6848633 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleConfiguration_Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/promptstyle/PromptStyleConfiguration_Test.java
@@ -42,6 +42,18 @@ public class PromptStyleConfiguration_Test {
     }
 
     @Test
+    public void when_inline_as_edit() throws Exception {
+        context.checking(new Expectations() {{
+            oneOf(mockIsisConfiguration).getString("isis.viewer.wicket.promptStyle");
+            will(returnValue("inline_as_edit"));
+        }});
+
+        // then is converted to INLINE (doesn't make sense to have INLINE_AS_EDIT as a default)
+        PromptStyle editStyle = PromptStyleConfiguration.parse(mockIsisConfiguration);
+        Assert.assertThat(editStyle, is(PromptStyle.INLINE));
+    }
+
+    @Test
     public void when_inline_mixed_case_and_superfluous_characters() throws Exception {
         context.checking(new Expectations() {{
             oneOf(mockIsisConfiguration).getString("isis.viewer.wicket.promptStyle");

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
index 61028a3..e0966d2 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
@@ -29,6 +29,7 @@ import org.apache.wicket.markup.html.link.AbstractLink;
 
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.ActionSemantics;
+import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaPosition;
@@ -60,6 +61,7 @@ public class LinkAndLabel implements Serializable {
         final String cssClassFa = ObjectAction.Util.cssClassFaFor(objectAction);
         final CssClassFaPosition cssClassFaPosition = ObjectAction.Util.cssClassFaPositionFor(objectAction);
         final ActionLayout.Position actionLayoutPosition = ObjectAction.Util.actionLayoutPositionOf(objectAction);
+        final PromptStyle promptStyle = ObjectAction.Util.promptStyleFor(objectAction);
         final ActionSemantics.Of semantics = objectAction.getSemantics();
 
         return new LinkAndLabel(
@@ -69,6 +71,7 @@ public class LinkAndLabel implements Serializable {
                 actionIdentifier,
                 cssClass, cssClassFa, cssClassFaPosition, actionLayoutPosition,
                 SemanticsOf.from(semantics),
+                promptStyle,
                 Parameters.fromParameterCount(objectAction.getParameterCount()));
     }
 
@@ -97,6 +100,7 @@ public class LinkAndLabel implements Serializable {
     private final CssClassFaPosition cssClassFaPosition;
     private final ActionLayout.Position position;
     private final SemanticsOf semanticsOf;
+    private final PromptStyle promptStyle;
     private Parameters parameters;
 
     private LinkAndLabel(
@@ -112,6 +116,7 @@ public class LinkAndLabel implements Serializable {
             final CssClassFaPosition cssClassFaPosition,
             final ActionLayout.Position position,
             final SemanticsOf semanticsOf,
+            final PromptStyle promptStyle,
             final Parameters parameters) {
         this.link = link;
         this.label = label;
@@ -125,6 +130,7 @@ public class LinkAndLabel implements Serializable {
         this.cssClassFaPosition = cssClassFaPosition;
         this.position = position;
         this.semanticsOf = semanticsOf;
+        this.promptStyle = promptStyle;
         this.parameters = parameters;
     }
 
@@ -176,6 +182,10 @@ public class LinkAndLabel implements Serializable {
         return semanticsOf;
     }
 
+    public PromptStyle getPromptStyle() {
+        return promptStyle;
+    }
+
     public Parameters getParameters() {
         return parameters;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 9609a03..6a1c0f4 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -696,15 +696,23 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements For
     @Override
     public PromptStyle getPromptStyle() {
         if(this.getActionMemento().getAction(getSpecificationLoader()).getParameterCount() == 0) {
+            // a bit of a hack, the point being that the UI for dialog correctly handles no-args,
+            // whereas for INLINE it would render a form with no fields
             return PromptStyle.DIALOG;
         }
         final PromptStyleFacet facet = getFacet(PromptStyleFacet.class);
         if(facet == null) {
-            return null;
+            // don't think this can happen actually, see PromptStyleFacetFallback
+            return PromptStyle.INLINE;
+        }
+        final PromptStyle promptStyle = facet.value();
+        if (promptStyle == PromptStyle.AS_CONFIGURED) {
+            // I don't think this can happen, actually...
+            // when the metamodel is built, it should replace AS_CONFIGURED with one of the other prompts
+            // (see PromptStyleConfiguration and PromptStyleFacetFallback)
+            return PromptStyle.INLINE;
         }
-        return facet.value() == PromptStyle.INLINE
-                ? PromptStyle.INLINE
-                : PromptStyle.DIALOG;
+        return promptStyle;
     }
 
     public <T extends Facet> T getFacet(final Class<T> facetType) {

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java
index 64da693..7125844 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java
@@ -2,7 +2,6 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -84,7 +83,7 @@ public class EntityModelForReference implements ObjectAdapterModel {
 
     @Override
     public boolean isInlinePrompt() {
-        return scalarModel.getPromptStyle() == PromptStyle.INLINE
+        return scalarModel.getPromptStyle().isInlineOrInlineAsIfEdit()
                 && scalarModel.isEnabled();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 83936d9..b660b2b 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -605,6 +605,7 @@ public class ScalarModel extends EntityModel implements LinksProvider,FormExecut
         public abstract String toStringOf(final ScalarModel scalarModel);
     }
 
+
     private final Kind kind;
     
     private final EntityModel parentEntityModel;
@@ -928,11 +929,17 @@ public class ScalarModel extends EntityModel implements LinksProvider,FormExecut
     public PromptStyle getPromptStyle() {
         final PromptStyleFacet facet = getFacet(PromptStyleFacet.class);
         if(facet == null) {
-            return null;
+            // don't think this can happen actually, see PromptStyleFacetFallback
+            return PromptStyle.INLINE;
+        }
+        PromptStyle promptStyle = facet.value();
+        if (promptStyle == PromptStyle.AS_CONFIGURED) {
+            // I don't think this can happen, actually...
+            // when the metamodel is built, it should replace AS_CONFIGURED with one of the other prompts
+            // (see PromptStyleConfiguration and PromptStyleFacetFallback)
+            return PromptStyle.INLINE;
         }
-        return facet.value() == PromptStyle.INLINE
-                ? PromptStyle.INLINE
-                : PromptStyle.DIALOG;
+        return promptStyle;
     }
 
     public boolean canEnterEditMode() {

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditForm.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditForm.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditForm.java
index 218f198..c7c448f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditForm.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditForm.java
@@ -78,7 +78,7 @@ class PropertyEditForm extends PromptFormAbstract<ScalarModel> {
 
         final PromptStyle promptStyle = getScalarModel().getPromptStyle();
 
-        if (promptStyle == PromptStyle.INLINE) {
+        if (promptStyle.isInlineOrInlineAsIfEdit()) {
 
             getScalarModel().toViewMode();
             getScalarModel().clearPending();

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
----------------------------------------------------------------------
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 0d610c8..a42c0be 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
@@ -36,6 +36,7 @@ import org.apache.wicket.feedback.ComponentFeedbackMessageFilter;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.LabeledWebMarkupContainer;
+import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 
@@ -65,6 +66,7 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisBlobOr
 import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BooleanPanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.valuechoices.ValueChoicesSelect2Panel;
+import org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel.ActionLink;
 import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Components;
@@ -204,8 +206,8 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
     protected abstract String getScalarPanelType();
 
     /**
-     * Mandatory hook for implementations to indicate whether it supports the {@link PromptStyle#INLINE} inline prompt,
-     * and if so, how.
+     * Mandatory hook for implementations to indicate whether it supports the {@link PromptStyle#INLINE inline} or
+     * {@link PromptStyle#INLINE_AS_IF_EDIT prompt}s, and if so, how.
      *
      * <p>
      *     For those that do, both {@link #createInlinePromptForm()} and
@@ -217,6 +219,7 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
      *     Implementations that support inline prompts are: ({@link ScalarPanelAbstract2}, {@link ReferencePanel} and
      *     {@link ValueChoicesSelect2Panel}; those that don't are {@link IsisBlobOrClobPanelAbstract} and {@link BooleanPanel}.
      * </p>
+     *
      */
     protected abstract InlinePromptConfig getInlinePromptConfig();
 
@@ -244,6 +247,9 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
 
         scalarTypeContainer.addOrReplace(scalarIfCompact, scalarIfRegular);
 
+        List<LinkAndLabel> linkAndLabels =
+                    LinkAndLabelUtil.asActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
+
         final InlinePromptConfig inlinePromptConfig = getInlinePromptConfig();
         if(inlinePromptConfig.isSupported()) {
 
@@ -252,39 +258,52 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
             inlinePromptLink = createInlinePromptLink();
             scalarIfRegular.add(inlinePromptLink);
 
-            // even if this particular scalarModel (property) is not configured for inline edits, it's possible that
-            // one of the associated actions is.  Thus we set the prompt context
+            // even if this particular scalarModel (property) is not configured for inline edits,
+            // it's possible that one of the associated actions is.  Thus we set the prompt context
             scalarModel.setInlinePromptContext(
                     new InlinePromptContext(
                             getComponentForRegular(),
                             scalarIfRegularInlinePromptForm, scalarTypeContainer));
 
-            // and we configure the prompt link if _this_ property is configured for inline edits...
-            final PromptStyle promptStyle = this.scalarModel.getPromptStyle();
-            if(promptStyle == PromptStyle.INLINE) {
-                configureInlinePromptLinkCallback(inlinePromptLink);
-            }
+            // start off assuming that neither the property nor any of the associated actions
+            // are using inline prompts
+            Component componentToHideIfAny = inlinePromptLink;
 
-            Component componentToHideIfAny = null;
-            if (scalarModel.canEnterEditMode() && promptStyle == PromptStyle.INLINE) {
+            if (this.scalarModel.getPromptStyle().isInline() && scalarModel.canEnterEditMode()) {
+                // we configure the prompt link if _this_ property is configured for inline edits...
+                configureInlinePromptLinkCallback(inlinePromptLink);
                 componentToHideIfAny = inlinePromptConfig.getComponentToHideIfAny();
+
             } else {
-                componentToHideIfAny = inlinePromptLink;
+                // even though the property isn't editable, it might be that one of the associated actions
+                // is configured to use an inline form "as if edit"
+                final LinkAndLabel linkAndLabelAsIfEdit = inlineAsIfEditIfAny(linkAndLabels);
+
+                if(linkAndLabelAsIfEdit != null) {
+                    // safe to do this, the inlineAsEditIfAny(...) method checks for us
+                    final ActionLink actionLinkInlineAsIfEdit = (ActionLink) linkAndLabelAsIfEdit.getLink();
+
+                    configureInlinePromptLinkCallback(inlinePromptLink, actionLinkInlineAsIfEdit);
+                    componentToHideIfAny = inlinePromptConfig.getComponentToHideIfAny();
+
+                    // don't render as an action
+                    linkAndLabels = Lists.newArrayList(linkAndLabels);
+                    linkAndLabels.remove(linkAndLabelAsIfEdit);
+                }
             }
+
             if(componentToHideIfAny != null) {
                 componentToHideIfAny.setVisibilityAllowed(false);
             }
         }
         if(scalarModel.getKind() == ScalarModel.Kind.PROPERTY &&
            scalarModel.getMode() == EntityModel.Mode.VIEW     &&
-                (scalarModel.getPromptStyle() != PromptStyle.INLINE || !scalarModel.canEnterEditMode())) {
+                (scalarModel.getPromptStyle().isDialog() || !scalarModel.canEnterEditMode())) {
             getScalarValueComponent().add(new AttributeAppender("tabindex", "-1"));
         }
 
-        final List<LinkAndLabel> actionLinks =
-                LinkAndLabelUtil.asActionLinksForAssociation(this.scalarModel, getDeploymentCategory());
-        addPositioningCssTo(scalarIfRegular, actionLinks);
-        addActionLinksBelowAndRight(scalarIfRegular, actionLinks);
+        addPositioningCssTo(scalarIfRegular, linkAndLabels);
+        addActionLinksBelowAndRight(scalarIfRegular, linkAndLabels);
 
         addEditPropertyTo(scalarIfRegular);
         addFeedbackOnlyTo(scalarIfRegular, getScalarValueComponent());
@@ -298,6 +317,25 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
     }
 
     /**
+     * @return the first {@link ActionLink} (if any) configured with a
+     * {@link LinkAndLabel#getPromptStyle() prompt style} of {@link PromptStyle#INLINE_AS_IF_EDIT}.
+     */
+    private static LinkAndLabel inlineAsIfEditIfAny(final List<LinkAndLabel> linkAndLabels) {
+        for (LinkAndLabel linkAndLabel : linkAndLabels) {
+            AbstractLink link = linkAndLabel.getLink();
+            if(link instanceof ActionLink) {
+
+                PromptStyle promptStyle = linkAndLabel.getPromptStyle();
+
+                if(promptStyle.isInlineAsIfEdit()) {
+                    return linkAndLabel;
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
      * Optional hook.
      */
     protected void onInitializeWhenViewMode() {
@@ -584,6 +622,23 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
         });
     }
 
+    private void configureInlinePromptLinkCallback(
+            final WebMarkupContainer inlinePromptLink,
+            final ActionLink actionLink) {
+
+        inlinePromptLink.add(new AjaxEventBehavior("click") {
+            @Override
+            protected void onEvent(final AjaxRequestTarget target) {
+                actionLink.onClick(target);
+            }
+
+            @Override
+            public boolean isEnabled(final Component component) {
+                return true;
+            }
+        });
+    }
+
     private void switchFormForInlinePrompt(final AjaxRequestTarget target) {
         scalarIfRegularInlinePromptForm = (PropertyEditFormPanel) getComponentFactoryRegistry().addOrReplaceComponent(
                 scalarTypeContainer, ID_SCALAR_IF_REGULAR_INLINE_PROMPT_FORM, ComponentType.PROPERTY_EDIT_FORM, scalarModel);
@@ -606,7 +661,9 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
     protected void addEditPropertyTo(
             final MarkupContainer scalarIfRegularFormGroup) {
 
-        if(scalarModel.canEnterEditMode() && (scalarModel.getPromptStyle() == PromptStyle.DIALOG || !getInlinePromptConfig().isSupported())) {
+        if(  scalarModel.canEnterEditMode() &&
+            (scalarModel.getPromptStyle().isDialog() ||
+            !getInlinePromptConfig().isSupported())) {
 
             final WebMarkupContainer editProperty = new WebMarkupContainer(ID_EDIT_PROPERTY);
             editProperty.setOutputMarkupId(true);
@@ -667,11 +724,13 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
      * the {@link ActionLayout.Position#RIGHT right}.
      *
      * @param markupContainer The form group element
-     * @param entityActionLinks
+     * @param actionLinks
      */
-    private void addPositioningCssTo(final MarkupContainer markupContainer, final List<LinkAndLabel> entityActionLinks) {
+    private void addPositioningCssTo(
+            final MarkupContainer markupContainer,
+            final List<LinkAndLabel> actionLinks) {
         CssClassAppender.appendCssClassTo(markupContainer, determinePropParamLayoutCss(getModel()));
-        CssClassAppender.appendCssClassTo(markupContainer, determineActionLayoutPositioningCss(entityActionLinks));
+        CssClassAppender.appendCssClassTo(markupContainer, determineActionLayoutPositioningCss(actionLinks));
     }
 
     private static String determinePropParamLayoutCss(ScalarModel model) {

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.java
----------------------------------------------------------------------
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 d7eefd1..484966c 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
@@ -31,7 +31,6 @@ import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
@@ -98,12 +97,7 @@ public class BooleanPanel extends ScalarPanelAbstract2 {
 
     @Override
     protected InlinePromptConfig getInlinePromptConfig() {
-        return InlinePromptConfig.supportedAndHide(
-                scalarModel.getMode() == EntityModel.Mode.EDIT ||
-                scalarModel.getKind() == ScalarModel.Kind.PARAMETER
-                        ? this.checkBox
-                        : null
-        );
+        return InlinePromptConfig.supportedAndHide(this.checkBox);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
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 03c0bf7..3662a57 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
@@ -37,7 +37,6 @@ import org.apache.wicket.validation.ValidationError;
 import org.wicketstuff.select2.ChoiceProvider;
 import org.wicketstuff.select2.Settings;
 
-import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
@@ -197,11 +196,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract implements PanelW
 
     @Override
     protected InlinePromptConfig getInlinePromptConfig() {
-        return InlinePromptConfig.supportedAndHide(
-                scalarModel.getMode() == EntityModel.Mode.EDIT ||
-                scalarModel.getKind() == ScalarModel.Kind.PARAMETER
-                        ? select2.component()
-                        : null);
+        return InlinePromptConfig.supportedAndHide(select2.component());
     }
 
     @Override
@@ -292,7 +287,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract implements PanelW
             componentForRegular.addOrReplace(component);
 
             if (adapter != null) {
-                if(scalarModel.getPromptStyle() == PromptStyle.INLINE && scalarModel.canEnterEditMode()) {
+                if(scalarModel.getPromptStyle().isInlineOrInlineAsIfEdit() && scalarModel.canEnterEditMode()) {
                     // bit of a hack... allows us to suppress the title using CSS
                     component.add(new CssClassAppender("inlinePrompt"));
                 }
@@ -302,7 +297,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract implements PanelW
             } else {
 
 
-                if(scalarModel.getPromptStyle() == PromptStyle.INLINE && scalarModel.canEnterEditMode()) {
+                if(scalarModel.getPromptStyle().isInlineOrInlineAsIfEdit() && scalarModel.canEnterEditMode()) {
                     Components.permanentlyHide(componentForRegular, "entityTitleIfNull");
                 } else {
                     componentForRegular.addOrReplace(new Label("entityTitleIfNull", "(none)"));

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index fcdf756..426fc32 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -93,7 +93,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
         InlinePromptContext inlinePromptContext = determineInlinePromptContext();
         PromptStyle promptStyle = actionModel.getPromptStyle();
 
-        if(inlinePromptContext == null || promptStyle != PromptStyle.INLINE) {
+        if(inlinePromptContext == null || promptStyle.isDialog()) {
             final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(actionLink.getPage());
             final ActionPrompt prompt = promptProvider.getActionPrompt();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/8c0f7d20/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
----------------------------------------------------------------------
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 fe5ba19..7302c42 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
@@ -151,7 +151,7 @@ public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormE
         // so can submit with invalid content (eg mandatory params missing)
         cancelButton.setDefaultFormProcessing(false);
 
-        if (formExecutorContext.getPromptStyle() == PromptStyle.INLINE) {
+        if (formExecutorContext.getPromptStyle().isInlineOrInlineAsIfEdit()) {
             cancelButton.add(new FireOnEscapeKey() {
                 @Override
                 protected void respond(final AjaxRequestTarget target) {
@@ -247,7 +247,9 @@ public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormE
     private void completePrompt(final AjaxRequestTarget target) {
 
         final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
-        if (promptStyle == PromptStyle.INLINE && formExecutorContext.getInlinePromptContext() != null) {
+        if (promptStyle.isInlineOrInlineAsIfEdit() &&
+            formExecutorContext.getInlinePromptContext() != null) {
+
             formExecutorContext.reset();
             rebuildGuiAfterInlinePromptDone(target);
         } else {