Fadein and Fadeout a Richfaces ModalPanel
Today i explain you a cool combination for rich:modalPanel and rich:effect.
In the richfaces forum i found a article about a modalpanel with scriptaculous-effects (“fade-in a modalpanel”). The answer was a link to the official richfaces demo-application (photoalbum). There we can find a login-dialog (svn source) with a “appear-effect”:
<rich:modalPanel id="loginPanel"
onshow="applyModalPanelEffect('loginPanel', appearFunc,{delay: 0.5, afterFinish: function(){$('loginPanelForm:username').focus();}})"
styleClass="login-panel"
showWhenRendered="#{authenticator.loginFailed}"
width="400" height="150" autosized="true">
<f:facet name="header">#{messages['login.login']}</f:facet>
<f:facet name="controls">
<h:panelGroup id="loginPanelHideControl">
<h:graphicImage value="/img/modal/close.png" style="cursor:pointer"
id="loginPanelhidelink" onclick="#{rich:component('loginPanel')}.hide();"/>
</h:panelGroup>
</f:facet>
...
<rich:effect type="Appear" name="appearFunc"/>
...
The javascript method applyModalPanelEffect can be found in the photoalbum.js (svn source):
function applyModalPanelEffect(panelId, effectFunc, params) {
if (panelId && effectFunc) {
var modalPanel = $(panelId);
if (modalPanel && modalPanel.component) {
var component = modalPanel.component;
var div = component.getSizedElement();
Element.hide(div);
effectFunc.call(this, Object.extend({targetId: div.id}, params || {}));}}
}
With this the rich:modalPanel will not shown immediately … it appears
This was the “fade-in part”.
I improved the code for the “fade-out part”, first the dialog:
<!-- first the effects -->
<rich:effect type="Appear" name="appearDialog"/>
<rich:effect type="Fade" name="disappearDialog"/>
<!-- to keep the dialog-code clean -->
<c:set var="closeDialog" value="hideModalPanelWithEffect('myDialog',disappearDialog,{delay:0.1,duration:0.5})"/>
<rich:modalPanel id="myDialog"
onshow="showModalPanelWithEffect('myDialog',appearDialog,{delay:0.1,duration:0.5})"
width="610" height="350" minHeight="350" autosized="true" shadowDepth="0">
<f:facet name="controls">
<h:panelGroup>
<h:graphicImage value="/img/modal/close.png" style="cursor:pointer" onclick="#{closeDialog}"/>
</h:panelGroup>
</f:facet>
</rich:modalPanel>
and the javascript:
function applyModalPanelEffect(panelId, effectFunc, params, hide) {
if (panelId && effectFunc) {
var modalPanel = $(panelId);
if (modalPanel && modalPanel.component) {
var component = modalPanel.component;
var div = component.getSizedElement();
if (hide) {
Element.hide(div);
}
effectFunc.call(this, Object.extend( {targetId : div.id}, params || {}));}}
}
function showModalPanelWithEffect(panelId, showEffect, params) {
applyModalPanelEffect(panelId, showEffect, params, true);
}
function hideModalPanelWithEffect(panelId, hideEffect, params) {
var _params = params;
_params['afterFinish'] = function(){Richfaces.hideModalPanel(panelId)};
applyModalPanelEffect(panelId, hideEffect, params, false);
}
Now the dialog call showModalPanelWithEffect to fade-in and hideModalPanelWithEffect to fade-out.
Try it
Categories: Richfaces
Appear, Effect, Fadein, Fadeout, ModalPanel, Richfaces, Scriptaculous