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 2013/04/16 21:21:53 UTC

git commit: ISIS-385: disables action buttons by collections

Updated Branches:
  refs/heads/master 905f8d2db -> 02fe0e304


ISIS-385: disables action buttons by collections


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

Branch: refs/heads/master
Commit: 02fe0e304fde18d67dc8af425fc0cfc892f87049
Parents: 905f8d2
Author: Dan Haywood <da...@apache.org>
Authored: Tue Apr 16 20:21:08 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Apr 16 20:21:08 2013 +0100

----------------------------------------------------------------------
 .../viewer/wicket/model/links/LinkAndLabel.java    |    8 ++-
 .../wicket/model/models/EntityCollectionModel.java |   19 ++++-
 .../cssmenu/AppActionsCssMenuLinkFactory.java      |    2 +-
 .../ui/components/collection/CollectionPanel.java  |    4 +-
 .../ajaxtable/BulkActionsLinkFactory.java          |    2 +-
 .../CollectionContentsAsAjaxTablePanel.java        |    3 +-
 .../components/entity/EntityActionLinkFactory.java |   29 ++++++-
 .../entity/header/EntityHeaderPanel.java           |    9 ++-
 .../ui/components/widgets/cssmenu/CssMenuItem.java |    5 +-
 .../ui/components/widgets/cssmenu/CssMenuPanel.css |   70 +++++++++------
 .../selector/links/LinksSelectorPanelAbstract.java |    4 +
 .../ui/selector/links/images/icon_calendar_off.png |  Bin 297 -> 0 bytes
 .../ui/selector/links/images/icon_calendar_on.png  |  Bin 280 -> 0 bytes
 .../dom/src/main/java/dom/todo/ToDoItem.java       |    9 ++
 .../quickstart_wicket_restful_jdo/pom.xml          |   43 ++++++----
 .../viewer-webapp/pom.xml                          |    7 ++
 16 files changed, 154 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
