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 2019/01/11 10:16:49 UTC

[isis] 01/03: Merge branch 'master' into v2

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 8d31dc7983b4b7238edb5fe9c64761e8df6accfa
Merge: 14ac71b 26c2e61
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Jan 11 09:49:32 2019 +0000

    Merge branch 'master' into v2

 .../rgant/_rgant-ActionLayout_promptStyle.adoc     |  9 +++++++-
 .../ugvw/_ugvw_configuration-properties.adoc       | 11 ++++++++--
 .../mixins/layout/Object_rebuildMetamodel.java     |  2 +-
 .../PromptStyleFacetForActionLayoutAnnotation.java |  2 ++
 ...romptStyleFacetForPropertyLayoutAnnotation.java |  2 ++
 .../propertylayout/PropertyLayoutFacetFactory.java |  8 +++++++
 .../viewer/wicket/model/models/ActionModel.java    |  8 +++++++
 .../wicket/model/models/ActionPromptProvider.java  |  5 ++++-
 .../components/scalars/ScalarPanelAbstract2.java   | 10 ++++++++-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  9 +++++++-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  | 25 ++++++++++++++++------
 .../application/manifest/menubars.layout.xml       |  6 +++---
 .../modules/simple/dom/impl/SimpleObjects.java     |  7 +++---
 ...IntegTest.java => SimpleObjects_IntegTest.java} | 11 +++++-----
 ...eObjectMenuGlue.java => SimpleObjectsGlue.java} |  2 +-
 15 files changed, 91 insertions(+), 26 deletions(-)

