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/15 09:54:19 UTC

[2/2] isis git commit: ISIS-993: better derivation of default grid from existing metadata when none is available.

ISIS-993: better derivation of default grid from existing metadata when none is available.

Also:
- allow actions to be associated in @MemberOrder#name with fieldset ids; wire up to first property within that fieldset
- associate the (framework-provided downloadLayoutXml and downloadJdoMetadata actions with "metadata" fieldset.
- some fixes for CSS for dropdowns


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

Branch: refs/heads/ISIS-993
Commit: 697bcdbc59341a10f4bb6f645bb3c856ab6226fc
Parents: 2bde2a1
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Feb 15 08:54:05 2016 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Feb 15 08:54:05 2016 +0000

----------------------------------------------------------------------
 .../layout/Object_downloadLayoutXml.java        |  5 +-
 .../facets/object/grid/GridFacetDefault.java    |  3 +-
 .../bootstrap3/GridNormalizerServiceBS3.java    | 73 +++++++++++++++-----
 .../Persistable_downloadJdoMetadata.java        |  5 +-
 .../wicket/ui/pages/bootstrap-overrides.css     |  9 +++
 5 files changed, 72 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/697bcdbc/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
index 3679e0a..eee95b0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/layout/Object_downloadLayoutXml.java
@@ -49,9 +49,10 @@ public class Object_downloadLayoutXml {
             restrictTo = RestrictTo.PROTOTYPING
     )
     @ActionLayout(
-            cssClassFa = "fa-download"
+            cssClassFa = "fa-download",
+            position = ActionLayout.Position.PANEL_DROPDOWN
     )
-    @MemberOrder(sequence = "550.1")
+    @MemberOrder(name = "Metadata", sequence = "550.1")
     public Object $$(
             @ParameterLayout(named = "File name")
             final String fileName,

http://git-wip-us.apache.org/repos/asf/isis/blob/697bcdbc/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 9cdabb5..e02efde 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
@@ -150,8 +150,9 @@ public class GridFacetDefault
             final List<String> leftMemberGroups = memberGroupNames;
             for (String memberGroup : leftMemberGroups) {
                 final FieldSet fieldSet = new FieldSet();
-                fieldSet.setId(memberGroup); // to bind to later via @MemberOrder#name()
                 fieldSet.setName(memberGroup);
+                // fieldSet's id will be derived from the name later
+                // during normalization phase.
                 if(unreferencedProperties && col.getFieldSets().isEmpty()) {
                     fieldSet.setUnreferencedProperties(true);
                 }

http://git-wip-us.apache.org/repos/asf/isis/blob/697bcdbc/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 1cb65c9..d5aed0c 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
@@ -26,11 +26,13 @@ import javax.annotation.Nullable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
+import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.layout.component.ActionLayoutData;
@@ -71,7 +73,8 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
             final Grid grid,
             final Map<String, OneToOneAssociation> oneToOneAssociationById,
             final Map<String, OneToManyAssociation> oneToManyAssociationById,
-            final Map<String, ObjectAction> objectActionById, final ObjectSpecification objectSpec) {
+            final Map<String, ObjectAction> objectActionById,
+            final ObjectSpecification objectSpec) {
 
         final BS3Grid bs3Grid = (BS3Grid) grid;
 
@@ -83,6 +86,7 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
         // find all row and col ids
         // ensure that all Ids are different
 
+        final List<String> gridIds = Lists.newArrayList();
         final LinkedHashMap<String, BS3Row> rowIds = Maps.newLinkedHashMap();
         final LinkedHashMap<String, BS3Col> colIds = Maps.newLinkedHashMap();
         final LinkedHashMap<String, FieldSet> fieldSetIds = Maps.newLinkedHashMap();
@@ -96,12 +100,13 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
                 if(id == null) {
                     return;
                 }
-                if(rowIds.containsKey(id) || colIds.containsKey(id)) {
-                    bs3Row.setMetadataError("There is another col with this id");
+                if(gridIds.contains(id)) {
+                    bs3Row.setMetadataError("There is another element in the grid with this id");
                     duplicateIdDetected.set(true);
                     return;
                 }
                 rowIds.put(id, bs3Row);
+                gridIds.add(id);
             }
 
             @Override
@@ -110,26 +115,29 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
                 if(id == null) {
                     return;
                 }
-                if(rowIds.containsKey(id) || colIds.containsKey(id)) {
-                    bs3Col.setMetadataError("There is another col with this id");
+                if(gridIds.contains(id)) {
+                    bs3Col.setMetadataError("There is another element in the grid with this id");
                     duplicateIdDetected.set(true);
                     return;
                 }
                 colIds.put(id, bs3Col);
+                gridIds.add(id);
             }
 
             @Override
             public void visit(final FieldSet fieldSet) {
-                final String id = fieldSet.getId();
+                String id = fieldSet.getId();
                 if(id == null) {
-                    return;
+                    final String name = fieldSet.getName();
+                    fieldSet.setId(id = asId(name));
                 }
-                if(rowIds.containsKey(id) || fieldSetIds.containsKey(id)) {
-                    fieldSet.setMetadataError("There is another fieldset with this id");
+                if(gridIds.contains(id)) {
+                    fieldSet.setMetadataError("There is another element in the grid with this id");
                     duplicateIdDetected.set(true);
                     return;
                 }
                 fieldSetIds.put(id, fieldSet);
+                gridIds.add(id);
             }
         });
 
@@ -231,20 +239,19 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
             propertyIds.get(surplusPropertyId).setMetadataError("No such property");
         }
 
+        final Map<String, List<OneToOneAssociation>> boundAssociationsByFieldSetId = Maps.newHashMap();
         if(!missingPropertyIds.isEmpty()) {
-            final Map<String, List<OneToOneAssociation>> boundAssociationsByFieldSetId = Maps.newHashMap();
             final List<String> unboundPropertyIds = Lists.newArrayList(missingPropertyIds);
             for (String missingPropertyId : missingPropertyIds) {
                 final OneToOneAssociation otoa = oneToOneAssociationById.get(missingPropertyId);
                 final MemberOrderFacet memberOrderFacet = otoa.getFacet(MemberOrderFacet.class);
                 if(memberOrderFacet != null) {
-                    final String name = memberOrderFacet.name();
-                    if(fieldSetIds.containsKey(name)) {
-                        List<OneToOneAssociation> boundAssociations =
-                                boundAssociationsByFieldSetId.get(name);
+                    final String id = asId(memberOrderFacet.name());
+                    if(fieldSetIds.containsKey(id)) {
+                        List<OneToOneAssociation> boundAssociations = boundAssociationsByFieldSetId.get(id);
                         if(boundAssociations == null) {
                             boundAssociations = Lists.newArrayList();
-                            boundAssociationsByFieldSetId.put(name, boundAssociations);
+                            boundAssociationsByFieldSetId.put(id, boundAssociations);
                         }
                         boundAssociations.add(otoa);
                         unboundPropertyIds.remove(missingPropertyId);
@@ -316,7 +323,8 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
         final List<String> missingActionIds =
                 FluentIterable.from(actionIdTuple.second)
                         .filter(new Predicate<String>() {
-                            @Override public boolean apply(@Nullable final String actionId) {
+                            @Override
+                            public boolean apply(final String actionId) {
                                 final ObjectAction oa = objectActionById.get(actionId);
                                 final MemberOrderFacet memberOrderFacet = oa.getFacet(MemberOrderFacet.class);
                                 if(memberOrderFacet == null) {
@@ -326,8 +334,29 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
                                 if (memberOrderName == null) {
                                     return true;
                                 }
-                                return  !oneToOneAssociationById.containsKey(memberOrderName) &&
-                                        !oneToManyAssociationById.containsKey(memberOrderName);
+                                final String id = asId(memberOrderName);
+                                if (oneToOneAssociationById.containsKey(id)) {
+                                    return false;
+                                }
+                                if (oneToManyAssociationById.containsKey(id)) {
+                                    return false;
+                                }
+                                // if the @MemberOrder references a field set, then don't mark it as missing, but
+                                // instead explicitly add it to the list of actions of that fieldset.
+                                // (note we only do this provided we already know that
+                                // there is at least one property for said fieldset)
+                                if(boundAssociationsByFieldSetId.containsKey(id)) {
+                                    final List<OneToOneAssociation> oneToOneAssociations =
+                                            boundAssociationsByFieldSetId.get(id);
+                                    if(!oneToOneAssociations.isEmpty()) {
+                                        final ActionLayoutData actionLayoutData = new ActionLayoutData(actionId);
+                                        actionLayoutData.setPosition(ActionLayout.Position.PANEL_DROPDOWN);
+                                        fieldSetIds.get(id).getActions().add(actionLayoutData);
+                                    }
+                                    return false;
+                                }
+                                // is missing after all.
+                                return true;
                             }
                         })
                         .toList();
@@ -351,6 +380,14 @@ public class GridNormalizerServiceBS3 extends GridNormalizerServiceAbstract<BS3G
         return true;
     }
 
+    static String asId(final String str) {
+        if(Strings.isNullOrEmpty(str)) {
+            return str;
+        }
+        final char c = str.charAt(0);
+        return Character.toLowerCase(c) + str.substring(1).replaceAll("\\s+", "");
+    }
+
     private static Comparator<ObjectAssociation> byMemberOrderSequence() {
         return new Comparator<ObjectAssociation>() {
             private final DeweyOrderComparator deweyOrderComparator = new DeweyOrderComparator();

http://git-wip-us.apache.org/repos/asf/isis/blob/697bcdbc/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
index ffa1368..d0b136f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/jdosupport/Persistable_downloadJdoMetadata.java
@@ -52,9 +52,10 @@ public class Persistable_downloadJdoMetadata {
             restrictTo = RestrictTo.PROTOTYPING
     )
     @ActionLayout(
-            cssClassFa = "fa-download"
+            cssClassFa = "fa-download",
+            position = ActionLayout.Position.PANEL_DROPDOWN
     )
-    @MemberOrder(sequence = "800.1")
+    @MemberOrder(name = "Metadata", sequence = "800.1")
     public Clob $$(
             @ParameterLayout(named = ".jdo file name")
             final String fileName) throws JAXBException, IOException {

http://git-wip-us.apache.org/repos/asf/isis/blob/697bcdbc/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 5df7fcb..83954d7 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
@@ -365,6 +365,7 @@ div.entityHeaderPanel .iconAndTitle{
 
 div.entityHeaderPanel .iconAndTitleLabel {
     float: left;
+    margin-bottom: 10px;
 }
 
 div.entityHeaderPanel .entityActions .cssMenuPanel .cssMenuItems:first-child {
@@ -756,4 +757,12 @@ tr.headers th form input {
 
 .tabbable {
     padding-bottom: 10px;
+}
+
+.additionalLinkListDropDown ul.dropdown-menu li.additionalLinkItem {
+    width: 100%;
+}
+.additionalLinkListDropDown ul.dropdown-menu {
+    padding-top: 0%;
+    padding-bottom: 0%;
 }
\ No newline at end of file