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 2016/02/24 00:40:10 UTC

[07/13] isis git commit: ISIS-993: responsibility for creating the default grid moved to GrdNormalizerService. Also Wicket viewer html layout fixes...

ISIS-993: responsibility for creating the default grid moved to GrdNormalizerService.  Also Wicket viewer html layout fixes...

that is:
- tidying up of ScalarPanelAbstract html/layout, adding missing support for 'edit' button (and use fa-icon for that now, instead).
- removing spurious concurrency exception resulting from new implementation of edit functionality (from action whose button is rendered on panel).


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

Branch: refs/heads/ISIS-993
Commit: 5c2b07de4bb30a490f4d3f12bab694e6fba161f5
Parents: e95a46f
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Feb 23 12:56:04 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Feb 23 12:56:04 2016 +0000

----------------------------------------------------------------------
 .../services/layout/GridNormalizerService.java  |   3 +
 .../applib/services/layout/GridService.java     |   2 +
 .../facets/object/grid/GridFacetDefault.java    | 102 +-----------------
 .../grid/GridNormalizerServiceAbstract.java     |  19 ++--
 .../services/grid/GridServiceDefault.java       |  24 ++---
 .../bootstrap3/GridNormalizerServiceBS3.java    | 104 +++++++++++++++----
 .../spec/feature/ObjectAssociation.java         |  23 ++++
 .../specimpl/ObjectSpecificationAbstract.java   |   6 +-
 .../AdditionalLinksAsListInlinePanel.html       |   1 +
 .../serviceactions/ServiceActionsPanel.css      |   5 +
 .../entity/fieldset/PropertyGroup.html          |   4 +-
 .../components/scalars/ScalarPanelAbstract.html |  11 +-
 .../isisapplib/IsisBlobOrClobPanelAbstract.html |  29 ++++--
 .../scalars/primitive/BooleanPanel.html         |  17 ++-
 .../scalars/reference/ReferencePanel.html       |  27 ++---
 .../linkandlabel/ActionLinkFactoryAbstract.java |  14 ++-
 .../valuechoices/ValueChoicesSelect2Panel.html  |  16 ++-
 .../ui/pages/bootstrap-overrides-flatly.css     |   5 +
 .../wicket/ui/pages/bootstrap-overrides.css     |  35 +++++--
 .../wicket/ui/pages/entity/EntityPage.java      |  17 +--
 20 files changed, 272 insertions(+), 192 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridNormalizerService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridNormalizerService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridNormalizerService.java
