Author: nbelaevski
Date: 2009-01-06 14:28:11 -0500 (Tue, 06 Jan 2009)
New Revision: 12142
Modified:
trunk/ui/modal-panel/src/main/config/component/modalPanel.xml
trunk/ui/modal-panel/src/main/java/org/richfaces/component/UIModalPanel.java
trunk/ui/modal-panel/src/main/java/org/richfaces/renderkit/ModalPanelRendererBase.java
trunk/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js
trunk/ui/modal-panel/src/main/templates/org/richfaces/htmlModalPanel.jspx
Log:
https://jira.jboss.org/jira/browse/RF-5588
Modified: trunk/ui/modal-panel/src/main/config/component/modalPanel.xml
===================================================================
--- trunk/ui/modal-panel/src/main/config/component/modalPanel.xml 2009-01-06 17:24:58 UTC
(rev 12141)
+++ trunk/ui/modal-panel/src/main/config/component/modalPanel.xml 2009-01-06 19:28:11 UTC
(rev 12142)
@@ -295,5 +295,10 @@
<description>Defines whether to trim or not elements inside modalPanel. Default
value is "true"</description>
<defaultvalue>true</defaultvalue>
</property>
+
+ <property>
+ <name>domElementAttachment</name>
+ <classname>java.lang.String</classname>
+ </property>
</component>
</components>
Modified: trunk/ui/modal-panel/src/main/java/org/richfaces/component/UIModalPanel.java
===================================================================
---
trunk/ui/modal-panel/src/main/java/org/richfaces/component/UIModalPanel.java 2009-01-06
17:24:58 UTC (rev 12141)
+++
trunk/ui/modal-panel/src/main/java/org/richfaces/component/UIModalPanel.java 2009-01-06
19:28:11 UTC (rev 12142)
@@ -90,6 +90,9 @@
public abstract boolean isTrimOverlayedElements();
public abstract void setTrimOverlayedElements(boolean trim);
+ public abstract String getDomElementAttachment();
+ public abstract void setDomElementAttachment(String domElementAttachment);
+
public boolean getRendersChildren() {
return true;
}
Modified:
trunk/ui/modal-panel/src/main/java/org/richfaces/renderkit/ModalPanelRendererBase.java
===================================================================
---
trunk/ui/modal-panel/src/main/java/org/richfaces/renderkit/ModalPanelRendererBase.java 2009-01-06
17:24:58 UTC (rev 12141)
+++
trunk/ui/modal-panel/src/main/java/org/richfaces/renderkit/ModalPanelRendererBase.java 2009-01-06
19:28:11 UTC (rev 12142)
@@ -22,8 +22,10 @@
package org.richfaces.renderkit;
import java.io.IOException;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
+import java.util.Set;
import java.util.Map.Entry;
import javax.faces.component.UIComponent;
@@ -94,11 +96,27 @@
return UIModalPanel.class;
}
+ private static final Set<String> ALLOWED_ATTACHMENT_OPTIONS = new
HashSet<String>();
+ static {
+ ALLOWED_ATTACHMENT_OPTIONS.add("body");
+ ALLOWED_ATTACHMENT_OPTIONS.add("parent");
+ ALLOWED_ATTACHMENT_OPTIONS.add("form");
+ }
+
//TODO nick - add messages
public void checkOptions(FacesContext context, UIModalPanel panel) {
if (panel.isAutosized() && panel.isResizeable()) {
throw new IllegalArgumentException("Autosized modal panel can't be
resizeable.");
}
+
+ String domElementAttachment = panel.getDomElementAttachment();
+ if (domElementAttachment != null && domElementAttachment.trim().length() != 0)
{
+ if (!ALLOWED_ATTACHMENT_OPTIONS.contains(domElementAttachment)) {
+ throw new IllegalArgumentException("Value '" + domElementAttachment +
"' of domElementAttachment attribute is illegal. " +
+ "Allowed values are: " + ALLOWED_ATTACHMENT_OPTIONS);
+ }
+ }
+
if (panel.getMinHeight() != -1) {
if (panel.getMinHeight() < sizeA) {
throw new IllegalArgumentException();
Modified:
trunk/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js
===================================================================
---
trunk/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js 2009-01-06
17:24:58 UTC (rev 12141)
+++
trunk/ui/modal-panel/src/main/resources/org/richfaces/renderkit/html/scripts/modalPanel.js 2009-01-06
19:28:11 UTC (rev 12142)
@@ -224,7 +224,7 @@
this.borders = null;
setTimeout(function() {
- if (this.floatedToBody) {
+ if (this.domReattached) {
var element = this.id;
var parent = element.parentNode;
if (parent) {
@@ -487,11 +487,35 @@
this.preventFocus();
- if (!this.floatedToBody) {
+ if (!this.domReattached) {
this.parent = element.parentNode;
- this._saveInputValues(element);
- document.body.insertBefore(this.parent.removeChild(element), null);
- this.floatedToBody = true;
+
+ var domElementAttachment;
+ if (opts) {
+ domElementAttachment = opts.domElementAttachment;
+ }
+
+ if (!domElementAttachment) {
+ domElementAttachment = this.options.domElementAttachment;
+ }
+
+ var newParent;
+ if ('parent' == domElementAttachment) {
+ newParent = this.parent;
+ } else if ('form' == domElementAttachment) {
+ newParent = this._findForm(element) || document.body;
+ } else {
+ //default - body
+ newParent = document.body;
+ }
+
+ if (newParent != this.parent) {
+ this._saveInputValues(element);
+ newParent.insertBefore(this.parent.removeChild(element), null);
+ this.domReattached = true;
+ } else {
+ Element.show(this.parent);
+ }
}
var eCdiv = $(this.cdiv);
@@ -731,11 +755,20 @@
var element = $(this.id);
Element.hide(element);
- if (this.floatedToBody && this.parent) {
- this._saveInputValues(element);
- document.body.removeChild(element);
- this.parent.appendChild(element);
- this.floatedToBody = false;
+ if (this.parent) {
+ if (this.domReattached) {
+ this._saveInputValues(element);
+
+ var pNode = element.parentNode;
+ if (pNode) {
+ pNode.removeChild(element);
+ }
+ this.parent.appendChild(element);
+
+ this.domReattached = false;
+ } else {
+ Element.hide(this.parent);
+ }
}
var event = {};
@@ -889,13 +922,26 @@
return vetoes;
},
+ _findForm: function(elt) {
+ var target = elt;
+ while (target) {
+ if (!target.tagName /* document node doesn't have tagName */
+ || target.tagName.toLowerCase() != "form") {
+
+ target = target.parentNode;
+ } else {
+ break;
+ }
+ }
+
+ return target;
+ },
+
setStateInput: function(e) {
var target = Event.element(e);
if (e && target) {
// Concret input but not entire form is a target element for onsubmit in FF
- while (target && target.tagName.toLowerCase()!="form") {
- target = target.parentNode;
- }
+ target = this._findForm(target);
var input = document.createElement("input");
input.type = "hidden";
Modified: trunk/ui/modal-panel/src/main/templates/org/richfaces/htmlModalPanel.jspx
===================================================================
--- trunk/ui/modal-panel/src/main/templates/org/richfaces/htmlModalPanel.jspx 2009-01-06
17:24:58 UTC (rev 12141)
+++ trunk/ui/modal-panel/src/main/templates/org/richfaces/htmlModalPanel.jspx 2009-01-06
19:28:11 UTC (rev 12142)
@@ -192,7 +192,7 @@
<f:call name="writeEventHandlerFunction"><f:parameter
value="onhide" /></f:call>,
<f:call name="writeEventHandlerFunction"><f:parameter
value="onbeforeshow"/></f:call>,
<f:call name="writeEventHandlerFunction"><f:parameter
value="onbeforehide" /></f:call>,
-
+ domElementAttachment: "#{component.domElementAttachment}",
keepVisualState: #{component.keepVisualState},
showWhenRendered: #{component.showWhenRendered},
selectBehavior: "#{component.tridentIVEngineSelectBehavior}",