Updated Branches:
  refs/heads/master 38afedd2b -> c3addb515

ISIS-400: render buttons close to properties.


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

Branch: refs/heads/master
Commit: 1fcc80032279f8d5ac20d882a0fdfc1b358f9e23
Parents: 38afedd
Author: Dan Haywood <[email protected]>
Authored: Wed May 8 19:29:50 2013 +0100
Committer: Dan Haywood <[email protected]>
Committed: Wed May 8 19:29:50 2013 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/models/ScalarModel.java    |   28 ++++-
 .../ui/components/collection/CollectionPanel.java  |    7 +-
 .../CollectionContentsLinksSelectorPanel.java      |    4 +-
 .../ui/components/scalars/string/StringPanel.html  |    9 ++
 .../ui/components/scalars/string/StringPanel.java  |  108 +++++++++++++++
 .../isis/viewer/wicket/ui/pages/PageAbstract.css   |    8 +
 .../src/main/webapp/WEB-INF/isis.properties        |    2 +-
 7 files changed, 159 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/1fcc8003/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
 
b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 8491aea..4dded9d 100644
--- 
a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ 
b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -23,6 +23,8 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import com.google.common.collect.Lists;
+
 import org.apache.wicket.Session;
 
 import org.apache.isis.applib.annotation.Where;
@@ -43,6 +45,8 @@ import 
org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import 
org.apache.isis.core.progmodel.facets.value.bigdecimal.BigDecimalValueFacet;
 import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.links.LinksProvider;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
@@ -57,7 +61,7 @@ import org.apache.isis.viewer.wicket.model.util.ClassLoaders;
  * Is the backing model to each of the fields that appear in forms (for 
entities
  * or action dialogs).
  */
