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 2017/05/15 15:07:49 UTC
[13/19] isis git commit: ISIS-1613: refactors the ActionParameters
and PropertyEdit forms and panels
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties
new file mode 100644
index 0000000..71edcd9
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditFormPanel.properties
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+
+okLabel=OK
+cancelLabel=Cancel
+editLabel=Edit
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
index f4732fd..6424753 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
@@ -30,9 +30,13 @@ import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersPanel;
import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+/**
+ * Corresponding component to prompt for action (parameters) is {@link ActionParametersPanel}.
+ */
public class PropertyEditPanel extends PanelAbstract<ScalarModel> {
private static final long serialVersionUID = 1L;
@@ -42,14 +46,17 @@ public class PropertyEditPanel extends PanelAbstract<ScalarModel> {
private static final String ID_PROPERTY_NAME = "propertyName";
/**
- * Gives a chance to hide the header part of this action panel, e.g. when shown in an action prompt
+ * Gives a chance to hide the header part of this panel.
*/
private boolean showHeader = true;
- public PropertyEditPanel(final String id, final ScalarModel scalarModel) {
+ public PropertyEditPanel(
+ final String id,
+ final ScalarModel scalarModel) {
super(id, new ScalarModel(scalarModel.getParentEntityModel(), scalarModel.getPropertyMemento()));
- getScalarModel().setFormExecutor(new PropertyEditFormExecutor(this, getModel()));
- buildGui(getScalarModel());
+ final PropertyEditFormExecutor formExecutor = new PropertyEditFormExecutor(this, scalarModel);
+ scalarModel.setFormExecutor(formExecutor);
+ buildGui(scalarModel);
}
@Override
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html
deleted file mode 100644
index 173b259..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- 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.
--->
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:wicket="http://wicket.apache.org"
- xml:lang="en"
- lang="en">
- <body>
- <wicket:panel>
- <div class="iconAndTitle propertyPanelHeaderNew">
- <span wicket:enclosure="entityIconAndTitle"><span wicket:id="entityIconAndTitle">[icon and title]</span> :</span> <span wicket:id="propertyName" class="propertyName">[property name]</span>
- </div>
- </wicket:panel>
- </body>
-</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java
deleted file mode 100644
index 0156674..0000000
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPromptHeaderPanel.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.viewer.wicket.ui.components.property;
-
-import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.model.AbstractReadOnlyModel;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
-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.ComponentType;
-import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
-
-/**
- * A panel used as a title for the action prompts
- */
-public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarModel> {
-
- private static final String ID_PROPERTY_NAME = "propertyName";
-
- public PropertyEditPromptHeaderPanel(String id, final ScalarModel model) {
- super(id, model);
-
- ObjectAdapter targetAdapter = model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
-
- getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
-
- final Label label = new Label(ID_PROPERTY_NAME, new AbstractReadOnlyModel<String>() {
- @Override
- public String getObject() {
- final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
- return property.getName();
- }
- });
- final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
- final NamedFacet namedFacet = property.getFacet(NamedFacet.class);
- if(namedFacet != null) {
- label.setEscapeModelStrings(namedFacet.escaped());
- }
- add(label);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.html
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.html
new file mode 100644
index 0000000..173b259
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.html
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:wicket="http://wicket.apache.org"
+ xml:lang="en"
+ lang="en">
+ <body>
+ <wicket:panel>
+ <div class="iconAndTitle propertyPanelHeaderNew">
+ <span wicket:enclosure="entityIconAndTitle"><span wicket:id="entityIconAndTitle">[icon and title]</span> :</span> <span wicket:id="propertyName" class="propertyName">[property name]</span>
+ </div>
+ </wicket:panel>
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
new file mode 100644
index 0000000..e3d5df0
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
@@ -0,0 +1,59 @@
+/*
+ * 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.viewer.wicket.ui.components.propertyheader;
+
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.AbstractReadOnlyModel;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+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.ComponentType;
+import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
+
+public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarModel> {
+
+ private static final String ID_PROPERTY_NAME = "propertyName";
+
+ public PropertyEditPromptHeaderPanel(String id, final ScalarModel model) {
+ super(id, model);
+
+ ObjectAdapter targetAdapter = model.getParentEntityModel().load(AdapterManager.ConcurrencyChecking.NO_CHECK);
+
+ getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
+
+ final Label label = new Label(ID_PROPERTY_NAME, new AbstractReadOnlyModel<String>() {
+ @Override
+ public String getObject() {
+ final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
+ return property.getName();
+ }
+ });
+ final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
+ final NamedFacet namedFacet = property.getFacet(NamedFacet.class);
+ if(namedFacet != null) {
+ label.setEscapeModelStrings(namedFacet.escaped());
+ }
+ add(label);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index cea8ea7..d6b9fe8 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -51,7 +51,7 @@ import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.AdditionalLinksPanel;
import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPanel;
-import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPromptHeaderPanel;
+import org.apache.isis.viewer.wicket.ui.components.propertyheader.PropertyEditPromptHeaderPanel;
import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel.ScalarModelProvider;
import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
import org.apache.isis.viewer.wicket.ui.util.Components;
@@ -291,44 +291,6 @@ public abstract class ScalarPanelAbstract extends PanelAbstract<ScalarModel> imp
protected abstract Component addComponentForCompact();
- protected void addFeedbackOnlyTo(final MarkupContainer markupContainer, final Component component) {
- markupContainer.addOrReplace(new NotificationPanel(ID_FEEDBACK, component, new ComponentFeedbackMessageFilter(component)));
- }
-
- protected void addEditPropertyTo(final MarkupContainer markupContainer) {
- final String disableReasonIfAny = scalarModel.disable(getRendering().getWhere());
- if (disableReasonIfAny == null && scalarModel.isViewMode()) {
- final WebMarkupContainer editProperty = new WebMarkupContainer(ID_EDIT_PROPERTY);
-
- editProperty.setOutputMarkupId(true);
-
- editProperty.add(new AjaxEventBehavior("click") {
- protected void onEvent(AjaxRequestTarget target) {
-
- final ActionPrompt prompt = ActionPromptProvider.Util
- .getFrom(ScalarPanelAbstract.this).getActionPrompt();
-
- PropertyEditPromptHeaderPanel titlePanel = new PropertyEditPromptHeaderPanel(prompt.getTitleId(),
- scalarModel);
-
- final PropertyEditPanel propertyEditPanel =
- (PropertyEditPanel) getComponentFactoryRegistry().createComponent(
- ComponentType.PROPERTY_EDIT_PROMPT, prompt.getContentId(), scalarModel);
-
- propertyEditPanel.setShowHeader(false);
-
- prompt.setTitle(titlePanel, target);
- prompt.setPanel(propertyEditPanel, target);
- prompt.showPrompt(target);
-
- }
- });
-
- markupContainer.addOrReplace(editProperty);
- } else {
- Components.permanentlyHide(markupContainer, ID_EDIT_PROPERTY);
- }
- }
/**
* Optional hook.
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
----------------------------------------------------------------------
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 f2e2e4a..7f7a61a 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
@@ -56,7 +56,7 @@ import org.apache.isis.viewer.wicket.ui.components.actionmenu.entityactions.Link
import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormExecutor;
import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditFormPanel;
import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPanel;
-import org.apache.isis.viewer.wicket.ui.components.property.PropertyEditPromptHeaderPanel;
+import org.apache.isis.viewer.wicket.ui.components.propertyheader.PropertyEditPromptHeaderPanel;
import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisBlobOrClobPanelAbstract;
import org.apache.isis.viewer.wicket.ui.components.scalars.primitive.BooleanPanel;
import org.apache.isis.viewer.wicket.ui.components.scalars.reference.ReferencePanel;
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
----------------------------------------------------------------------
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 d60d672..2b01ea3 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
@@ -46,7 +46,7 @@ import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
import org.apache.isis.viewer.wicket.ui.components.actionprompt.ActionPromptHeaderPanel;
-import org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel;
+import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersPanel;
import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersFormExecutor;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry;
@@ -136,7 +136,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
private static AjaxDeferredBehaviour determineDeferredBehaviour(final ObjectAction action,
final ActionModel actionModel) {
- // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+ // TODO: should unify with ActionResultResponseType (as used in ActionParametersPanel)
if (isNoArgReturnTypeRedirect(action)) {
/**
* adapted from:
@@ -177,14 +177,14 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
return null;
}
- // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+ // TODO: should unify with ActionResultResponseType (as used in ActionParametersPanel)
private static boolean isNoArgReturnTypeRedirect(final ObjectAction action) {
return action.getParameterCount() == 0 &&
action.getReturnType() != null &&
action.getReturnType().getCorrespondingClass() == java.net.URL.class;
}
- // TODO: should unify with ActionResultResponseType (as used in ActionPanel)
+ // TODO: should unify with ActionResultResponseType (as used in ActionParametersPanel)
private static boolean isNoArgReturnTypeDownload(final ObjectAction action) {
return action.getParameterCount() == 0 && action.getReturnType() != null &&
(action.getReturnType().getCorrespondingClass() == org.apache.isis.applib.value.Blob.class ||
@@ -220,15 +220,15 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
return new ActionPromptHeaderPanel(titleId, actionModel);
}
});
- final ActionPanel actionPanel =
- (ActionPanel) getComponentFactoryRegistry().createComponent(
+ final ActionParametersPanel actionParametersPanel =
+ (ActionParametersPanel) getComponentFactoryRegistry().createComponent(
ComponentType.ACTION_PROMPT, prompt.getContentId(), actionModel);
- actionPanel.setShowHeader(false);
+ actionParametersPanel.setShowHeader(false);
prompt.setTitle(titlePanel, target);
- prompt.setPanel(actionPanel, target);
- actionPanel.setActionPrompt(prompt);
+ prompt.setPanel(actionParametersPanel, target);
+ actionParametersPanel.setActionPrompt(prompt);
prompt.showPrompt(target);
} else {
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
index 2722129..a9c96e6 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
@@ -65,7 +65,7 @@ public class ActionPromptPage extends PageAbstract {
super(pageParameters, model.getActionMemento().getAction(model.getSpecificationLoader()).getName(), ComponentType.ACTION_PROMPT);
addChildComponents(themeDiv, model);
- // no need to bookmark because the ActionPanel will have done so for us
+ // no need to bookmark because the ActionParametersPanel will have done so for us
addBookmarkedPages(themeDiv);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
index 581effb..acc44f4 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
@@ -19,9 +19,6 @@
package org.apache.isis.viewer.wicket.ui.panels;
-import org.apache.wicket.markup.html.IHeaderContributor;
-import java.util.List;
-
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IFormSubmitter;
import org.apache.wicket.model.IModel;
@@ -29,6 +26,8 @@ import org.apache.wicket.model.IModel;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
@@ -114,6 +113,14 @@ public abstract class FormAbstract<T> extends Form<T>
return getIsisSessionFactory().getDeploymentCategory();
}
+ public SpecificationLoader getSpecificationLoader() {
+ return getIsisSessionFactory().getSpecificationLoader();
+ }
+
+ protected ServicesInjector getServicesInjector() {
+ return getIsisSessionFactory().getServicesInjector();
+ }
+
protected IsisSessionFactory getIsisSessionFactory() {
return IsisContext.getSessionFactory();
}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
new file mode 100644
index 0000000..4133818
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
@@ -0,0 +1,330 @@
+package org.apache.isis.viewer.wicket.ui.panels;
+
+import java.util.List;
+
+import com.google.common.base.Throwables;
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.Page;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.services.command.Command;
+import org.apache.isis.applib.services.command.CommandContext;
+import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
+import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.authentication.MessageBroker;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+import org.apache.isis.core.metamodel.facets.properties.renderunchanged.UnchangingFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
+import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
+import org.apache.isis.viewer.wicket.model.models.FormExecutor;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.ComponentType;
+import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
+import org.apache.isis.viewer.wicket.ui.util.Components;
+
+public abstract class FormExecutorAbstract<M extends BookmarkableModel<ObjectAdapter>> implements FormExecutor {
+
+ protected final MarkupContainer panel;
+ protected final M model;
+
+ public FormExecutorAbstract(final MarkupContainer panel, final M model) {
+ this.panel = panel;
+ this.model = model;
+ }
+
+ @Override
+ public boolean executeAndProcessResults(
+ final AjaxRequestTarget target,
+ final Form<?> feedbackForm,
+ final PromptStyle promptStyle) {
+
+ Components.permanentlyHide(panel, ComponentType.ENTITY_ICON_AND_TITLE);
+
+ ObjectAdapter targetAdapter = null;
+ try {
+ targetAdapter = obtainTargetAdapter();
+
+ // no concurrency exception, so continue...
+ return doExecuteAndProcessResults(target, feedbackForm, promptStyle);
+
+ } catch (ConcurrencyException ex) {
+
+ // second attempt should succeed, because the Oid would have
+ // been updated in the attempt
+ if (targetAdapter == null) {
+ targetAdapter = obtainTargetAdapter();
+ }
+
+ forwardOnConcurrencyException(targetAdapter, ex);
+
+ getMessageBroker().addWarning(ex.getMessage());
+ return false;
+ }
+ }
+
+ /**
+ * @param target
+ * @return whether to clear args or not (they aren't if there was a validation exception)
+ */
+ private boolean doExecuteAndProcessResults(
+ final AjaxRequestTarget target,
+ final Form<?> feedbackForm,
+ final PromptStyle promptStyle) {
+
+ // validate the action parameters (if any)
+ final String invalidReasonIfAny = getReasonInvalidIfAny();
+
+ if (invalidReasonIfAny != null) {
+ raiseWarning(target, feedbackForm, invalidReasonIfAny);
+ return false;
+ }
+
+ final CommandContext commandContext = getServicesInjector().lookupService(CommandContext.class);
+ final Command command;
+ if (commandContext != null) {
+ command = commandContext.getCommand();
+ command.setExecutor(Command.Executor.USER);
+ } else {
+ command = null;
+ }
+
+ // the object store could raise an exception (eg uniqueness constraint)
+ // so we handle it here.
+ try {
+ // could be programmatic flushing, so must include in the try... finally
+ final ObjectAdapter resultAdapter = obtainResultAdapter();
+
+ // flush any queued changes, so concurrency or violation exceptions (if any)
+ // will be thrown here
+ getTransactionManager().flushTransaction();
+
+
+ if(promptStyle == PromptStyle.INLINE) {
+
+ final Page page = feedbackForm.getPage();
+ addComponentsToRedraw(target, page);
+
+ } else {
+ forwardOntoResult(resultAdapter, target);
+
+ }
+
+ onExecuteAndProcessResults(target);
+
+ return true;
+
+ } catch (RuntimeException ex) {
+
+ String message = recognizeException(ex, target, feedbackForm);
+
+ if (message != null) {
+ // no need to add to message broker, should already have been added...
+
+ if (feedbackForm == null) {
+ // forward on instead to void page
+ // (otherwise, we'll have rendered an action parameters page
+ // and so we'll be staying on that page)
+ ActionResultResponseHandlingStrategy.REDIRECT_TO_VOID
+ .handleResults(panel, null, getIsisSessionFactory());
+ }
+
+ return false;
+ }
+
+ // not handled, so capture and propagate
+ if (command != null) {
+ command.setException(Throwables.getStackTraceAsString(ex));
+ }
+
+ throw ex;
+ }
+ }
+
+ private void addComponentsToRedraw(final AjaxRequestTarget target, final Page page) {
+ final List<Component> componentsToRedraw = Lists.newArrayList();
+ final List<Component> componentsNotToRedraw = Lists.newArrayList();
+
+ page.visitChildren(new IVisitor<Component, Object>() {
+ @Override
+ public void component(final Component component, final IVisit<Object> visit) {
+ if (component.getOutputMarkupId() && !(component instanceof Page)) {
+ List<Component> listToAddTo =
+ shouldRedraw(component)
+ ? componentsToRedraw
+ : componentsNotToRedraw;
+ listToAddTo.add(component);
+ }
+ }
+
+ private boolean shouldRedraw(final Component component) {
+
+ // hmm... this doesn't work, because I think that the components
+ // get removed after they've been added to target.
+ // so.. still getting WARN log messages from XmlPartialPageUpdate
+
+// final Page page = component.findParent(Page.class);
+// if(page == null) {
+// // as per logic in XmlPartialPageUpdate, this has already been
+// // removed from page so don't attempt to redraw it
+// return false;
+// }
+
+ final Object defaultModel = component.getDefaultModel();
+ if (!(defaultModel instanceof ScalarModel)) {
+ return true;
+ }
+ final ScalarModel scalarModel = (ScalarModel) defaultModel;
+ final UnchangingFacet unchangingFacet = scalarModel.getFacet(UnchangingFacet.class);
+ return unchangingFacet == null || ! unchangingFacet.value() ;
+ }
+ });
+
+ for (Component componentNotToRedraw : componentsNotToRedraw) {
+ MarkupContainer parent = componentNotToRedraw.getParent();
+ while(parent != null) {
+ parent = parent.getParent();
+ }
+
+ componentNotToRedraw.visitParents(MarkupContainer.class, new IVisitor<MarkupContainer, Object>() {
+ @Override
+ public void component(final MarkupContainer parent, final IVisit<Object> visit) {
+ componentsToRedraw.remove(parent); // no-op if not in that list
+ }
+ });
+ if(componentNotToRedraw instanceof MarkupContainer) {
+ final MarkupContainer containerNotToRedraw = (MarkupContainer) componentNotToRedraw;
+ containerNotToRedraw.visitChildren(new IVisitor<Component, Object>() {
+ @Override
+ public void component(final Component parent, final IVisit<Object> visit) {
+ componentsToRedraw.remove(parent); // no-op if not in that list
+ }
+ });
+ }
+ }
+
+ // debug(componentsToRedraw, componentsNotToRedraw);
+
+ for (Component component : componentsToRedraw) {
+ target.add(component);
+ }
+ }
+
+ private void debug(
+ final List<Component> componentsToRedraw,
+ final List<Component> componentsNotToRedraw) {
+ debug("Not redrawing", componentsNotToRedraw);
+ debug("Redrawing", componentsToRedraw);
+ }
+
+ private void debug(final String title, final List<Component> list) {
+ System.out.println(">>> " + title + ":");
+ for (Component component : list) {
+ System.out.println(
+ String.format("%30s: %s",
+ component.getClass().getSimpleName(),
+ component.getPath()));
+
+ }
+ }
+
+ private String recognizeException(RuntimeException ex, AjaxRequestTarget target, Form<?> feedbackForm) {
+
+ // REVIEW: this code is similar to stuff in EntityPropertiesForm, perhaps move up to superclass?
+ // REVIEW: similar code also in WebRequestCycleForIsis; combine?
+
+ // see if the exception is recognized as being a non-serious error
+ // (nb: similar code in WebRequestCycleForIsis, as a fallback)
+ List<ExceptionRecognizer> exceptionRecognizers = getServicesInjector()
+ .lookupServices(ExceptionRecognizer.class);
+ String recognizedErrorIfAny = new ExceptionRecognizerComposite(exceptionRecognizers).recognize(ex);
+ if (recognizedErrorIfAny != null) {
+
+ // recognized
+ raiseWarning(target, feedbackForm, recognizedErrorIfAny);
+
+ getTransactionManager().getCurrentTransaction().clearAbortCause();
+
+ // there's no need to abort the transaction, it will have already been done
+ // (in IsisTransactionManager#executeWithinTransaction(...)).
+ }
+ return recognizedErrorIfAny;
+ }
+
+ private void raiseWarning(AjaxRequestTarget target, Form<?> feedbackForm, String error) {
+ if(target != null && feedbackForm != null) {
+ target.add(feedbackForm);
+ feedbackForm.error(error);
+ } else {
+ getMessageBroker().addWarning(error);
+ }
+ }
+
+
+ // ///////////////////////////////////////////////////////////////////
+ // Dependencies (from IsisContext)
+ // ///////////////////////////////////////////////////////////////////
+
+ protected PersistenceSession getPersistenceSession() {
+ return getIsisSessionFactory().getCurrentSession().getPersistenceSession();
+ }
+
+ protected ServicesInjector getServicesInjector() {
+ return getIsisSessionFactory().getServicesInjector();
+ }
+
+ protected SpecificationLoader getSpecificationLoader() {
+ return getIsisSessionFactory().getSpecificationLoader();
+ }
+
+ private IsisTransactionManager getTransactionManager() {
+ return getPersistenceSession().getTransactionManager();
+ }
+
+ private MessageBroker getMessageBroker() {
+ return getAuthenticationSession().getMessageBroker();
+ }
+
+ protected IsisSessionFactory getIsisSessionFactory() {
+ return IsisContext.getSessionFactory();
+ }
+
+ protected AuthenticationSession getAuthenticationSession() {
+ return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////////
+
+ protected abstract ObjectAdapter obtainTargetAdapter();
+
+ protected abstract String getReasonInvalidIfAny();
+
+ protected abstract void onExecuteAndProcessResults(final AjaxRequestTarget target);
+
+ protected abstract ObjectAdapter obtainResultAdapter();
+
+ protected abstract void forwardOnConcurrencyException(
+ final ObjectAdapter targetAdapter,
+ final ConcurrencyException ex);
+
+ protected abstract void forwardOntoResult(
+ final ObjectAdapter resultAdapter,
+ final AjaxRequestTarget target);
+
+
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
index 4b43e78..c6d0dac 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
@@ -24,26 +24,19 @@ import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.services.i18n.TranslationService;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.services.ServicesInjector;
import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.IsisSystem;
import org.apache.isis.core.runtime.system.context.IsisContext;
import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
import org.apache.isis.viewer.wicket.ui.util.Components;
-import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
-import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationConfig;
-
/**
* Convenience adapter for {@link Panel}s built up using {@link ComponentType}s.
*/
@@ -158,32 +151,12 @@ public abstract class PanelAbstract<T extends IModel<?>> extends Panel {
protected void addConfirmationDialogIfAreYouSureSemantics(final Component component, final SemanticsOf semanticsOf) {
- if (!semanticsOf.isAreYouSure()) {
- return;
- }
-
- final TranslationService translationService =
- getPersistenceSession().getServicesInjector().lookupService(TranslationService.class);
-
- ConfirmationConfig confirmationConfig = new ConfirmationConfig();
- final String context = IsisSessionFactoryBuilder.class.getName();
- final String areYouSure = translationService.translate(context, IsisSystem.MSG_ARE_YOU_SURE);
- final String confirm = translationService.translate(context, IsisSystem.MSG_CONFIRM);
- final String cancel = translationService.translate(context, IsisSystem.MSG_CANCEL);
+ final ServicesInjector servicesInjector = getPersistenceSession().getServicesInjector();
- confirmationConfig
- .withTitle(areYouSure)
- .withBtnOkLabel(confirm)
- .withBtnCancelLabel(cancel)
- .withPlacement(TooltipConfig.Placement.right)
- .withBtnOkClass("btn btn-danger")
- .withBtnCancelClass("btn btn-default");
-
- component.add(new ConfirmationBehavior(confirmationConfig));
+ PanelUtil.addConfirmationDialogIfAreYouSureSemantics(component, semanticsOf, servicesInjector);
}
-
public DeploymentCategory getDeploymentCategory() {
return getIsisSessionFactory().getDeploymentCategory();
}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
index 324c593..174a599 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
@@ -28,6 +28,16 @@ import org.apache.wicket.markup.head.CssReferenceHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.request.resource.CssResourceReference;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.runtime.system.IsisSystem;
+import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationConfig;
+
public final class PanelUtil {
private PanelUtil(){}
@@ -79,4 +89,32 @@ public final class PanelUtil {
.onBefore("$('#" + ajaxButtonOrLink.getMarkupId() + "').prop('disabled',true);")
.onComplete("$('#" + ajaxButtonOrLink.getMarkupId() + "').prop('disabled',false);"));
}
+
+ public static void addConfirmationDialogIfAreYouSureSemantics(
+ final Component component,
+ final SemanticsOf semanticsOf,
+ final ServicesInjector servicesInjector) {
+ final TranslationService translationService =
+ servicesInjector.lookupService(TranslationService.class);
+
+ if (!semanticsOf.isAreYouSure()) {
+ return;
+ }
+ ConfirmationConfig confirmationConfig = new ConfirmationConfig();
+
+ final String context = IsisSessionFactoryBuilder.class.getName();
+ final String areYouSure = translationService.translate(context, IsisSystem.MSG_ARE_YOU_SURE);
+ final String confirm = translationService.translate(context, IsisSystem.MSG_CONFIRM);
+ final String cancel = translationService.translate(context, IsisSystem.MSG_CANCEL);
+
+ confirmationConfig
+ .withTitle(areYouSure)
+ .withBtnOkLabel(confirm)
+ .withBtnCancelLabel(cancel)
+ .withPlacement(TooltipConfig.Placement.right)
+ .withBtnOkClass("btn btn-danger")
+ .withBtnCancelClass("btn btn-default");
+
+ component.add(new ConfirmationBehavior(confirmationConfig));
+ }
}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
new file mode 100644
index 0000000..a328b89
--- /dev/null
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -0,0 +1,392 @@
+package org.apache.isis.viewer.wicket.ui.panels;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.Page;
+import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.JavaScriptContentHeaderItem;
+import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.util.string.AppendingStringBuffer;
+import org.apache.wicket.util.visit.IVisit;
+import org.apache.wicket.util.visit.IVisitor;
+
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
+import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
+import org.apache.isis.viewer.wicket.model.models.ScalarModel;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber2;
+import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
+import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
+import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
+import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
+import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
+import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
+
+public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormExecutorContext>
+ extends FormAbstract<ObjectAdapter>
+ implements ScalarModelSubscriber2 {
+
+ private static final String ID_OK_BUTTON = "okButton";
+ private static final String ID_CANCEL_BUTTON = "cancelButton";
+
+ private static final String ID_FEEDBACK = "feedback";
+
+ protected final List<ScalarPanelAbstract2> paramPanels = Lists.newArrayList();
+
+ private final Component parentPanel;
+ private final WicketViewerSettings settings;
+ private final T formExecutorContext;
+
+ private final AjaxButton okButton;
+ private final AjaxButton cancelButton;
+
+ public PromptFormAbstract(
+ final String id,
+ final Component parentPanel,
+ final WicketViewerSettings settings,
+ final T model) {
+ super(id, model);
+ this.parentPanel = parentPanel;
+ this.settings = settings;
+ this.formExecutorContext = model;
+
+ setOutputMarkupId(true); // for ajax button
+ addParameters();
+
+ FormFeedbackPanel formFeedback = new FormFeedbackPanel(ID_FEEDBACK);
+ addOrReplace(formFeedback);
+
+ okButton = addOkButton();
+ cancelButton = addCancelButton();
+ configureButtons(okButton, cancelButton);
+ }
+
+ @Override
+ public void renderHead(final IHeaderResponse response) {
+ super.renderHead(response);
+
+ response.render(OnDomReadyHeaderItem.forScript(
+ String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PARAMETER, '%s')", getMarkupId())));
+
+ }
+
+ protected abstract void addParameters();
+
+ protected AjaxButton addOkButton() {
+
+ final IModel<ObjectAdapter> model = getModel();
+
+ AjaxButton okButton = settings.isUseIndicatorForFormSubmit()
+ ? new IndicatingAjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onSubmit(AjaxRequestTarget target, Form<?> form) {
+ final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel)
+ .getActionPrompt();
+ if (actionPromptIfAny != null) {
+ actionPromptIfAny.closePrompt(target);
+ }
+
+ final ObjectAdapter targetAdapter = model.getObject();
+
+ onSubmitOf(target, form, this);
+
+ IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().flush();
+ IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().getPersistenceManager()
+ .flush();
+ // update target, since version updated (concurrency checks)
+ final Page page = target.getPage();
+ if (page instanceof EntityPage) {
+ final EntityPage entityPage = (EntityPage) page;
+ final EntityModel pageModel = entityPage.getUiHintContainerIfAny();
+ pageModel.setObject(targetAdapter);
+
+ page.visitChildren(new IVisitor<Component, Object>() {
+ @Override
+ public void component(
+ final Component component,
+ final IVisit<Object> visit) {
+
+ final IModel<?> componentModel = component.getDefaultModel();
+ if (componentModel instanceof ScalarModel) {
+ final ScalarModel scalarModel = (ScalarModel) componentModel;
+ scalarModel.reset();
+ }
+ }
+ });
+ }
+ }
+
+ @Override
+ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
+ super.updateAjaxAttributes(attributes);
+ if (settings.isPreventDoubleClickForFormSubmit()) {
+ PanelUtil.disableBeforeReenableOnComplete(attributes, this);
+ }
+ }
+
+ @Override
+ protected void onError(AjaxRequestTarget target, Form<?> form) {
+ super.onError(target, form);
+ target.add(form);
+ }
+ }
+ : new AjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onSubmit(AjaxRequestTarget target, Form<?> form) {
+ onSubmitOf(target, form, this);
+ }
+
+ @Override
+ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
+ super.updateAjaxAttributes(attributes);
+ if (settings.isPreventDoubleClickForFormSubmit()) {
+ PanelUtil.disableBeforeReenableOnComplete(attributes, this);
+ }
+ }
+
+ @Override
+ protected void onError(AjaxRequestTarget target, Form<?> form) {
+ super.onError(target, form);
+ target.add(form);
+ }
+ };
+ okButton.add(new JGrowlBehaviour());
+ setDefaultButton(okButton);
+ add(okButton);
+ return okButton;
+ }
+
+ protected AjaxButton addCancelButton() {
+ final AjaxButton cancelButton = new AjaxButton(ID_CANCEL_BUTTON, new ResourceModel("cancelLabel")) {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void onSubmit(final AjaxRequestTarget target, Form<?> form) {
+ final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel)
+ .getActionPrompt();
+ if (actionPromptIfAny != null) {
+ actionPromptIfAny.closePrompt(target);
+ }
+
+ onCancel(target, this);
+
+ }
+ };
+ // so can submit with invalid content (eg mandatory params missing)
+ cancelButton.setDefaultFormProcessing(false);
+
+ add(cancelButton);
+
+ return cancelButton;
+ }
+
+ protected void configureButtons(final AjaxButton okButton, final AjaxButton cancelButton) {
+
+ if (formExecutorContext.getPromptStyle() == PromptStyle.INLINE) {
+ cancelButton.add(new AbstractDefaultAjaxBehavior() {
+
+ private static final String PRE_JS =
+ "" + "$(document).ready( function() { \n"
+ + " $(document).bind('keyup', function(evt) { \n"
+ + " if (evt.keyCode == 27) { \n";
+ private static final String POST_JS =
+ "" + " evt.preventDefault(); \n "
+ + " } \n"
+ + " }); \n"
+ + "});";
+
+ @Override
+ public void renderHead(final Component component, final IHeaderResponse response) {
+ super.renderHead(component, response);
+
+ final String javascript = PRE_JS + getCallbackScript() + POST_JS;
+ response.render(
+ JavaScriptContentHeaderItem.forScript(javascript, null, null));
+ }
+
+ @Override
+ protected void respond(final AjaxRequestTarget target) {
+ onCancel(target, cancelButton);
+ }
+
+ });
+ }
+ }
+
+ private EntityModel getPageUiHintContainerIfAny() {
+ Page page = getPage();
+ if (page instanceof EntityPage) {
+ EntityPage entityPage = (EntityPage) page;
+ return entityPage.getUiHintContainerIfAny();
+ }
+ return null;
+ }
+
+ private void onSubmitOf(
+ final AjaxRequestTarget target,
+ final Form<?> form,
+ final AjaxButton okButton) {
+
+ setLastFocusHint(target, okButton);
+
+ final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
+ boolean succeeded = formExecutorContext.getFormExecutor()
+ .executeAndProcessResults(target, form, promptStyle);
+ if (succeeded) {
+ if (promptStyle == PromptStyle.DIALOG) {
+ // the Wicket ajax callbacks will have just started to hide the veil
+ // we now show it once more, so that a veil continues to be shown until the
+ // new page is rendered.
+ target.appendJavaScript("isisShowVeil();\n");
+ }
+
+ okButton.send(getPage(), Broadcast.EXACT, newCompletedEvent(target, form));
+
+ } else {
+
+ final StringBuilder builder = new StringBuilder();
+
+ // ensure any jGrowl errors are shown
+ // (normally would be flushed when traverse to next page).
+ String errorMessagesIfAny = JGrowlUtil.asJGrowlCalls(getAuthenticationSession().getMessageBroker());
+ builder.append(errorMessagesIfAny);
+
+ // append the JS to the response.
+ String buf = builder.toString();
+ target.appendJavaScript(buf);
+ }
+
+ rebuildGuiAfterInlinePromptDoneIfNec(target);
+
+ target.add(form);
+
+ }
+
+ private void setLastFocusHint(final AjaxRequestTarget target, final AjaxButton ajaxButton) {
+
+ // String lastFocusedElementId = target.getLastFocusedElementId();
+ // System.out.println("onSubmitOf, lastFocusedElementId = " + lastFocusedElementId);
+ // System.out.println("onSubmitOf, ajaxButton.getPath() = " + ajaxButton.getPath());
+
+ final EntityModel entityModel = getPageUiHintContainerIfAny();
+ if (entityModel == null) {
+ return;
+ }
+ ObjectAdapterMemento oam = entityModel.getObjectAdapterMemento();
+ if (oam == null) {
+ return;
+ }
+ Component parentPanel = this.parentPanel;
+ MarkupContainer parent = parentPanel.getParent();
+ if (parent != null) {
+ entityModel.setHint(getPage(), PageAbstract.UIHINT_FOCUS, parent.getPageRelativePath());
+ }
+ }
+
+ protected abstract Object newCompletedEvent(
+ final AjaxRequestTarget target,
+ final Form<?> form);
+
+ @Override
+ public void onError(AjaxRequestTarget target, ScalarPanelAbstract2 scalarPanel) {
+ if (scalarPanel != null) {
+ // ensure that any feedback error associated with the providing component is shown.
+ target.add(scalarPanel);
+ }
+ }
+
+ public void onCancel(
+ final AjaxRequestTarget target,
+ final AjaxButton cancelButton) {
+
+ setLastFocusHint(target, cancelButton);
+
+ rebuildGuiAfterInlinePromptDoneIfNec(target);
+
+ }
+
+ private void rebuildGuiAfterInlinePromptDoneIfNec(final AjaxRequestTarget target) {
+ final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
+ if (promptStyle == PromptStyle.INLINE &&
+ formExecutorContext.getInlinePromptContext() != null) {
+
+ formExecutorContext.reset();
+
+ rebuildGuiAfterInlinePromptDone(target);
+ }
+ }
+
+ private void rebuildGuiAfterInlinePromptDone(final AjaxRequestTarget target) {
+ // replace
+ final String id = parentPanel.getId();
+ final MarkupContainer parent = parentPanel.getParent();
+
+ final WebMarkupContainer replacementPropertyEditFormPanel = new WebMarkupContainer(id);
+ replacementPropertyEditFormPanel.setVisible(false);
+
+ parent.addOrReplace(replacementPropertyEditFormPanel);
+
+ // change visibility of inline components
+ formExecutorContext.getInlinePromptContext().onCancel();
+
+ // redraw
+ MarkupContainer scalarTypeContainer = formExecutorContext.getInlinePromptContext()
+ .getScalarTypeContainer();
+
+ if (scalarTypeContainer != null) {
+ String markupId = scalarTypeContainer.getMarkupId();
+ target.appendJavaScript(
+ String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PROPERTY, '%s')",
+ markupId));
+ }
+
+ target.add(parent);
+ }
+
+ private AjaxButton defaultSubmittingComponent() {
+ return okButton;
+ }
+
+ // workaround for https://issues.apache.org/jira/browse/WICKET-6364
+ @Override
+ protected void appendDefaultButtonField() {
+ AppendingStringBuffer buffer = new AppendingStringBuffer();
+ buffer.append(
+ "<div style=\"width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden\">");
+ buffer.append("<input type=\"text\" tabindex=\"-1\" autocomplete=\"off\"/>");
+ Component submittingComponent = (Component) this.defaultSubmittingComponent();
+ buffer.append("<input type=\"submit\" tabindex=\"-1\" name=\"");
+ buffer.append(this.defaultSubmittingComponent().getInputName());
+ buffer.append("\" onclick=\" var b=document.getElementById(\'");
+ buffer.append(submittingComponent.getMarkupId());
+ buffer.append(
+ "\'); if (b!=null&&b.onclick!=null&&typeof(b.onclick) != \'undefined\') { var r = Wicket.bind(b.onclick, b)(); if (r != false) b.click(); } else { b.click(); }; return false;\" ");
+ buffer.append(" />");
+ buffer.append("</div>");
+ this.getResponse().write(buffer);
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/0d81e11a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
index 7279da3..f1aa71e 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormPanelAbstract.java
@@ -19,48 +19,10 @@
package org.apache.isis.viewer.wicket.ui.panels;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
-import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
-import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.event.Broadcast;
-import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
-import org.apache.wicket.markup.head.IHeaderResponse;
-import org.apache.wicket.markup.head.JavaScriptContentHeaderItem;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.util.string.AppendingStringBuffer;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
-import org.apache.isis.applib.annotation.PromptStyle;
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
-import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
-import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber2;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
-import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
-import org.apache.isis.viewer.wicket.ui.errors.JGrowlBehaviour;
-import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
-import org.apache.isis.viewer.wicket.ui.pages.PageAbstract;
-import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
/**
* {@link PanelAbstract Panel} to capture the arguments for an action
@@ -68,365 +30,12 @@ import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
*/
public abstract class PromptFormPanelAbstract<T extends IModel<?> & FormExecutorContext> extends PanelAbstract<T> {
- private static final String ID_OK_BUTTON = "okButton";
- private static final String ID_CANCEL_BUTTON = "cancelButton";
-
public PromptFormPanelAbstract(final String id, final T model) {
super(id, model);
}
- public static abstract class FormAbstract<T extends IModel<ObjectAdapter> & FormExecutorContext> extends Form<ObjectAdapter>
- implements ScalarModelSubscriber2 {
-
- protected static final String ID_FEEDBACK = "feedback";
-
- protected final List<ScalarPanelAbstract2> paramPanels = Lists.newArrayList();
- protected final Component parentPanel;
- private final WicketViewerSettings settings;
- private final T formExecutorContext;
-
- private final AjaxButton okButton;
- private final AjaxButton cancelButton;
-
- public FormAbstract(
- final String id,
- final Component parentPanel,
- final WicketViewerSettings settings,
- final T model) {
- super(id, model);
- this.parentPanel = parentPanel;
- this.settings = settings;
- this.formExecutorContext = model;
-
- setOutputMarkupId(true); // for ajax button
- addParameters();
-
- FormFeedbackPanel formFeedback = new FormFeedbackPanel(ID_FEEDBACK);
- addOrReplace(formFeedback);
-
- okButton = addOkButton();
- cancelButton = addCancelButton();
- configureButtons(okButton, cancelButton);
- }
-
-
- protected abstract void addParameters();
-
- protected AjaxButton addOkButton() {
-
- final IModel<ObjectAdapter> model = getModel();
-
- AjaxButton okButton = settings.isUseIndicatorForFormSubmit()
- ? new IndicatingAjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void onSubmit(AjaxRequestTarget target, Form<?> form) {
- final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel).getActionPrompt();
- if(actionPromptIfAny != null) {
- actionPromptIfAny.closePrompt(target);
- }
-
- final ObjectAdapter targetAdapter = model.getObject();
-
- onSubmitOf(target, form, this);
-
- IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().flush();
- IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().getPersistenceManager().flush();
- // update target, since version updated (concurrency checks)
- final Page page = target.getPage();
- if(page instanceof EntityPage) {
- final EntityPage entityPage = (EntityPage) page;
- final EntityModel pageModel = entityPage.getUiHintContainerIfAny();
- pageModel.setObject(targetAdapter);
-
- page.visitChildren(new IVisitor<Component, Object>() {
- @Override
- public void component(
- final Component component,
- final IVisit<Object> visit) {
-
- final IModel<?> componentModel = component.getDefaultModel();
- if(componentModel instanceof ScalarModel) {
- final ScalarModel scalarModel = (ScalarModel) componentModel;
- scalarModel.reset();
- }
- }
- });
-
- }
-
- }
-
- @Override
- protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
- super.updateAjaxAttributes(attributes);
- if(settings.isPreventDoubleClickForFormSubmit()) {
- PanelUtil.disableBeforeReenableOnComplete(attributes, this);
- }
- }
-
- @Override
- protected void onError(AjaxRequestTarget target, Form<?> form) {
- super.onError(target, form);
- target.add(form);
- }
- }
- : new AjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void onSubmit(AjaxRequestTarget target, Form<?> form) {
- onSubmitOf(target, form, this);
- }
-
- @Override
- protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
- super.updateAjaxAttributes(attributes);
- if(settings.isPreventDoubleClickForFormSubmit()) {
- PanelUtil.disableBeforeReenableOnComplete(attributes, this);
- }
- }
-
- @Override
- protected void onError(AjaxRequestTarget target, Form<?> form) {
- super.onError(target, form);
- target.add(form);
- }
- };
- okButton.add(new JGrowlBehaviour());
- setDefaultButton(okButton);
- add(okButton);
- return okButton;
- }
-
-
- protected AjaxButton addCancelButton() {
- final AjaxButton cancelButton = new AjaxButton(ID_CANCEL_BUTTON, new ResourceModel("cancelLabel")) {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void onSubmit(final AjaxRequestTarget target, Form<?> form) {
- final ActionPrompt actionPromptIfAny = ActionPromptProvider.Util.getFrom(parentPanel).getActionPrompt();
- if(actionPromptIfAny != null) {
- actionPromptIfAny.closePrompt(target);
- }
-
- onCancel(target, this);
-
- }
- };
- // so can submit with invalid content (eg mandatory params missing)
- cancelButton.setDefaultFormProcessing(false);
-
- add(cancelButton);
-
- return cancelButton;
- }
-
- protected void configureButtons(final AjaxButton okButton, final AjaxButton cancelButton) {
-
- if(formExecutorContext.getPromptStyle() == PromptStyle.INLINE) {
- cancelButton.add(new AbstractDefaultAjaxBehavior() {
-
- private static final String PRE_JS =
- ""+"$(document).ready( function() { \n"
- + " $(document).bind('keyup', function(evt) { \n"
- + " if (evt.keyCode == 27) { \n";
- private static final String POST_JS =
- ""+" evt.preventDefault(); \n "
- + " } \n"
- + " }); \n"
- + "});";
-
- @Override
- public void renderHead(final Component component, final IHeaderResponse response) {
- super.renderHead(component, response);
-
- final String javascript = PRE_JS + getCallbackScript() + POST_JS;
- response.render(
- JavaScriptContentHeaderItem.forScript(javascript, null, null));
- }
-
- @Override
- protected void respond(final AjaxRequestTarget target) {
- onCancel(target, cancelButton);
- }
-
- });
- }
- }
-
- private EntityModel getPageUiHintContainerIfAny() {
- Page page = getPage();
- if(page instanceof EntityPage) {
- EntityPage entityPage = (EntityPage) page;
- return entityPage.getUiHintContainerIfAny();
- }
- return null;
- }
-
- private void onSubmitOf(
- final AjaxRequestTarget target,
- final Form<?> form,
- final AjaxButton okButton) {
-
- setLastFocusHint(target, okButton);
-
- final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
- boolean succeeded = formExecutorContext.getFormExecutor().executeAndProcessResults(target, form, promptStyle);
- if(succeeded) {
- if(promptStyle == PromptStyle.DIALOG) {
- // the Wicket ajax callbacks will have just started to hide the veil
- // we now show it once more, so that a veil continues to be shown until the
- // new page is rendered.
- target.appendJavaScript("isisShowVeil();\n");
- }
-
- okButton.send(getPage(), Broadcast.EXACT, newCompletedEvent(target, form));
-
- } else {
-
- final StringBuilder builder = new StringBuilder();
-
- // ensure any jGrowl errors are shown
- // (normally would be flushed when traverse to next page).
- String errorMessagesIfAny = JGrowlUtil.asJGrowlCalls(getAuthenticationSession().getMessageBroker());
- builder.append(errorMessagesIfAny);
-
- // append the JS to the response.
- String buf = builder.toString();
- target.appendJavaScript(buf);
- }
-
- rebuildGuiAfterInlinePromptDoneIfNec(target);
-
- target.add(form);
-
- }
-
- private void setLastFocusHint(final AjaxRequestTarget target, final AjaxButton ajaxButton) {
-
-// String lastFocusedElementId = target.getLastFocusedElementId();
-// System.out.println("onSubmitOf, lastFocusedElementId = " + lastFocusedElementId);
-// System.out.println("onSubmitOf, ajaxButton.getPath() = " + ajaxButton.getPath());
-
- final EntityModel entityModel = getPageUiHintContainerIfAny();
- if (entityModel == null) {
- return;
- }
- ObjectAdapterMemento oam = entityModel.getObjectAdapterMemento();
- if(oam == null) {
- return;
- }
- Component parentPanel = this.parentPanel;
- MarkupContainer parent = parentPanel.getParent();
- if(parent != null) {
- entityModel.setHint(getPage(), PageAbstract.UIHINT_FOCUS, parent.getPageRelativePath());
- }
- }
-
- private AuthenticationSession getAuthenticationSession() {
- return getIsisSessionFactory().getCurrentSession().getAuthenticationSession();
- }
-
- protected IsisSessionFactory getIsisSessionFactory() {
- return IsisContext.getSessionFactory();
- }
-
-
- protected abstract Object newCompletedEvent(
- final AjaxRequestTarget target,
- final Form<?> form);
-
- @Override
- public void onError(AjaxRequestTarget target, ScalarPanelAbstract2 scalarPanel) {
- if(scalarPanel != null) {
- // ensure that any feedback error associated with the providing component is shown.
- target.add(scalarPanel);
- }
- }
-
- public void onCancel(
- final AjaxRequestTarget target, final AjaxButton cancelButton) {
-
-// String lastFocusedElementId = target.getLastFocusedElementId();
-// System.out.println("onCancel, lastFocusedElementId = " + lastFocusedElementId);
-
- setLastFocusHint(target, cancelButton);
-
- rebuildGuiAfterInlinePromptDoneIfNec(target);
-
- }
-
- private void rebuildGuiAfterInlinePromptDoneIfNec(final AjaxRequestTarget target) {
- final PromptStyle promptStyle = formExecutorContext.getPromptStyle();
- if(promptStyle == PromptStyle.INLINE &&
- formExecutorContext.getInlinePromptContext() != null) {
-
- formExecutorContext.reset();
-
- rebuildGuiAfterInlinePromptDone(target);
- }
- }
-
- private void rebuildGuiAfterInlinePromptDone(final AjaxRequestTarget target) {
- // replace
- final String id = parentPanel.getId();
- final MarkupContainer parent = parentPanel.getParent();
-
- final WebMarkupContainer replacementPropertyEditFormPanel = new WebMarkupContainer(id);
- replacementPropertyEditFormPanel.setVisible(false);
-
- parent.addOrReplace(replacementPropertyEditFormPanel);
-
- // change visibility of inline components
- formExecutorContext.getInlinePromptContext().onCancel();
-
- // redraw
- MarkupContainer scalarTypeContainer = formExecutorContext.getInlinePromptContext()
- .getScalarTypeContainer();
-
- if(scalarTypeContainer != null) {
- String markupId = scalarTypeContainer.getMarkupId();
- target.appendJavaScript(
- String.format("Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PROPERTY, '%s')",
- markupId));
- }
- // target.appendJavaScript(
- // String.format("var $parent = $('%s').parent().parent().parent().parent().parent().parent(); Wicket.Event.publish(Isis.Topic.FOCUS_FIRST_PARAMETER, $parent[0].id)",
- // parentPanel.getMarkupId()));
-
- target.add(parent);
- }
-
- private AjaxButton defaultSubmittingComponent() {
- return okButton;
- }
-
- // workaround for https://issues.apache.org/jira/browse/WICKET-6364
- @Override
- protected void appendDefaultButtonField() {
- AppendingStringBuffer buffer = new AppendingStringBuffer();
- buffer.append("<div style=\"width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden\">");
- buffer.append("<input type=\"text\" tabindex=\"-1\" autocomplete=\"off\"/>");
- Component submittingComponent = (Component)this.defaultSubmittingComponent();
- buffer.append("<input type=\"submit\" tabindex=\"-1\" name=\"");
- buffer.append(this.defaultSubmittingComponent().getInputName());
- buffer.append("\" onclick=\" var b=document.getElementById(\'");
- buffer.append(submittingComponent.getMarkupId());
- buffer.append("\'); if (b!=null&&b.onclick!=null&&typeof(b.onclick) != \'undefined\') { var r = Wicket.bind(b.onclick, b)(); if (r != false) b.click(); } else { b.click(); }; return false;\" ");
- buffer.append(" />");
- buffer.append("</div>");
- this.getResponse().write(buffer);
- }
-
-
- }
-
-
//region > dependencies
@com.google.inject.Inject
WicketViewerSettings settings;