index ee15855..e037774 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/links/LinkAndLabel.java
@@ -28,10 +28,12 @@ public class LinkAndLabel implements Serializable {
     
     private final AbstractLink link;
     private final String label;
+    private final String disabledReasonIfAny;
 
-    public LinkAndLabel(final AbstractLink link, final String label) {
+    public LinkAndLabel(final AbstractLink link, final String label, String disabledReasonIfAny) {
         this.link = link;
         this.label = label;
+        this.disabledReasonIfAny = disabledReasonIfAny;
     }
 
     public AbstractLink getLink() {
@@ -41,4 +43,8 @@ public class LinkAndLabel implements Serializable {
     public String getLabel() {
         return label;
     }
+ 
+    public String getDisabledReasonIfAny() {
+        return disabledReasonIfAny;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 5b28090..59dc791 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -31,6 +31,7 @@ import org.apache.wicket.Component;
 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.object.paged.PagedFacet;
+import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -77,6 +78,12 @@ public class EntityCollectionModel extends ModelAbstract<List<ObjectAdapter>> im
                 entityCollectionModel.mementoList = Lists.newArrayList(Lists.transform(list, ObjectAdapters.toMemento()));
             }
 
+            @Override
+            public String getName(EntityCollectionModel model) {
+                PluralFacet facet = model.getTypeOfSpecification().getFacet(PluralFacet.class);
+                return facet.value();
+            }
+
         },
         /**
          * A collection of an entity (eg Order/OrderDetail).
@@ -106,11 +113,18 @@ public class EntityCollectionModel extends ModelAbstract<List<ObjectAdapter>> im
                 // no-op
                 throw new UnsupportedOperationException();
             }
+
+            @Override
+            public String getName(EntityCollectionModel model) {
+                return model.getCollectionMemento().getName();
+            }
         };
 
         abstract List<ObjectAdapter> load(EntityCollectionModel entityCollectionModel);
 
         abstract void setObject(EntityCollectionModel entityCollectionModel, List<ObjectAdapter> list);
+
+        public abstract String getName(EntityCollectionModel entityCollectionModel);
     }
 
     /**
@@ -222,10 +236,11 @@ public class EntityCollectionModel extends ModelAbstract<List<ObjectAdapter>> im
      * {@link #isParented() is parented}.)
      * 
      * <p>
-     * Will returns <tt>null</tt> otherwise.
+     * If {@link #isStandalone()}, returns the {@link PluralFacet} of the {@link #getTypeOfSpecification() specification}
+     * (eg 'Customers').
      */
     public String getName() {
-        return getCollectionMemento().getName();
+        return type.getName(this);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
index 754f6a5..01c339c 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/appactions/cssmenu/AppActionsCssMenuLinkFactory.java
@@ -49,7 +49,7 @@ class AppActionsCssMenuLinkFactory implements CssMenuLinkFactory {
         final AbstractLink link = Links.newBookmarkablePageLink(linkId, pageParameters, pageClass);
         final String actionLabel = ObjectActions.nameFor(action);
 
-        return new LinkAndLabel(link, actionLabel);
+        return new LinkAndLabel(link, actionLabel, null);
     }
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/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 6823de1..b1487e8 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
@@ -88,8 +88,8 @@ public class CollectionPanel extends PanelAbstract<EntityCollectionModel> {
         return Lists.transform(userActions, new Function<ObjectAction, LinkAndLabel>(){
 
             @Override
-            public LinkAndLabel apply(ObjectAction arg0) {
-                return linkFactory.newLink(adapterMemento, arg0, LinksSelectorPanelAbstract.ID_ADDITIONAL_LINK);
+            public LinkAndLabel apply(ObjectAction objectAction) {
+                return linkFactory.newLink(adapterMemento, objectAction, LinksSelectorPanelAbstract.ID_ADDITIONAL_LINK);
             }});
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
index b35698e..0f28bab 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/BulkActionsLinkFactory.java
@@ -100,6 +100,6 @@ final class BulkActionsLinkFactory implements CssMenuLinkFactory {
             }
         };
         link.add(new JGrowlBehaviour());
-        return new LinkAndLabel(link, objectAction.getName());
+        return new LinkAndLabel(link, objectAction.getName(), null);
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 1156a09..638dc2e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -50,7 +50,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociationFilters;
 import org.apache.isis.viewer.wicket.model.common.SelectionHandler;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel.RenderingHint;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ColumnAbstract;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterPropertyColumn;
 import org.apache.isis.viewer.wicket.ui.components.collectioncontents.ajaxtable.columns.ObjectAdapterSelectColumn;
@@ -182,7 +181,7 @@ public class CollectionContentsAsAjaxTablePanel extends PanelAbstract<EntityColl
         }
     }
 
-    Filter<ObjectAssociation> associationDoesNotReferenceParent(final ObjectSpecification parentSpec) {
+    static Filter<ObjectAssociation> associationDoesNotReferenceParent(final ObjectSpecification parentSpec) {
         if(parentSpec == null) {
             return Filters.any();
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
index 6f5c4b1..4522efe 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityActionLinkFactory.java
@@ -20,13 +20,18 @@
 package org.apache.isis.viewer.wicket.ui.components.entity;
 
 import org.apache.wicket.Application;
+import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Page;
 import org.apache.wicket.markup.html.link.AbstractLink;
 import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.Model;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
+import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.runtime.system.context.IsisContext;
@@ -61,9 +66,24 @@ public final class EntityActionLinkFactory implements CssMenuLinkFactory {
         final ObjectAdapter adapter = adapterMemento.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
 
         final AbstractLink link = createLink(adapterMemento, action, linkId, adapter);
+        //action
         final String label = ObjectActions.nameFor(action);
 
-        return new LinkAndLabel(link, label);
+        // check visibility and whether enabled
+        final AuthenticationSession session = getAuthenticationSession();
+
+        final Consent visibility = action.isVisible(session, adapter, Where.OBJECT_FORMS);
+        if (visibility.isVetoed()) {
+            return null;
+        }
+
+        final Consent usability = action.isUsable(session, adapter, Where.OBJECT_FORMS);
+        final String disabledReasonIfAny = usability.getReason();
+        if(disabledReasonIfAny != null) {
+            link.setEnabled(false);
+        }
+
+        return new LinkAndLabel(link, label, disabledReasonIfAny);
     }
 
     private AbstractLink createLink(final ObjectAdapterMemento adapterMemento, final ObjectAction action, final String linkId, final ObjectAdapter adapter) {
@@ -105,14 +125,17 @@ public final class EntityActionLinkFactory implements CssMenuLinkFactory {
     // Dependencies (from IsisContext)
     // ///////////////////////////////////////////////////////////////////
 
-    public IsisContext getIsisContext() {
+    protected IsisContext getIsisContext() {
         return IsisContext.getInstance();
     }
 
-    public PersistenceSession getPersistenceSession() {
+    protected PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 
+    protected AuthenticationSession getAuthenticationSession() {
+        return IsisContext.getAuthenticationSession();
+    }
 
     // ///////////////////////////////////////////////////////////////////
     // Convenience

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
index f437c0a..326a24b 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/header/EntityHeaderPanel.java
@@ -39,6 +39,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectActionContainer.Contrib
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionFilters;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActions;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
@@ -108,7 +109,6 @@ public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements Act
 
             if(!topLevelActions.isEmpty()) {
                 final CssMenuBuilder cssMenuBuilder = new CssMenuBuilder(adapterMemento, getServiceAdapters(), topLevelActions, linkFactory);
-                // TODO: i18n
                 final CssMenuPanel cssMenuPanel = cssMenuBuilder.buildPanel(ID_ENTITY_ACTIONS, "Actions");
 
                 this.addOrReplace(cssMenuPanel);
@@ -124,7 +124,7 @@ public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements Act
         final List<ObjectAction> topLevelActions = Lists.newArrayList();
         
         addTopLevelActions(adapter, ActionType.USER, topLevelActions);
-        if(IsisContext.getDeploymentType().isPrototyping()) {
+        if(getDeploymentType().isPrototyping()) {
             addTopLevelActions(adapter, ActionType.EXPLORATION, topLevelActions);
             addTopLevelActions(adapter, ActionType.PROTOTYPE, topLevelActions);
         }
@@ -192,4 +192,9 @@ public class EntityHeaderPanel extends PanelAbstract<EntityModel> implements Act
     }
 
 
+    protected DeploymentType getDeploymentType() {
+        return IsisContext.getDeploymentType();
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
index 1b2ad97..d4c5148 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuItem.java
@@ -45,6 +45,7 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+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.mementos.ObjectAdapterMemento;
 import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
@@ -290,11 +291,11 @@ public class CssMenuItem implements Serializable {
     }
 
     // //////////////////////////////////////////////////////////////
-    // Build wicket components from the menu item.
+    // dependencies
     // //////////////////////////////////////////////////////////////
 
     protected AuthenticationSession getAuthenticationSession() {
-        return ((AuthenticationSessionProvider) Application.get()).getAuthenticationSession();
+        return IsisContext.getAuthenticationSession();
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
index 94c3a67..abe5df2 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/cssmenu/CssMenuPanel.css
@@ -266,13 +266,11 @@
 	text-decoration: underline;
 }
 
-.entityActions .cssMenuPanel .menuh a:hover,.entityActions .cssMenuPanel .menuh p:hover
-	{
+.entityActions .cssMenuPanel .menuh a:hover,.entityActions .cssMenuPanel .menuh p:hover {
 	color: #000;
 	background-color:#FFFFFF;
 }
 
-
 .additionalLinkList {
 	float:right;
 	margin:0px;
@@ -280,27 +278,45 @@
 	list-style:none;
 }
 
-	.additionalLinkList li {
-		float:left;
-		margin-right:10px;
-	}
-	
-	.additionalLinkList li a {
-	    background-color: #F0EFEA;
-	    border-radius: 4px 4px 4px 4px;
-	    color: #46423C;
-	    display: block;
-	    float: left;
-	    font-size: 0.85em;
-	    font-weight: bold;
-	    height: 30px;
-	    line-height: 30px;
-	    padding: 0 10px;
-	    text-decoration: none;
-	    text-transform: uppercase;
-	}
-	
-	.additionalLinkList li a:hover {
-		background-color:#20B5C2;
-		color:#FFFFFF;
-	}
\ No newline at end of file
+.additionalLinkList li {
+	float:left;
+	margin-right:10px;
+}
+
+.additionalLinkList li em {
+    font-style: normal;
+}
+
+.additionalLinkList li a,
+.additionalLinkList li em {
+    background-color: #F0EFEA;
+    border-radius: 4px 4px 4px 4px;
+    display: block;
+    float: left;
+    font-size: 0.85em;
+    font-weight: bold;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px;
+    text-decoration: none;
+    text-transform: uppercase;
+}
+
+.additionalLinkList li a {
+    color: #46423C;
+}
+
+.additionalLinkList li em {
+    color: grey;
+}
+
+.additionalLinkList li a:hover {
+	background-color:#20B5C2;
+	color:#FFFFFF;
+}
+
+.additionalLinkList li em:hover {
+    color: grey;
+    background-color:#FFFFFF;
+    cursor: default;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
index 050b9be..87e0db1 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/LinksSelectorPanelAbstract.java
@@ -109,6 +109,10 @@ public abstract class LinksSelectorPanelAbstract<T extends IModel<?>> extends Pa
                 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);

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_off.png
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_off.png b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_off.png
deleted file mode 100644
index 5fa3a0e..0000000
Binary files a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_off.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_on.png
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_on.png b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_on.png
deleted file mode 100644
index fd011c4..0000000
Binary files a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/selector/links/images/icon_calendar_on.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index acc0382..42831bb 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -321,6 +321,12 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
         getDependencies().add(toDoItem);
         return this;
     }
+    public String disableAdd(final ToDoItem toDoItem) {
+        if(isComplete()) {
+            return "Cannot add dependencies for items that are complete";
+        }
+        return null;
+    }
     public String validateAdd(final ToDoItem toDoItem) {
         if(getDependencies().contains(toDoItem)) {
             return "Already a dependency";
@@ -339,6 +345,9 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
         return this;
     }
     public String disableRemove(final ToDoItem toDoItem) {
+        if(isComplete()) {
+            return "Cannot remove dependencies for items that are complete";
+        }
         return getDependencies().isEmpty()? "No dependencies to remove": null;
     }
     public String validateRemove(final ToDoItem toDoItem) {

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/example/application/quickstart_wicket_restful_jdo/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/pom.xml b/example/application/quickstart_wicket_restful_jdo/pom.xml
index 229b2d1..5621971 100644
--- a/example/application/quickstart_wicket_restful_jdo/pom.xml
+++ b/example/application/quickstart_wicket_restful_jdo/pom.xml
@@ -114,24 +114,24 @@
                     <version>6.1.25</version>
                 </plugin>
 
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-shade-plugin</artifactId>
-					<version>1.4</version>
-				</plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-shade-plugin</artifactId>
+                    <version>1.4</version>
+                </plugin>
 
-				<plugin>
-					<groupId>org.apache.maven.plugins</groupId>
-					<artifactId>maven-antrun-plugin</artifactId>
-					<version>1.6</version>
-					<executions>
-						<execution>
-					        <goals>
-					          <goal>run</goal>
-					        </goals>
-						</execution>
-					</executions>
-				</plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-antrun-plugin</artifactId>
+                    <version>1.6</version>
+                    <executions>
+                        <execution>
+                            <goals>
+                                <goal>run</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                </plugin>
                 <!-- http://simplericity.com/2009/11/10/1257880778509.html -->
                 <plugin>
                     <groupId>org.simplericity.jettyconsole</groupId>
@@ -344,6 +344,15 @@
             </dependency>
             -->
 
+            <!--
+            EXCEL: uncomment to use https://github.com/danhaywood/isis-wicket-excel
+            <dependency>
+                <groupId>com.danhaywood.isis.wicket.ui.components</groupId>
+                <artifactId>danhaywood-isis-wicket-excel</artifactId>
+                <version>1.0.0-SNAPSHOT</version>
+            </dependency>
+            -->
+
         </dependencies>
     </dependencyManagement>
     

http://git-wip-us.apache.org/repos/asf/isis/blob/02fe0e30/example/application/quickstart_wicket_restful_jdo/viewer-webapp/pom.xml
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/pom.xml b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/pom.xml
index 1e8cf25..ec0809f 100644
--- a/example/application/quickstart_wicket_restful_jdo/viewer-webapp/pom.xml
+++ b/example/application/quickstart_wicket_restful_jdo/viewer-webapp/pom.xml
@@ -297,6 +297,13 @@
             <artifactId>danhaywood-isis-wicket-wickedcharts-summarycharts</artifactId>
         </dependency>
          -->
+        <!-- 
+        EXCEL: uncomment to use https://github.com/danhaywood/isis-wicket-excel
+        <dependency>
+            <groupId>com.danhaywood.isis.wicket.ui.components</groupId>
+            <artifactId>danhaywood-isis-wicket-excel</artifactId>
+        </dependency>
+         -->
          
     </dependencies>