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