index a967d95..6eb2383 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridNormalizerService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridNormalizerService.java
@@ -45,4 +45,7 @@ public interface GridNormalizerService<G extends Grid> {
 
     @Programmatic
     void minimal(G grid, Class<?> domainClass);
+
+    @Programmatic
+    Grid defaultGrid(Class<?> domainClass);
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridService.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridService.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridService.java
index 1606046..d8ce4b4 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridService.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/GridService.java
@@ -50,6 +50,8 @@ public interface GridService {
 
     Grid minimal(Grid grid);
 
+    Grid defaultGrid(Class<?> domainClass);
+
     enum Style {
 
         /**

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
index e02efde..756938a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/grid/GridFacetDefault.java
@@ -18,29 +18,16 @@
  */
 package org.apache.isis.core.metamodel.facets.object.grid;
 
-import java.util.Arrays;
-import java.util.List;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.isis.applib.annotation.MemberGroupLayout;
-import org.apache.isis.applib.layout.component.CollectionLayoutData;
-import org.apache.isis.applib.layout.component.DomainObjectLayoutData;
-import org.apache.isis.applib.layout.component.FieldSet;
 import org.apache.isis.applib.layout.component.Grid;
-import org.apache.isis.applib.layout.grid.bootstrap3.BS3Col;
-import org.apache.isis.applib.layout.grid.bootstrap3.BS3Grid;
-import org.apache.isis.applib.layout.grid.bootstrap3.BS3Row;
 import org.apache.isis.applib.services.layout.GridService;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
 public class GridFacetDefault
             extends FacetAbstract
@@ -82,97 +69,12 @@ public class GridFacetDefault
         final Class<?> domainClass = getSpecification().getCorrespondingClass();
         Grid grid = gridService.fromXml(domainClass);
         if(grid == null) {
-            grid = deriveGrid();
+            grid = gridService.defaultGrid(domainClass);
         }
-
-        this.grid = normalize(grid);
+        this.grid = gridService.normalize(grid);
         return this.grid;
     }
 
-    private Grid deriveGrid() {
-        final BS3Grid bs3Grid = new BS3Grid();
-        bs3Grid.setDomainClass(getSpecification().getCorrespondingClass());
-
-        final BS3Row headerRow = new BS3Row();
-        bs3Grid.getRows().add(headerRow);
-        final BS3Col headerRowCol = new BS3Col();
-        headerRowCol.setSpan(12);
-        headerRowCol.setUnreferencedActions(true);
-        headerRowCol.setDomainObject(new DomainObjectLayoutData());
-        headerRow.getCols().add(headerRowCol);
-
-        final BS3Row propsRow = new BS3Row();
-        bs3Grid.getRows().add(propsRow);
-
-        final MemberGroupLayoutFacet memberGroupLayoutFacet =
-                getSpecification().getFacet(MemberGroupLayoutFacet.class);
-        if(memberGroupLayoutFacet != null) {
-            // if have @MemberGroupLayout (or equally, a .layout.json file)
-            final MemberGroupLayout.ColumnSpans columnSpans = memberGroupLayoutFacet.getColumnSpans();
-            addFieldSetsToColumn(propsRow, columnSpans.getLeft(), memberGroupLayoutFacet.getLeft(), true);
-            addFieldSetsToColumn(propsRow, columnSpans.getMiddle(), memberGroupLayoutFacet.getMiddle(), false);
-            addFieldSetsToColumn(propsRow, columnSpans.getRight(), memberGroupLayoutFacet.getRight(), false);
-
-            final BS3Col col = new BS3Col();
-            final int collectionSpan = columnSpans.getCollections();
-            col.setUnreferencedCollections(true);
-            col.setSpan(collectionSpan > 0? collectionSpan: 12);
-            propsRow.getCols().add(col);
-
-            // will already be sorted per @MemberOrder
-            final List<OneToManyAssociation> collections = getSpecification().getCollections(Contributed.INCLUDED);
-            for (OneToManyAssociation collection : collections) {
-                col.getCollections().add(new CollectionLayoutData(collection.getId()));
-            }
-        } else {
-
-            // if no layout hints other than @MemberOrder
-            addFieldSetsToColumn(propsRow, 4, Arrays.asList("General"), true);
-
-            final BS3Col col = new BS3Col();
-            col.setUnreferencedCollections(true);
-            col.setSpan(12);
-            propsRow.getCols().add(col);
-        }
-        return bs3Grid;
-    }
-
-    void addFieldSetsToColumn(
-            final BS3Row propsRow,
-            final int span,
-            final List<String> memberGroupNames,
-            final boolean unreferencedProperties) {
-
-        if(span > 0 || unreferencedProperties) {
-            final BS3Col col = new BS3Col();
-            col.setSpan(span); // in case we are here because of 'unreferencedProperties' needs setting
-            propsRow.getCols().add(col);
-            final List<String> leftMemberGroups = memberGroupNames;
-            for (String memberGroup : leftMemberGroups) {
-                final FieldSet fieldSet = new FieldSet();
-                fieldSet.setName(memberGroup);
-                // fieldSet's id will be derived from the name later
-                // during normalization phase.
-                if(unreferencedProperties && col.getFieldSets().isEmpty()) {
-                    fieldSet.setUnreferencedProperties(true);
-                }
-                col.getFieldSets().add(fieldSet);
-            }
-        }
-    }
-
-
-
-    private Grid normalize(final Grid grid) {
-        if(grid == null) {
-            return null;
-        }
-        // unused... final Class<?> domainClass = getSpecification().getCorrespondingClass();
-
-        return gridService.normalize(grid);
-    }
-
-
     private ObjectSpecification getSpecification() {
         return (ObjectSpecification) getFacetHolder();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridNormalizerServiceAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridNormalizerServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridNormalizerServiceAbstract.java
index dd7abc8..8d92c89 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridNormalizerServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridNormalizerServiceAbstract.java
@@ -20,12 +20,13 @@ import java.util.Collection;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.inject.Inject;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,7 +50,6 @@ import org.apache.isis.applib.layout.component.HasCssClassFa;
 import org.apache.isis.applib.layout.component.HasDescribedAs;
 import org.apache.isis.applib.layout.component.HasHidden;
 import org.apache.isis.applib.layout.component.HasNamed;
-import org.apache.isis.applib.layout.component.MemberRegionOwner;
 import org.apache.isis.applib.layout.component.PropertyLayoutData;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.jaxb.JaxbService;
@@ -480,7 +480,7 @@ public abstract class GridNormalizerServiceAbstract<G extends Grid>
             final Map<String, OneToManyAssociation> oneToManyAssociationById,
             final Map<String, ObjectAction> objectActionById) {
 
-        final Map<String, int[]> propertySequenceByGroup = Maps.newHashMap();
+        final AtomicInteger propertySequence = new AtomicInteger(0);
         fcGrid.visit(new Grid.VisitorAdapter() {
             private int collectionSequence = 1;
 
@@ -569,9 +569,11 @@ public abstract class GridNormalizerServiceAbstract<G extends Grid>
                 FacetUtil.addOrReplaceFacet(TypicalLengthFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
 
                 // @MemberOrder#name based on owning property group, @MemberOrder#sequence monotonically increasing
+                // nb for any given field set the sequence won't reset to zero; however this is what we want so that
+                // table columns are shown correctly (by fieldset, then property order within that fieldset).
                 final FieldSet fieldSet = propertyLayoutData.getOwner();
                 final String groupName = fieldSet.getName();
-                final String sequence = nextInSequenceFor(groupName, propertySequenceByGroup);
+                final String sequence = "" + (propertySequence.incrementAndGet());
                 FacetUtil.addOrReplaceFacet(
                         new MemberOrderFacetXml(groupName, sequence, translationService, oneToOneAssociation));
             }
@@ -653,20 +655,19 @@ public abstract class GridNormalizerServiceAbstract<G extends Grid>
     }
 
 
-    SpecificationLoader specificationLookup;
+    protected SpecificationLoader specificationLookup;
 
     public void setSpecificationLoader(final SpecificationLoader specificationLookup) {
         this.specificationLookup = specificationLookup;
     }
 
     @Inject
-    TranslationService translationService;
+    protected TranslationService translationService;
 
     @Inject
-    JaxbService jaxbService;
+    protected JaxbService jaxbService;
 
     @Inject
-    DomainObjectContainer container;
-
+    protected DomainObjectContainer container;
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
index e9dc2b2..4ce3f02 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridServiceDefault.java
@@ -152,12 +152,20 @@ public class GridServiceDefault
     }
 
     @Override
-    @Programmatic
-    public Grid normalize(final Grid grid) {
+    public Grid defaultGrid(Class<?> domainClass) {
 
-        if(grid == null) {
-            return null;
+        for (GridNormalizerService gridNormalizerService : gridNormalizerServices()) {
+            Grid grid = gridNormalizerService.defaultGrid(domainClass);
+            if(grid != null) {
+                return grid;
+            }
         }
+        throw new IllegalStateException("No GridNormalizerService available to create grid for '" + domainClass.getName() + "'");
+    }
+
+    @Override
+    @Programmatic
+    public Grid normalize(final Grid grid) {
 
         // if have .layout.json and then add a .layout.xml without restarting, then note that
         // the changes won't be picked up.  Normalizing would be required
@@ -181,10 +189,6 @@ public class GridServiceDefault
     @Programmatic
     public Grid complete(final Grid grid) {
 
-        if(grid == null) {
-            return null;
-        }
-
         final Class<?> domainClass = grid.getDomainClass();
         for (GridNormalizerService gridNormalizerService : gridNormalizerServices()) {
             gridNormalizerService.complete(grid, domainClass);
@@ -197,10 +201,6 @@ public class GridServiceDefault
     @Programmatic
     public Grid minimal(final Grid grid) {
 
-        if(grid == null) {
-            return null;
-        }
-
         final Class<?> domainClass = grid.getDomainClass();
         for (GridNormalizerService gridNormalizerService : gridNormalizerServices()) {
             gridNormalizerService.minimal(grid, domainClass);

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
index 283bb49..9ad5161 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/bootstrap3/GridNormalizerServiceBS3.java
@@ -16,7 +16,7 @@
  */
 package org.apache.isis.core.metamodel.services.grid.bootstrap3;
 
-import java.util.Comparator;
+import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -37,9 +37,12 @@ import com.google.common.collect.Sets;
 
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.MemberGroupLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.layout.component.ActionLayoutData;
 import org.apache.isis.applib.layout.component.CollectionLayoutData;
+import org.apache.isis.applib.layout.component.DomainObjectLayoutData;
 import org.apache.isis.applib.layout.component.FieldSet;
 import org.apache.isis.applib.layout.component.Grid;
 import org.apache.isis.applib.layout.component.PropertyLayoutData;
@@ -50,13 +53,14 @@ import org.apache.isis.applib.layout.grid.bootstrap3.BS3RowContent;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3Tab;
 import org.apache.isis.applib.layout.grid.bootstrap3.BS3TabGroup;
 import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
 import org.apache.isis.core.metamodel.services.grid.GridNormalizerServiceAbstract;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.core.metamodel.util.DeweyOrderComparator;
 
 @DomainService(
         nature = NatureOfService.DOMAIN
@@ -71,6 +75,84 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
     }
 
 
+    @Programmatic
+    @Override
+    public Grid defaultGrid(final Class<?> domainClass) {
+        final BS3Grid bs3Grid = new BS3Grid();
+
+        final ObjectSpecification objectSpec = specificationLookup.loadSpecification(domainClass);
+        bs3Grid.setDomainClass(domainClass);
+
+        final BS3Row headerRow = new BS3Row();
+        bs3Grid.getRows().add(headerRow);
+        final BS3Col headerRowCol = new BS3Col();
+        headerRowCol.setSpan(12);
+        headerRowCol.setUnreferencedActions(true);
+        headerRowCol.setDomainObject(new DomainObjectLayoutData());
+        headerRow.getCols().add(headerRowCol);
+
+        final BS3Row propsRow = new BS3Row();
+        bs3Grid.getRows().add(propsRow);
+
+        final MemberGroupLayoutFacet memberGroupLayoutFacet =
+                objectSpec.getFacet(MemberGroupLayoutFacet.class);
+        if(memberGroupLayoutFacet != null) {
+            // if have @MemberGroupLayout (or equally, a .layout.json file)
+            final MemberGroupLayout.ColumnSpans columnSpans = memberGroupLayoutFacet.getColumnSpans();
+            addFieldSetsToColumn(propsRow, columnSpans.getLeft(), memberGroupLayoutFacet.getLeft(), true);
+            addFieldSetsToColumn(propsRow, columnSpans.getMiddle(), memberGroupLayoutFacet.getMiddle(), false);
+            addFieldSetsToColumn(propsRow, columnSpans.getRight(), memberGroupLayoutFacet.getRight(), false);
+
+            final BS3Col col = new BS3Col();
+            final int collectionSpan = columnSpans.getCollections();
+            col.setUnreferencedCollections(true);
+            col.setSpan(collectionSpan > 0? collectionSpan: 12);
+            propsRow.getCols().add(col);
+
+            // will already be sorted per @MemberOrder
+            final List<OneToManyAssociation> collections = objectSpec.getCollections(Contributed.INCLUDED);
+            for (OneToManyAssociation collection : collections) {
+                col.getCollections().add(new CollectionLayoutData(collection.getId()));
+            }
+        } else {
+
+            // if no layout hints other than @MemberOrder
+            addFieldSetsToColumn(propsRow, 4, Arrays.asList("General"), true);
+
+            final BS3Col col = new BS3Col();
+            col.setUnreferencedCollections(true);
+            col.setSpan(12);
+            propsRow.getCols().add(col);
+        }
+        return bs3Grid;
+    }
+
+    void addFieldSetsToColumn(
+            final BS3Row propsRow,
+            final int span,
+            final List<String> memberGroupNames,
+            final boolean unreferencedProperties) {
+
+        if(span > 0 || unreferencedProperties) {
+            final BS3Col col = new BS3Col();
+            col.setSpan(span); // in case we are here because of 'unreferencedProperties' needs setting
+            propsRow.getCols().add(col);
+            final List<String> leftMemberGroups = memberGroupNames;
+            for (String memberGroup : leftMemberGroups) {
+                final FieldSet fieldSet = new FieldSet();
+                fieldSet.setName(memberGroup);
+                // fieldSet's id will be derived from the name later
+                // during normalization phase.
+                if(unreferencedProperties && col.getFieldSets().isEmpty()) {
+                    fieldSet.setUnreferencedProperties(true);
+                }
+                col.getFieldSets().add(fieldSet);
+            }
+        }
+    }
+
+
+
     @Override
     protected boolean validateAndDerive(
             final Grid grid,
@@ -304,7 +386,7 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
                         .filter(Predicates.<OneToOneAssociation>notNull())
                 );
 
-                associations.sort(byMemberOrderSequence());
+                associations.sort(ObjectAssociation.Comparators.byMemberOrderSequence());
                 addPropertiesTo(fieldSet,
                         FluentIterable.from(associations)
                                       .transform(ObjectAssociation.Functions.toId())
@@ -337,7 +419,7 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
                             return oneToManyAssociationById.get(collectionId);
                         }
                     })
-                    .toSortedList(byMemberOrderSequence())
+                    .toSortedList(ObjectAssociation.Comparators.byMemberOrderSequence())
 
             );
             final ImmutableList<String> sortedMissingCollectionIds = FluentIterable.from(sortedCollections)
@@ -424,20 +506,6 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
         return Character.toLowerCase(c) + str.substring(1).replaceAll("\\s+", "");
     }
 
-    private static Comparator<ObjectAssociation> byMemberOrderSequence() {
-        return new Comparator<ObjectAssociation>() {
-            private final DeweyOrderComparator deweyOrderComparator = new DeweyOrderComparator();
-            @Override
-            public int compare(final ObjectAssociation o1, final ObjectAssociation o2) {
-                final MemberOrderFacet o1Facet = o1.getFacet(MemberOrderFacet.class);
-                final MemberOrderFacet o2Facet = o2.getFacet(MemberOrderFacet.class);
-                return o1Facet == null? +1:
-                        o2Facet == null? -1:
-                                deweyOrderComparator.compare(o1Facet.sequence(), o2Facet.sequence());
-            }
-        };
-    }
-
     protected void addPropertiesTo(
             final FieldSet fieldSet,
             final List<String> propertyIds) {

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
index 9c87476..50024dc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAssociation.java
@@ -20,6 +20,7 @@
 package org.apache.isis.core.metamodel.spec.feature;
 
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 
@@ -41,6 +42,7 @@ import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayo
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.layout.memberorderfacet.MemberOrderComparator;
 import org.apache.isis.core.metamodel.specloader.specimpl.ContributeeMember;
+import org.apache.isis.core.metamodel.util.DeweyOrderComparator;
 
 /**
  * Provides reflective access to a field on a domain object.
@@ -395,6 +397,27 @@ public interface ObjectAssociation extends ObjectMember, CurrentHolder {
     }
 
     // //////////////////////////////////////////////////////
+    // Comparators
+    // //////////////////////////////////////////////////////
+
+    public static class Comparators {
+        public static Comparator<ObjectAssociation> byMemberOrderSequence() {
+            return new Comparator<ObjectAssociation>() {
+                private final DeweyOrderComparator deweyOrderComparator = new DeweyOrderComparator();
+                @Override
+                public int compare(final ObjectAssociation o1, final ObjectAssociation o2) {
+                    final MemberOrderFacet o1Facet = o1.getFacet(MemberOrderFacet.class);
+                    final MemberOrderFacet o2Facet = o2.getFacet(MemberOrderFacet.class);
+                    return o1Facet == null? +1:
+                            o2Facet == null? -1:
+                                    deweyOrderComparator.compare(o1Facet.sequence(), o2Facet.sequence());
+                }
+            };
+        }
+
+    }
+
+    // //////////////////////////////////////////////////////
     // Util
     // //////////////////////////////////////////////////////
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 0a2561d..708e700 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -29,6 +29,7 @@ import java.util.Set;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -709,7 +710,10 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     public List<ObjectAssociation> getAssociations(Contributed contributed, final Filter<ObjectAssociation> filter) {
         final List<ObjectAssociation> allAssociations = getAssociations(contributed);
         return Lists.newArrayList(
-                Iterables.filter(allAssociations, Filters.asPredicate(filter)));
+                FluentIterable.from(allAssociations)
+                        .filter(Filters.asPredicate(filter))
+                        .toSortedList(ObjectAssociation.Comparators.byMemberOrderSequence())
+        );
     }
 
     @SuppressWarnings({ "rawtypes", "unchecked" })

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
index 7cc41f1..f7d8db6 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/AdditionalLinksAsListInlinePanel.html
@@ -31,6 +31,7 @@
                     </a>
                 </li>
             </ul>
+            <div class="clearfix"/>
         </wicket:panel>
     </body>
 </html>

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.css
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.css b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.css
index 59f31df..8b16ff9 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.css
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionsPanel.css
@@ -237,6 +237,11 @@
     margin-right: 10px;
 }
 
+
+.pull-right .additionalLinkListDropDown {
+    margin-left: 0px;
+}
+
 .additionalLinkList li {
     float:left;
     margin-right:10px;

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.html
index 5b402cb..355ed29 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.html
@@ -25,8 +25,8 @@
                     <div class="panel-heading">
                         <span wicket:id="memberGroupName" class="panel-title">[group name]</span>
                         <div class="pull-right additionalLinks">
-                            <div wicket:id="associatedActionLinksPanel"></div>
-                            <div wicket:id="associatedActionLinksPanelDropDown"></div>
+                            <div class="pull-right" wicket:id="associatedActionLinksPanelDropDown"></div>
+                            <div class="pull-right" wicket:id="associatedActionLinksPanel"></div>
                         </div>
                     </div>
                     <div class="properties panel-body">

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
index e7715cd..dcbd683 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.html
@@ -28,11 +28,18 @@
                 <div class="form-group" wicket:id="scalarIfRegular">
                     <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
                     <span class="scalarValueWrapper">
-                        <span class="editing"><wicket:child/><a wicket:id="editProperty" href="#" class="btn btn-link btn-xs" style="float: right;">edit</a></span>
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <wicket:child/>
+                                    <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                </span>
+                            </span>
+                        </div>
                         <span wicket:id="feedback" class="help-block"></span>
                         <span wicket:id="associatedActionLinksBelow"></span>
                     </span>
-                    <span wicket:id="associatedActionLinksRight"></span>
+                    <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight">[drop down]</span>
                     <div class="clearfix"/>
                 </div>
                 <wicket:container wicket:id="scalarIfCompact"></wicket:container>

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.html
index d642f93..92b11a7 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/isisapplib/IsisBlobOrClobPanelAbstract.html
@@ -24,23 +24,30 @@
                 <div class="form-group" wicket:id="scalarIfRegular">
                     <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
                     <span class="scalarValueWrapper">
-                        <img class="scalarImage text-center" width="200px" wicket:id="scalarImage"/>
-                        <span class="scalarValue text-right">
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <img class="scalarImage text-center" width="200px" wicket:id="scalarImage"/>
+                                    <span class="scalarValue text-right">
 
-                            <span class="uploadFile help-block">
-                                <input type="file" name="scalarValue" wicket:id="scalarValue" />
-                            </span>
-                            <a wicket:id="scalarIfRegularClear" class="btn btn-primary btn-sm"><span class="clearTitle">Clear</span></a>
+                                        <span class="uploadFile help-block">
+                                            <input type="file" name="scalarValue" wicket:id="scalarValue" />
+                                        </span>
+                                        <a wicket:id="scalarIfRegularClear" class="btn btn-primary btn-sm"><span class="clearTitle">Clear</span></a>
 
-                            <a class="download btn btn-sm btn-primary" wicket:id="scalarIfRegularDownload"><span class="downloadTitle">Download</span></a>
-                            <span class="fileName" wicket:id="fileName">[filename]</span><span>&nbsp;</span>
-                        </span>
+                                        <a class="download btn btn-sm btn-primary" wicket:id="scalarIfRegularDownload"><span class="downloadTitle">Download</span></a>
+                                        <span class="fileName" wicket:id="fileName">[filename]</span><span>&nbsp;</span>
+                                    </span>
+                                    <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                </span>
+                            </span>
+                        </div>
                         <span wicket:id="feedback" class="help-block"></span>
                         <span wicket:id="associatedActionLinksBelow"></span>
                     </span>
-                    <span wicket:id="associatedActionLinksRight"></span>
+                    <span wicket:id="associatedActionLinksRight"  class="associatedActionLinksRight">[drop down]</span>
+                    <div class="clearfix"/>
                 </div>
-
                 <span wicket:id="scalarIfCompact">
                     <a wicket:id="scalarIfCompactDownload"><span class="fileName" wicket:id="fileNameIfCompact"></span></a>
                 </span>

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.html
index 7809939..8fa08d9 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BooleanPanel.html
@@ -27,15 +27,24 @@
             <div class="booleanPanel scalarNameAndValueComponentType">
                 <div class="form-group" wicket:id="scalarIfRegular">
                     <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
-                    <div class="scalarValueWrapper">
-                        <input type="checkbox" name="scalarValue" class="scalarValue" wicket:id="scalarValue" />
+                    <span class="scalarValueWrapper">
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <input type="checkbox" name="scalarValue" class="scalarValue" wicket:id="scalarValue" />
+                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                </span>
+                            </span>
+                        </div>
                         <span wicket:id="feedback" class="help-block"></span>
                         <span wicket:id="associatedActionLinksBelow"></span>
-                    </div>
-                    <span wicket:id="associatedActionLinksRight"></span>
+                    </span>
+                    <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+                    <div class="clearfix"/>
                 </div>
                 <input type="checkbox" wicket:id="scalarIfCompact" />
             </div>
+            <div class="clearfix"/>
         </wicket:panel>
     </body>
 </html>

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
index 0b92105..cfc0ace 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.html
@@ -28,22 +28,25 @@
                 <div class="form-group" wicket:id="scalarIfRegular">
                     <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
                     <span class="scalarValueWrapper">
-                        <span class="entityLink">
-                            <div class="entityLinkSelect2Panel entityLinkComponentType">
-                                <div class="wrapper">
-                                    <span class="autoCompletePlaceholder">
-                                        <span wicket:id="entityLink">link or drop down</span>
-                                        <span wicket:id="entityIconAndTitle">[icon and title]</span>
+                        <div class="scalarPlaceholder entityLinkSelect2Panel entityLinkComponentType">
+                            <span class="entityLink wrapper">
+                                <span class="scalarValueInput">
+                                    <span class="editing">
+                                        <span class="autoCompletePlaceholder">
+                                            <span wicket:id="entityLink">link or drop down</span>
+                                            <span wicket:id="entityIconAndTitle">[icon and title]</span>
+                                        </span>
+                                        <span wicket:id="entityTitleIfNull">(none)</span>
+                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
                                     </span>
-                                    <span class="clearfix"></span>
-                                </div>
-                                <span wicket:id="entityTitleIfNull">(none)</span>
-                            </div>
-                        </span>
+                                </span>
+                            </span>
+                        </div>
                         <span wicket:id="feedback" class="help-block"></span>
                         <span wicket:id="associatedActionLinksBelow"></span>
                     </span>
-                    <span wicket:id="associatedActionLinksRight"></span>
+                    <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+                    <div class="clearfix"/>
                 </div>
                 <div wicket:id="scalarIfCompact" class="scalarIfCompact">
                     <div class="scalarValue">

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/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 1ff6bfc..dd0c68d 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
@@ -17,6 +17,8 @@
 
 package org.apache.isis.viewer.wicket.ui.components.widgets.linkandlabel;
 
+import java.util.concurrent.Callable;
+
 import org.apache.wicket.Application;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
@@ -27,6 +29,7 @@ import org.apache.wicket.request.IRequestHandler;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 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.ActionPrompt;
@@ -70,8 +73,15 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
                 else {
                     final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(getPage());
                     final ActionPrompt actionPrompt = promptProvider.getActionPrompt();
-                    ActionPromptHeaderPanel titlePanel = new ActionPromptHeaderPanel(actionPrompt.getTitleId(),
-                            actionModel);
+                    final ActionPromptHeaderPanel titlePanel =
+                            PersistenceSession.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
+                            new Callable<ActionPromptHeaderPanel>() {
+                                @Override
+                                public ActionPromptHeaderPanel call() throws Exception {
+                                    final String titleId = actionPrompt.getTitleId();
+                                    return new ActionPromptHeaderPanel(titleId, actionModel);
+                                }
+                            });
                     final ActionPanel actionPanel =
                             (ActionPanel) getComponentFactoryRegistry().createComponent(
                                     ComponentType.ACTION_PROMPT, actionPrompt.getContentId(), actionModel);

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
index 3270ec5..7971e56 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/valuechoices/ValueChoicesSelect2Panel.html
@@ -27,14 +27,20 @@
             <div class="valueChoicesSelect2Panel scalarNameAndValueComponentType">
                 <div class="form-group" wicket:id="scalarIfRegular">
                     <label wicket:id="scalarName" class="scalarName control-label">[Label text]</label>
-                    <div class="scalarValueWrapper">
-                        <div class="choicesPlaceholder">
-                            <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
+                    <span class="scalarValueWrapper">
+                        <div class="scalarPlaceholder">
+                            <span class="scalarValueInput">
+                                <span class="editing">
+                                    <input wicket:id="scalarValue" type="hidden" class="choices input-sm select2-remote" style="width: 99.8%; padding: 0"/>
+                                        <a wicket:id="editProperty" href="#" class="edit fa fa-pencil-square-o"/>
+                                </span>
+                            </span>
                         </div>
                         <span wicket:id="feedback" class="help-block"></span>
                         <span wicket:id="associatedActionLinksBelow"></span>
-                    </div>
-                    <span wicket:id="associatedActionLinksRight"></span>
+                    </span>
+                    <span wicket:id="associatedActionLinksRight" class="associatedActionLinksRight"></span>
+                    <div class="clearfix"/>
                 </div>
                 <span wicket:id="scalarIfCompact"></span>
             </div>

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-flatly.css
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-flatly.css b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-flatly.css
index 626f843..1830f26 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-flatly.css
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides-flatly.css
@@ -26,3 +26,8 @@
 .select2-container.select2-container-disabled .select2-choices {
     background-color: #ecf0f1;
 }
+
+.list-inline > li {
+    padding-left: 0px;
+    padding-right: 0px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
index f7b9487..4d7458f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/bootstrap-overrides.css
@@ -467,6 +467,7 @@ span .fa {
 
 ul.additionalLinkList,
 div.additionalLinkList {
+    margin-right: -10px;
     padding-bottom: 10px;
 }
 
@@ -539,8 +540,8 @@ div.label-left label.control-label {
 }
 
 div.label-top label.control-label {
-    padding-left: 10px;
-    padding-bottom: 4px;
+    /*padding-left: 10px;*/
+    /*padding-bottom: 4px;*/
 }
 
 div.label-none label.control-label {
@@ -564,10 +565,10 @@ div.label-left.actions-right .scalarValueWrapper {
 
 div.label-top .scalarValueWrapper,
 div.label-none .scalarValueWrapper {
-    width: 99.5%;
+    /*width: 99.5%;*/
     display: block;
-    padding-left: 8px;
-    padding-right: 20px;
+    /*padding-left: 8px;*/
+    /*padding-right: 20px;*/
 }
 
 .modal-body div.label-top .scalarValueWrapper,
@@ -680,12 +681,17 @@ div.referencePanel.scalarNameAndValueComponentType {
 }
 
 .additionalLinks.pull-right {
-    margin-right: 5px;
+    /*margin-right: 5px;*/
 }
 
 .additionalLinks.pull-right div {
     display: inline-block;
-    margin-left: 5px;
+    /*margin-left: 5px;*/
+}
+
+.additionalLinks.pull-right div .additionalLinkListDropDown {
+    margin-left: 10px;
+    margin-right: 0px;
 }
 
 
@@ -774,3 +780,18 @@ tr.headers th form input {
 .propertyEditForm .additionalLinkList {
     display: none;
 }
+
+.choicesScalarValue {
+    width: 95%;
+    display: inline-block;
+}
+
+.associatedActionLinksRight .additionalLinkListDropDown {
+    padding-right: 10px;
+}
+
+.editing .edit {
+    padding-top: 2px;
+    float: right;
+    margin-bottom: 10px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/5c2b07de/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index 89c6a88..26ab321 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -142,13 +142,16 @@ public class EntityPage extends PageAbstract {
             // the facet should always exist, in fact
             // just enough to ask for the metadata.
             // This will cause the current ObjectSpec to be updated as a side effect.
-            final Grid grid = facet.getGrid();
-//
-//            // if none, then fallback to invalidating entire cache
-//            // (this is the original LayoutMetadataFromJson behaviour)
-//            if(grid == null && !getDeploymentType().isProduction()) {
-//                getSpecificationLoader().invalidateCacheFor(objectAdapter.getObject());
-//            }
+
+            // if none, then fallback to invalidating entire cache
+            // (this is the original LayoutMetadataFromJson behaviour)
+            if(!getDeploymentType().isProduction()) {
+                getSpecificationLoader().invalidateCacheFor(objectAdapter.getObject());
+            }
+
+            // as a side-effect, this will update facets
+            final Grid unused = facet.getGrid();
+
         }