diff --cc core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
index c3375a9,0000000..e442bee
mode 100644,000000..100644
--- a/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/mixins/layout/Object_rebuildMetamodel.java
@@@ -1,64 -1,0 +1,64 @@@
 +/**
 + *  Licensed to the Apache Software Foundation (ASF) under one or more
 + *  contributor license agreements.  See the NOTICE file distributed with
 + *  this work for additional information regarding copyright ownership.
 + *  The ASF licenses this file to You under the Apache License, Version 2.0
 + *  (the "License"); you may not use this file except in compliance with
 + *  the License.  You may obtain a copy of the License at
 + *
 + *     http://www.apache.org/licenses/LICENSE-2.0
 + *
 + *  Unless required by applicable law or agreed to in writing, software
 + *  distributed under the License is distributed on an "AS IS" BASIS,
 + *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 + *  See the License for the specific language governing permissions and
 + *  limitations under the License.
 + */
 +package org.apache.isis.applib.mixins.layout;
 +
 +import org.apache.isis.applib.annotation.Action;
 +import org.apache.isis.applib.annotation.ActionLayout;
 +import org.apache.isis.applib.annotation.CommandPersistence;
 +import org.apache.isis.applib.annotation.Contributed;
 +import org.apache.isis.applib.annotation.MemberOrder;
 +import org.apache.isis.applib.annotation.Mixin;
 +import org.apache.isis.applib.annotation.RestrictTo;
 +import org.apache.isis.applib.annotation.SemanticsOf;
 +import org.apache.isis.applib.services.metamodel.MetaModelService;
 +
 +@Mixin(method="act")
 +public class Object_rebuildMetamodel {
 +
 +    private final Object object;
 +
 +    public Object_rebuildMetamodel(final Object object) {
 +        this.object = object;
 +    }
 +
 +    public static class ActionDomainEvent
 +    extends org.apache.isis.applib.IsisApplibModule.ActionDomainEvent<Object_rebuildMetamodel> {
 +        private static final long serialVersionUID = 1L;
 +    }
 +
 +    @Action(
 +            domainEvent = ActionDomainEvent.class,
 +            semantics = SemanticsOf.IDEMPOTENT,
 +            commandPersistence = CommandPersistence.NOT_PERSISTED,
 +            restrictTo = RestrictTo.PROTOTYPING
 +            )
 +    @ActionLayout(
 +            contributed = Contributed.AS_ACTION,
 +            cssClassFa = "fa-refresh",
-             position = ActionLayout.Position.PANEL_DROPDOWN
++            position = ActionLayout.Position.PANEL
 +            )
 +    @MemberOrder(name = "datanucleusIdLong", sequence = "800.1")
 +    public Object act() {
 +        metaModelService.rebuild(object.getClass());
 +        return object;
 +    }
 +
 +    @javax.inject.Inject
 +    MetaModelService metaModelService;
 +
 +
 +}
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
index 875a1bd,478351c..0549373
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/PromptStyleFacetForActionLayoutAnnotation.java
@@@ -45,33 -45,37 +45,35 @@@ public class PromptStyleFacetForActionL
              final IsisConfiguration configuration,
              final FacetHolder holder) {
  
 -        PromptStyle promptStyle = actionLayout != null? actionLayout.promptStyle() : null;
 +        return actionLayouts.stream()
 +                .map(ActionLayout::promptStyle)
 +                .filter(promptStyle -> promptStyle != PromptStyle.NOT_SPECIFIED)
 +                .findFirst()
 +                .map(promptStyle -> {
  
 -        if(promptStyle == null) {
 -            if (holder.containsDoOpNotDerivedFacet(PromptStyleFacet.class)) {
 -                // do not replace
 -                return null;
 -            }
 +                    switch (promptStyle) {
 +                    case DIALOG:
++                    case DIALOG_MODAL:
++                    case DIALOG_SIDEBAR:
 +                    case INLINE:
 +                    case INLINE_AS_IF_EDIT:
 +                        return new PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
  
 -            return new PromptStyleFacetFallBackToInline(holder);
 -        } else {
 +                    case AS_CONFIGURED:
  
 -            switch (promptStyle) {
 -                case DIALOG:
 -                case DIALOG_MODAL:
 -                case DIALOG_SIDEBAR:
 -                case INLINE:
 -                case INLINE_AS_IF_EDIT:
 -                    return new PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
 +                        // do not replace
 +                        if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
 +                            return null;
 +                        }
  
 -                case AS_CONFIGURED:
 +                        promptStyle = PromptStyleConfiguration.parse(configuration);
 +                        return new PromptStyleFacetAsConfigured(promptStyle, holder);
  
 -                    // do not replace
 -                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
 -                        return null;
 -                    }
 -
 -                    promptStyle = PromptStyleConfiguration.parse(configuration);
 -                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
 -
 -                default:
  
 +                    }
 +                    throw new IllegalStateException("promptStyle '" + promptStyle + "' not recognised");
 +                })
 +                .orElseGet(() -> {
                      // do not replace
                      if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
                          return null;
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
index c4f2708,0171ef5..d661065
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PromptStyleFacetForPropertyLayoutAnnotation.java
@@@ -45,33 -45,37 +45,35 @@@ public class PromptStyleFacetForPropert
              final IsisConfiguration configuration,
              final FacetHolder holder) {
  
 -        PromptStyle promptStyle = propertyLayout != null? propertyLayout.promptStyle() : null;
 -
 -        if(promptStyle == null) {
 -            if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
 -                // do not replace
 -                return null;
 -            }
 -
 -            return new PromptStyleFacetFallBackToInline(holder);
 -        } else {
 -
 -            switch (promptStyle) {
 -                case DIALOG:
 -                case DIALOG_MODAL:
 -                case DIALOG_SIDEBAR:
 -                case INLINE:
 -                    return new PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
 -                case INLINE_AS_IF_EDIT:
 -                    return new PromptStyleFacetForPropertyLayoutAnnotation(PromptStyle.INLINE, holder);
 -
 -                case AS_CONFIGURED:
 -
 -                    // do not replace
 -                    if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
 -                        return null;
 +        return propertyLayouts.stream()
 +                .map(PropertyLayout::promptStyle)
 +                .filter(promptStyle -> promptStyle != PromptStyle.NOT_SPECIFIED)
 +                .findFirst()
 +                .map(promptStyle -> {
 +
 +                    switch (promptStyle) {
 +                    case DIALOG:
++                    case DIALOG_MODAL:
++                    case DIALOG_SIDEBAR:
 +                    case INLINE:
 +                        return new PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
 +                    case INLINE_AS_IF_EDIT:
 +                        return new PromptStyleFacetForPropertyLayoutAnnotation(PromptStyle.INLINE, holder);
 +
 +                    case AS_CONFIGURED:
 +
 +                        // do not replace
 +                        if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
 +                            return null;
 +                        }
 +
 +                        promptStyle = PromptStyleConfiguration.parse(configuration);
 +                        return new PromptStyleFacetAsConfigured(promptStyle, holder);
 +                    default:
                      }
 -
 -                    promptStyle = PromptStyleConfiguration.parse(configuration);
 -                    return new PromptStyleFacetAsConfigured(promptStyle, holder);
 -
 -                default:
 +                    throw new IllegalStateException("promptStyle '" + promptStyle + "' not recognised");
 +                })
 +                .orElseGet(() -> {
  
                      // do not replace
                      if (holder.containsDoOpFacet(PromptStyleFacet.class)) {
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
index 4cfb2d2,ce07843..2f41c62
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
@@@ -86,9 -94,21 +86,17 @@@ public class PropertyLayoutFacetFactor
          FacetUtil.addFacet(describedAsFacet);
      }
  
 -    void processPromptStyle(final FacetHolder holder, final Properties properties, final PropertyLayout propertyLayout) {
 +    void processPromptStyle(final FacetHolder holder, final List<PropertyLayout> propertyLayout) {
+ 
+         if(holder instanceof FacetedMethod) {
+             final FacetedMethod facetedMethod = (FacetedMethod) holder;
+             if(facetedMethod.getFeatureType() != FeatureType.PROPERTY) {
+                 return;
+             }
+         }
+ 
 -        PromptStyleFacet promptStyleFacet = PromptStyleFacetOnPropertyFromLayoutProperties
 -                .create(properties, holder);
 -        if(promptStyleFacet == null) {
 -            promptStyleFacet = PromptStyleFacetForPropertyLayoutAnnotation
 -                    .create(propertyLayout, getConfiguration(), holder);
 -        }
 +        PromptStyleFacet promptStyleFacet = PromptStyleFacetForPropertyLayoutAnnotation
 +                .create(propertyLayout, getConfiguration(), holder);
  
          FacetUtil.addFacet(promptStyleFacet);
      }
diff --cc core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionPromptProvider.java
index c35c675,0d6c119..5fc6fcf
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionPromptProvider.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionPromptProvider.java
@@@ -21,6 -21,7 +21,7 @@@ import org.apache.wicket.Page
  import org.apache.wicket.ajax.AjaxRequestTarget;
  
  import org.apache.isis.applib.annotation.PromptStyle;
 -import org.apache.isis.applib.services.metamodel.MetaModelService2;
++import org.apache.isis.applib.services.metamodel.MetaModelService;
  
  public interface ActionPromptProvider {
  
@@@ -44,6 -45,8 +45,8 @@@
          }
      }
  
-     public ActionPrompt getActionPrompt(final PromptStyle promptStyle);
+     public ActionPrompt getActionPrompt(
+             final PromptStyle promptStyle,
 -            final MetaModelService2.Sort sort);
++            final MetaModelService.Sort sort);
      void closePrompt(final AjaxRequestTarget target);
  }
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index 1a41513,47aefc1..10b81cf
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@@ -40,10 -43,9 +40,11 @@@ import org.apache.wicket.model.Model
  
  import org.apache.isis.applib.annotation.ActionLayout;
  import org.apache.isis.applib.annotation.PromptStyle;
 -import org.apache.isis.applib.services.metamodel.MetaModelService2;
++import org.apache.isis.applib.services.metamodel.MetaModelService;
 +import org.apache.isis.commons.internal.base._Strings;
 +import org.apache.isis.commons.internal.collections._Lists;
  import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 -import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 +import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
  import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
  import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
  import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
@@@ -73,6 -76,6 +75,7 @@@ import org.apache.isis.viewer.wicket.ui
  
  import de.agilecoders.wicket.core.markup.html.bootstrap.common.NotificationPanel;
  
++
  public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> implements ScalarModelSubscriber2 {
  
      private static final long serialVersionUID = 1L;
@@@ -714,16 -701,15 +717,21 @@@
              scalarIfRegularFormGroup.addOrReplace(editProperty);
  
              editProperty.add(new AjaxEventBehavior("click") {
 +                /**
 +                 *
 +                 */
 +                private static final long serialVersionUID = -3561635292986591682L;
 +
 +                @Override
                  protected void onEvent(AjaxRequestTarget target) {
  
+                     final ObjectSpecification specification = scalarModel.getObject().getSpecification();
 -                    final MetaModelService2 metaModelService2 = getIsisSessionFactory().getServicesInjector()
 -                            .lookupService(MetaModelService2.class);
 -                    final MetaModelService2.Sort sort = metaModelService2.sortOf(specification.getCorrespondingClass());
++                    final MetaModelService metaModelService = getIsisSessionFactory().getServicesInjector()
++                            .lookupServiceElseFail(MetaModelService.class);
++                    final MetaModelService.Sort sort = metaModelService.sortOf(specification.getCorrespondingClass(), MetaModelService.Mode.RELAXED);
+ 
                      final ActionPrompt prompt = ActionPromptProvider.Util
-                             .getFrom(ScalarPanelAbstract2.this).getActionPrompt(promptStyle);
+                             .getFrom(ScalarPanelAbstract2.this).getActionPrompt(promptStyle, sort);
  
                      PropertyEditPromptHeaderPanel titlePanel = new PropertyEditPromptHeaderPanel(prompt.getTitleId(),
                              ScalarPanelAbstract2.this.scalarModel);
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index e04bd6a,4cd00b6..8de064c
--- 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
@@@ -32,11 -37,11 +32,13 @@@ import org.apache.wicket.model.Abstract
  import org.apache.wicket.request.cycle.RequestCycle;
  
  import org.apache.isis.applib.annotation.PromptStyle;
 -import org.apache.isis.applib.services.metamodel.MetaModelService2;
 +import org.apache.isis.commons.internal.base._NullSafe;
 +import org.apache.isis.commons.internal.collections._Lists;
++import org.apache.isis.applib.services.metamodel.MetaModelService;
  import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 -import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 +import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
  import org.apache.isis.core.metamodel.postprocessors.param.ActionParameterDefaultsFacetFromAssociatedCollection;
+ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
  import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
  import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
  import org.apache.isis.core.runtime.system.context.IsisContext;
@@@ -164,7 -170,12 +166,12 @@@ public abstract class ActionLinkFactory
  
          if(inlinePromptContext == null || promptStyle.isDialog()) {
              final ActionPromptProvider promptProvider = ActionPromptProvider.Util.getFrom(actionLink.getPage());
-             final ActionPrompt prompt = promptProvider.getActionPrompt(promptStyle);
+             final ObjectSpecification specification = actionModel.getTargetAdapter().getSpecification();
+ 
 -            final MetaModelService2 metaModelService2 = getIsisSessionFactory().getServicesInjector()
 -                    .lookupService(MetaModelService2.class);
 -            final MetaModelService2.Sort sort = metaModelService2.sortOf(specification.getCorrespondingClass());
++            final MetaModelService metaModelService = getIsisSessionFactory().getServicesInjector()
++                    .lookupServiceElseFail(MetaModelService.class);
++            final MetaModelService.Sort sort = metaModelService.sortOf(specification.getCorrespondingClass(), MetaModelService.Mode.RELAXED);
+             final ActionPrompt prompt = promptProvider.getActionPrompt(promptStyle, sort);
  
  
              //
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 479991c,90a1b4e..c23abeb
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@@ -65,8 -64,10 +65,9 @@@ import org.slf4j.LoggerFactory
  import org.apache.isis.applib.annotation.PromptStyle;
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 -import org.apache.isis.applib.services.metamodel.MetaModelService2;
 -import org.apache.isis.core.commons.authentication.AuthenticationSession;
 -import org.apache.isis.core.commons.config.ConfigPropertyEnum;
 -import org.apache.isis.core.commons.config.IsisConfiguration;
 +import org.apache.isis.config.IsisConfiguration;
 +import org.apache.isis.config.property.ConfigPropertyEnum;
++import org.apache.isis.applib.services.metamodel.MetaModelService;
  import org.apache.isis.core.metamodel.services.ServicesInjector;
  import org.apache.isis.core.runtime.system.context.IsisContext;
  import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
@@@ -466,20 -468,27 +469,27 @@@ public abstract class PageAbstract exte
      private ActionPromptModalWindow actionPromptModalWindow;
      private ActionPromptSidebar actionPromptSidebar;
  
-     public ActionPrompt getActionPrompt(final PromptStyle promptStyle) {
+     public ActionPrompt getActionPrompt(
+             final PromptStyle promptStyle,
 -            final MetaModelService2.Sort sort) {
++            final MetaModelService.Sort sort) {
+ 
          switch (promptStyle) {
          case AS_CONFIGURED:
          case DIALOG:
          case INLINE:
          case INLINE_AS_IF_EDIT:
          default:
-             final DialogMode dialogMode = CONFIG_DIALOG_MODE.from(getConfiguration());
+             final ConfigPropertyEnum<DialogMode> configProp =
 -                    sort == MetaModelService2.Sort.DOMAIN_SERVICE
++                    sort == MetaModelService.Sort.DOMAIN_SERVICE
+                             ? CONFIG_DIALOG_MODE_FOR_MENUS
+                             : CONFIG_DIALOG_MODE;
+             final DialogMode dialogMode = configProp.from(getConfiguration());
              switch (dialogMode) {
-                 case SIDEBAR:
-                     return actionPromptSidebar;
-                 case MODAL:
-                 default:
-                     return actionPromptModalWindow;
+             case SIDEBAR:
+                 return actionPromptSidebar;
+             case MODAL:
+             default:
+                 return actionPromptModalWindow;
              }
          case DIALOG_SIDEBAR:
              return actionPromptSidebar;
diff --cc example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
index b05be1b,3695151..aca31d4
--- a/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
+++ b/example/application/simpleapp/module-simple/src/main/java/domainapp/modules/simple/dom/impl/SimpleObjects.java
@@@ -29,17 -29,17 +29,18 @@@ import org.apache.isis.applib.annotatio
  import org.apache.isis.applib.annotation.DomainServiceLayout;
  import org.apache.isis.applib.annotation.MemberOrder;
  import org.apache.isis.applib.annotation.NatureOfService;
 -import org.apache.isis.applib.annotation.ParameterLayout;
  import org.apache.isis.applib.annotation.Programmatic;
+ import org.apache.isis.applib.annotation.PromptStyle;
  import org.apache.isis.applib.annotation.SemanticsOf;
 -import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
 -import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
 +import org.apache.isis.applib.events.domain.ActionDomainEvent;
 +import org.apache.isis.applib.services.jdosupport.IsisJdoSupport_v3_2;
  import org.apache.isis.applib.services.repository.RepositoryService;
  
 +import domainapp.modules.simple.dom.types.Name;
 +
  @DomainService(
          nature = NatureOfService.VIEW_MENU_ONLY,
-         objectType = "simple.SimpleObjectMenu",
+         objectType = "simple.SimpleObjects",
          repositoryFor = SimpleObject.class
  )
  @DomainServiceLayout(
@@@ -57,12 -56,13 +57,12 @@@ public class SimpleObjects 
  
  
      @Action(semantics = SemanticsOf.SAFE)
-     @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT)
+     @ActionLayout(bookmarking = BookmarkPolicy.AS_ROOT, promptStyle = PromptStyle.DIALOG_SIDEBAR)
      @MemberOrder(sequence = "2")
      public List<SimpleObject> findByName(
 -            @ParameterLayout(named="Name")
 -            final String name
 +            @Name final String name
      ) {
 -        TypesafeQuery<SimpleObject> q = isisJdoSupport.newTypesafeQuery(SimpleObject.class);
 +    	JDOQLTypedQuery<SimpleObject> q = isisJdoSupport.newTypesafeQuery(SimpleObject.class);
          final QSimpleObject cand = QSimpleObject.candidate();
          q = q.filter(
                  cand.name.indexOf(q.stringParameter("name")).ne(-1)
@@@ -71,19 -71,9 +71,20 @@@
                  .executeList();
      }
  
 +    public static class CreateDomainEvent extends ActionDomainEvent<SimpleObjects> {}
 +    @Action(domainEvent = CreateDomainEvent.class)
++    @ActionLayout(promptStyle = PromptStyle.DIALOG_MODAL)
 +    @MemberOrder(sequence = "3")
 +    public SimpleObject create(
 +            @Name final String name
 +    ) {
 +        return repositoryService.persist(new SimpleObject(name));
 +    }
 +
 +
      @Programmatic
      public SimpleObject findByNameExact(final String name) {
 -        TypesafeQuery<SimpleObject> q = isisJdoSupport.newTypesafeQuery(SimpleObject.class);
 +    	JDOQLTypedQuery<SimpleObject> q = isisJdoSupport.newTypesafeQuery(SimpleObject.class);
          final QSimpleObject cand = QSimpleObject.candidate();
          q = q.filter(
                  cand.name.eq(q.stringParameter("name"))
diff --cc example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
index 158ae05,4300580..d1c6e0a
--- a/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
+++ b/example/application/simpleapp/module-simple/src/test/java/domainapp/modules/simple/integtests/tests/SimpleObjects_IntegTest.java
@@@ -38,10 -34,14 +38,13 @@@ import domainapp.modules.simple.dom.imp
  import domainapp.modules.simple.dom.impl.SimpleObjects;
  import domainapp.modules.simple.fixture.SimpleObject_persona;
  import domainapp.modules.simple.integtests.SimpleModuleIntegTestAbstract;
 -import static org.assertj.core.api.Assertions.assertThat;
  
- public class SimpleObjectMenu_IntegTest extends SimpleModuleIntegTestAbstract {
+ public class SimpleObjects_IntegTest extends SimpleModuleIntegTestAbstract {
  
-     public static class ListAll extends SimpleObjectMenu_IntegTest {
+     @Inject
+     SimpleObjects menu;
+ 
+     public static class ListAll extends SimpleObjects_IntegTest {
  
          @Test
          public void happyCase() {