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
