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 09:32:16 UTC

[isis] 01/03: ISIS-2078: correctly honours promptStyle for menu items (service actions), and adds a new config property for the default dialogMode if set to DIALOG.

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

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

commit d4224c655fcec26b0e63eb32afd87c02e8b504f4
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Jan 11 09:26:25 2019 +0000

    ISIS-2078: correctly honours promptStyle for menu items (service actions), and adds a new config property for the default dialogMode if set to DIALOG.
    
    ...so that entities can use sidebar by default, but services/menus can use modal dialog, say.
---
 .../rgant/_rgant-ActionLayout_promptStyle.adoc     |  9 +++++++-
 .../ugvw/_ugvw_configuration-properties.adoc       | 11 ++++++++--
 .../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   |  9 +++++++-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  9 +++++++-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  | 25 ++++++++++++++++------
 10 files changed, 75 insertions(+), 13 deletions(-)

diff --git a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
index 513295e..ffd7079 100644
--- a/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/rgant/_rgant-ActionLayout_promptStyle.adoc
@@ -10,10 +10,17 @@ For more on sidebar vs modal dialogs, see xref:../ugvw/ugvw.adoc#_ugvw_features_
 
 The prompt style is influenced by two xref:../ugvw/ugvw.adoc#_ugvw_configuration-properties[configuration properties]:
 
-* if the `promptStyle()` attribute is set to `DIALOG`, then the `isis.viewer.wicket.dialogMode` configuration is used to determine whether to render using a modal dialog or a sidebar.
+* if the `promptStyle()` attribute is set to `DIALOG`, then a configuration property is used to determine whether to render using a modal dialog or a sidebar:
+
+** `isis.viewer.wicket.dialogMode` if the action is for a domain object (entity or view model)
 +
 If the configuration property is not set, then sidebar is used.
 
+** `isis.viewer.wicket.dialogModeForMenu` if the action is for a domain service
++
+If the configuration property is not set, then modal is used.
+
+
 * If the attribute is not set at all, then the `isis.viewer.wicket.promptStyle` configuration property is used to specify the preferred prompt style.
 +
 If the configuration property is not set, then an inline prompt is used.
diff --git a/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc b/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc
index 624fb39..e170a1d 100644
--- a/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc
+++ b/adocs/documentation/src/main/asciidoc/guides/ugvw/_ugvw_configuration-properties.adoc
@@ -544,11 +544,18 @@ Note that `inline_as_if_edit` does not make sense for a configuration property d
 `dialogMode`
 | `sidebar`,`modal` +
 (`_sidebar_`)
-| Whether action prompts with a style of `DIALOG` - as in, `@ActionLayout(promptStyle="DIALOG")` - should be rendered using a sidebar or alternatively in a modal dialog box.
+| Whether an action on a domain object (entity or view model) which prompts with a style of `DIALOG` - as in, `@ActionLayout(promptStyle="DIALOG")` - should be rendered using a sidebar or alternatively in a modal dialog box.
+
+See the discussion on the xref:../ugvw/ugvw.adoc#_ugvw_features_sidebar-vs-modal-dialogs[sidebar vs modal dialogs] feature for further details.
+
+|`isis.viewer.wicket.` +
+`dialogModeForMenu`
+| `sidebar`,`modal` +
+(`_sidebar_`)
+| Whether an action for a domain service should be rendered using a sidebar or alternatively in a modal dialog box.
 
 See the discussion on the xref:../ugvw/ugvw.adoc#_ugvw_features_sidebar-vs-modal-dialogs[sidebar vs modal dialogs] feature for further details.
 
-p
 
 
 |===