-public class ScalarModel extends EntityModel {
+public class ScalarModel extends EntityModel implements LinksProvider {
 
     private static final long serialVersionUID = 1L;
 
@@ -346,8 +350,9 @@ public class ScalarModel extends EntityModel {
     }
 
     private final Kind kind;
+    
     private final ObjectAdapterMemento parentObjectAdapterMemento;
-
+    
 
     /**
      * Populated only if {@link #getKind()} is {@link Kind#PARAMETER}
@@ -391,6 +396,10 @@ public class ScalarModel extends EntityModel {
         setMode(Mode.VIEW);
     }
 
+    public ObjectAdapterMemento getParentObjectAdapterMemento() {
+        return parentObjectAdapterMemento;
+    }
+
     protected void setObject(final ObjectAdapterMemento 
parentObjectAdapterMemento) {
         final OneToOneAssociation property = propertyMemento.getProperty();
         final ObjectAdapter associatedAdapter = 
property.get(parentObjectAdapterMemento.getObjectAdapter(ConcurrencyChecking.CHECK));
@@ -530,4 +539,19 @@ public class ScalarModel extends EntityModel {
         return kind.getLength(this);
     }
 
+    /**
+     * Additional links to render (if any)
+     */
+    private List<LinkAndLabel> entityActions = Lists.newArrayList();
+
+    public void addEntityActions(List<LinkAndLabel> entityActions) {
+        this.entityActions.addAll(entityActions);
+    }
+
+    @Override
+    public List<LinkAndLabel> getLinks() {
+        return Collections.unmodifiableList(entityActions);
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1fcc8003/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
index b1487e8..56bf437 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
@@ -74,14 +74,15 @@ public class CollectionPanel extends 
PanelAbstract<EntityCollectionModel> {
         return collectionModel;
     }
 
-    private static List<LinkAndLabel> entityActions(EntityModel entityModel, 
OneToManyAssociation otma) {
+    // TODO: move to a utility class, since also called outside this class...
+    public static List<LinkAndLabel> entityActions(EntityModel entityModel, 
ObjectAssociation association) {
         final ObjectSpecification adapterSpec = 
entityModel.getTypeOfSpecification();
         final ObjectAdapter adapter = entityModel.getObject();
         final ObjectAdapterMemento adapterMemento = 
entityModel.getObjectAdapterMemento();
         
         @SuppressWarnings("unchecked")
         final List<ObjectAction> userActions = 
adapterSpec.getObjectActions(ActionType.USER, Contributed.INCLUDED,
-                Filters.and(memberOrderOf(otma), 
dynamicallyVisibleFor(adapter)));
+                Filters.and(memberOrderOf(association), 
dynamicallyVisibleFor(adapter)));
         
         final CssMenuLinkFactory linkFactory = new 
EntityActionLinkFactory(entityModel);
 
@@ -93,12 +94,14 @@ public class CollectionPanel extends 
PanelAbstract<EntityCollectionModel> {
             }});
     }
 
+    // TODO: move to a utility class, since also called outside this class...
     private static Filter<ObjectAction> dynamicallyVisibleFor(final 
ObjectAdapter adapter) {
         final AuthenticationSessionProvider asa = 
(AuthenticationSessionProvider) Session.get();
         AuthenticationSession authSession = asa.getAuthenticationSession();
         return ObjectActionFilters.dynamicallyVisible(authSession, adapter, 
Where.ANYWHERE);
     }
 
+    // TODO: move to a utility class, since also called outside this class...
     private static Filter<ObjectAction> memberOrderOf(ObjectAssociation 
association) {
         final String collectionName = association.getName();
         final String collectionId = association.getId();

http://git-wip-us.apache.org/repos/asf/isis/blob/1fcc8003/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/links/CollectionContentsLinksSelectorPanel.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/links/CollectionContentsLinksSelectorPanel.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/links/CollectionContentsLinksSelectorPanel.java
index 68db3bf..f45e307 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/links/CollectionContentsLinksSelectorPanel.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/selector/links/CollectionContentsLinksSelectorPanel.java
@@ -116,8 +116,8 @@ public class CollectionContentsLinksSelectorPanel extends 
LinksSelectorPanelAbst
 
         final OneToManyAssociation collection = 
                 entityCollectionModel.getCollectionMemento().getCollection();
-        RenderFacet resolveFacet = collection.getFacet(RenderFacet.class);
-        return resolveFacet != null && resolveFacet.value() == Type.EAGERLY;
+        RenderFacet renderFacet = collection.getFacet(RenderFacet.class);
+        return renderFacet != null && renderFacet.value() == Type.EAGERLY;
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/1fcc8003/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.html
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.html
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.html
index fa4e227..4fe408b 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.html
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.html
@@ -31,6 +31,15 @@
                                <span class="scalarValue">
                                        <input type="text" name="scalarValue" 
wicket:id="scalarValue" />
                                        <span wicket:id="feedback"></span>
+                        <span wicket:id="additionalLinks" 
class="additionalLinks">
+                            <ul wicket:id="additionalLinkList" 
class="additionalLinkList">
+                                <li wicket:id="additionalLinkItem" 
class="additionalLinkItem">
+                                    <a href="#" wicket:id="additionalLink">
+                                        <span wicket:id="additionalLinkTitle" 
class="additionalLinkItem">[link title]</span>
+                                    </a>
+                                </li>
+                            </ul>
+                        </span>
                                </span>
                                </label>
                                <label wicket:id="scalarIfCompact"></label>

http://git-wip-us.apache.org/repos/asf/isis/blob/1fcc8003/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.java
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.java
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.java
index 212f550..bc25b2c 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.java
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/StringPanel.java
@@ -19,8 +19,48 @@
 
 package org.apache.isis.viewer.wicket.ui.components.scalars.string;
 
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.Session;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.FormComponentLabel;
+import org.apache.wicket.markup.html.link.AbstractLink;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.filter.Filter;
+import org.apache.isis.applib.filter.Filters;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import 
org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.commons.lang.StringUtils;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import 
org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
+import org.apache.isis.core.metamodel.spec.ActionType;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
+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.ObjectActionContainer.Contributed;
+import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
+import org.apache.isis.viewer.wicket.model.links.LinksProvider;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+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.collection.CollectionPanel;
+import 
org.apache.isis.viewer.wicket.ui.components.entity.EntityActionLinkFactory;
 import 
org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldParseableAbstract;
+import 
org.apache.isis.viewer.wicket.ui.components.widgets.cssmenu.CssMenuLinkFactory;
+import 
org.apache.isis.viewer.wicket.ui.selector.links.LinksSelectorPanelAbstract;
+import org.apache.isis.viewer.wicket.ui.util.CssClassAppender;
 
 /**
  * Panel for rendering scalars of type {@link String}.
@@ -30,13 +70,81 @@ public class StringPanel extends 
ScalarPanelTextFieldParseableAbstract {
     private static final long serialVersionUID = 1L;
     private static final String ID_SCALAR_VALUE = "scalarValue";
 
+    private static final String ID_ADDITIONAL_LINKS = "additionalLinks";
+    private static final String ID_ADDITIONAL_LINK_LIST = "additionalLinkList";
+    public static final String ID_ADDITIONAL_LINK = "additionalLink";
+    private static final String ID_ADDITIONAL_LINK_ITEM = "additionalLinkItem";
+    private static final String ID_ADDITIONAL_LINK_TITLE = 
"additionalLinkTitle";
+    
     public StringPanel(final String id, final ScalarModel scalarModel) {
         super(id, ID_SCALAR_VALUE, scalarModel);
     }
 
+    
+
     @Override
     protected void addSemantics() {
         super.addSemantics();
     }
     
+    @Override
+    protected FormComponentLabel addComponentForRegular() {
+        final FormComponentLabel fcl = super.addComponentForRegular();
+
+        final List<LinkAndLabel> entityActions;
+        if(scalarModel.getKind() == ScalarModel.Kind.PROPERTY) {
+            final ObjectAdapterMemento parentMemento = 
scalarModel.getParentObjectAdapterMemento();
+            final EntityModel parentEntityModel = new 
EntityModel(parentMemento);
+            entityActions = CollectionPanel.entityActions(parentEntityModel, 
scalarModel.getPropertyMemento().getProperty());
+        } else {
+            entityActions = null;
+        }
+        addAdditionalLinks(fcl, entityActions);
+
+        return fcl;
+    }
+    
+    protected void addAdditionalLinks(FormComponentLabel fcl, 
List<LinkAndLabel> links) {
+        if(links == null || links.isEmpty()) {
+            permanentlyHide(ID_ADDITIONAL_LINKS);
+            return;
+        }
+        links = Lists.newArrayList(links); // copy, to serialize any lazy 
evaluation
+        
+        final WebMarkupContainer views = new 
WebMarkupContainer(ID_ADDITIONAL_LINKS);
+        
+        final WebMarkupContainer container = new 
WebMarkupContainer(ID_ADDITIONAL_LINK_LIST);
+        
+        views.addOrReplace(container);
+        views.setOutputMarkupId(true);
+        
+        this.setOutputMarkupId(true);
+        
+        final ListView<LinkAndLabel> listView = new 
ListView<LinkAndLabel>(ID_ADDITIONAL_LINK_ITEM, links) {
+
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            protected void populateItem(ListItem<LinkAndLabel> item) {
+                final LinkAndLabel linkAndLabel = item.getModelObject();
+                
+                final AbstractLink link = linkAndLabel.getLink();
+                        
+                Label viewTitleLabel = new Label(ID_ADDITIONAL_LINK_TITLE, 
linkAndLabel.getLabel());
+                String disabledReasonIfAny = 
linkAndLabel.getDisabledReasonIfAny();
+                if(disabledReasonIfAny != null) {
+                    viewTitleLabel.add(new AttributeAppender("title", 
disabledReasonIfAny));
+                }
+                viewTitleLabel.add(new 
CssClassAppender(StringUtils.toLowerDashed(linkAndLabel.getLabel())));
+                link.addOrReplace(viewTitleLabel);
+                item.addOrReplace(link);
+            }
+        };
+        container.addOrReplace(listView);
+        //addOrReplace(views);
+        
+        fcl.addOrReplace(views);
+    }
+
+    
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/1fcc8003/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
----------------------------------------------------------------------
diff --git 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
index 458d301..2183ec4 100644
--- 
a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
+++ 
b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.css
@@ -819,3 +819,11 @@ div#jGrowl div.jGrowl-closer {
     display: block;
     margin-top: 7em;
 } 
+
+
+/* action buttons in properties */
+
+.properties .property .additionalLinkList {
+    float:none;
+    margin-top: 10px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/1fcc8003/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git 
a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
 
b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
index 8f5a51d..a623430 100644
--- 
a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
+++ 
b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/src/main/webapp/WEB-INF/isis.properties
@@ -165,7 +165,7 @@ isis.services = objstore.jdo.todo.ToDoItemsJdo,\
                 org.apache.isis.objectstore.jdo.service.RegisterEntities,\
                 
org.apache.isis.objectstore.jdo.applib.service.exceprecog.ExceptionRecognizerCompositeForJdoObjectStore,\
                 
org.apache.isis.viewer.restfulobjects.rendering.eventserializer.RestfulObjectsSpecEventSerializer,\
-                org.apache.isis.applib.services.audit.AuditingService$Stdout,\
+                org.apache.isis.applib.services.audit.AuditingService$Stderr,\
                 
org.apache.isis.applib.services.publish.PublishingService$Stderr
                 
#org.apache.isis.objectstore.jdo.applib.service.audit.AuditingServiceJdo,\
                 
#org.apache.isis.objectstore.jdo.applib.service.publish.PublishingServiceJdo

Reply via email to