diff --git 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
index d4d553e..478351c 100644
--- 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
@@ -58,6 +58,8 @@ public class PromptStyleFacetForActionLayoutAnnotation extends PromptStyleFacetA
 
             switch (promptStyle) {
                 case DIALOG:
+                case DIALOG_MODAL:
+                case DIALOG_SIDEBAR:
                 case INLINE:
                 case INLINE_AS_IF_EDIT:
                     return new PromptStyleFacetForActionLayoutAnnotation(promptStyle, holder);
diff --git 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
index bb67b98..0171ef5 100644
--- 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
@@ -58,6 +58,8 @@ public class PromptStyleFacetForPropertyLayoutAnnotation extends PromptStyleFace
 
             switch (promptStyle) {
                 case DIALOG:
+                case DIALOG_MODAL:
+                case DIALOG_SIDEBAR:
                 case INLINE:
                     return new PromptStyleFacetForPropertyLayoutAnnotation(promptStyle, holder);
                 case INLINE_AS_IF_EDIT:
diff --git 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
index 229a7c4..ce07843 100644
--- 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
@@ -95,6 +95,14 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
     }
 
     void processPromptStyle(final FacetHolder holder, final Properties properties, final 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) {
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 6f12439..9b04433 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -659,6 +659,14 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements For
         if(objectActionOwner.isService()) {
             // tried to move this test into PromptStyleFacetFallback,
             // however it's not that easy to lookup the owning type
+            final PromptStyleFacet facet = getFacet(PromptStyleFacet.class);
+            if (facet != null) {
+                final PromptStyle promptStyle = facet.value();
+                if (promptStyle.isDialog()) {
+                    // could be specified explicitly.
+                    return promptStyle;
+                }
+            }
             return PromptStyle.DIALOG;
         }
         if(objectAction.getParameterCount() == 0) {
diff --git 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
index c35c675..0d6c119 100644
--- 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 @@ 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;
 
 public interface ActionPromptProvider {
 
@@ -44,6 +45,8 @@ public interface ActionPromptProvider {
         }
     }
 
-    public ActionPrompt getActionPrompt(final PromptStyle promptStyle);
+    public ActionPrompt getActionPrompt(
+            final PromptStyle promptStyle,
+            final MetaModelService2.Sort sort);
     void closePrompt(final AjaxRequestTarget target);
 }
diff --git 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
index 3bcb55e..47aefc1 100644
--- 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
@@ -43,12 +43,14 @@ 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.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 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;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 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.models.ActionPrompt;
@@ -701,8 +703,13 @@ public abstract class ScalarPanelAbstract2 extends PanelAbstract<ScalarModel> im
             editProperty.add(new AjaxEventBehavior("click") {
                 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 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 --git 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
index 0650b00..4cd00b6 100644
--- 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
@@ -37,9 +37,11 @@ import org.apache.wicket.model.AbstractReadOnlyModel;
 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.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 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;
@@ -168,7 +170,12 @@ public abstract class ActionLinkFactoryAbstract implements 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 ActionPrompt prompt = promptProvider.getActionPrompt(promptStyle, sort);
 
 
             //
diff --git 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
index ffef9e0..90a1b4e 100644
--- 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
@@ -64,6 +64,7 @@ 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;
@@ -113,6 +114,8 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     
     public static final ConfigPropertyEnum<DialogMode> CONFIG_DIALOG_MODE =
             new ConfigPropertyEnum<>("isis.viewer.wicket.dialogMode", DialogMode.SIDEBAR);
+    public static final ConfigPropertyEnum<DialogMode> CONFIG_DIALOG_MODE_FOR_MENUS =
+            new ConfigPropertyEnum<>("isis.viewer.wicket.dialogModeForMenu", DialogMode.MODAL);
 
     /**
      * @see <a href="http://github.com/brandonaaron/livequery">livequery</a>
@@ -465,26 +468,34 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
     private ActionPromptModalWindow actionPromptModalWindow;
     private ActionPromptSidebar actionPromptSidebar;
 
-    public ActionPrompt getActionPrompt(final PromptStyle promptStyle) {
+    public ActionPrompt getActionPrompt(
+            final PromptStyle promptStyle,
+            final MetaModelService2.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
+                            ? 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;
         case DIALOG_MODAL:
             return actionPromptModalWindow;
         }
+
     }
 
     @Override