You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Gerhard Petracek <ge...@gmail.com> on 2008/01/04 11:24:19 UTC
Re: [Trinidad] How to force rendering a page after closing a popup by returnFromDialog
hello alexander,
you have to use the ppr mechanism of trinidad.
you'll find more details at:
http://myfaces.apache.org/trinidad/devguide/ppr.html
regards,
gerhard
2008/1/3, Alexander Pohl <po...@thinkapps.de>:
>
> Hi all,
>
> I am quite new to Trinidad and JSF and have the following problem: in a
> page I list some entities from a
> TrinidadEntityQuery. The page displays a commandlink to let the user
> delete one of those entities. The
> deletion shall be confirmed by the user by clicking 'Ok' in a popup
> dialog. The dialog then passes back
> the enity's id to the main page's backup bean which has a return
> listener method. All works fine BUT the
> main page is not re-rendered after the deletion of the entity, so the
> entity still is displayed. In my application
> there are other usages of popups to update entites in quite the same way
> (main page listing enitity, popup
> editing entitiy, main page shows changes after popup has closed), so I
> really have no clue why in this
> case nothing happens.
>
> The table and commandling portion of the main page 'enginetypes.xhtml'
> looks like this:
>
> <!-- Table -->
> <tr:form>
> <tr:table var="engineType"
> value="#{engineTypeHome.entityQuery.dataModel}"
> rows="#{engineTypeHome.entityQuery.maxResults}" rowBandingInterval="1"
> width="100%">
> <f:facet name="header">
> <tr:outputText value="Engine Types"/>
> </f:facet>
>
> <!-- the edit button, redirects to this page
> with the currently selected engineTypeId -->
> <tr:column inlineStyle="width:4em">
> <f:facet name="header">
> <tr:outputText value="Edit"
> styleClass="columnUnsortableHeaderText"/>
> </f:facet>
> <s:link view="/enginetypes.xhtml">
> <f:param name="engineTypeId"
> value="#{engineType.id}"/>
> <img src="images/edit.gif"
> alt="#{engineType.id}" style="border:0"/>
> </s:link>
> </tr:column>
>
> <!-- the delete button, calls the
> engineTypeHome's remove method -->
> <tr:column inlineStyle="width:4em">
> <f:facet name="header">
> <tr:outputText value="Delete"
> styleClass="columnUnsortableHeaderText"/>
> </f:facet>
> <tr:commandLink
> action="dialog:deleteEntity"
> immediate="true"
> partialSubmit="true"
> useWindow="true"
> windowWidth="650"
> windowHeight="300"
>
> launchListener="#{engineType.addConfirmDeletionParams}"
>
> returnListener="#{engineTypeHome.handleConfirmDeletionDialogReturn}">
> <img src="images/delete.gif"
> alt="#{engineType.name}" style="border:0"/>
> </tr:commandLink>
> </tr:column>
>
> <!-- the first (and only) column displays the
> engineType's name -->
> <tr:column sortable="true"
> sortProperty="upper(engineType.name)">
> <f:facet name="header">
> <tr:outputText value="Name"
> styleClass="columnSortableHeaderText"/>
> </f:facet>
> <tr:outputText value="#{engineType.name}"/>
> </tr:column>
> </tr:table>
> </tr:form>
>
> This is the code of the backing bean 'EngineTypeHome.java':
>
> @Name("engineTypeHome")
> @Scope(ScopeType.CONVERSATION)
> public class EngineTypeHome extends HomeBase<EngineType> {
> private TrinidadEntityQuery engineTypesQuery;
>
> @In
> private EntityManager entityManager;
>
> public EngineTypeHome() {
> super("engineTypeId");
> }
>
> @Factory("selectedEngineType")
> public EngineType init() {
> return getInstance();
> }
>
> @Override
> public boolean checkRemovable() {
> EngineType engineType = getInstance();
> return checkRemovable(engineType);
> }
>
> public boolean checkRemovable(EngineType engineType) {
> long usageCount = (Long) entityManager.createQuery("select
> count(event) from Event event where event.engineType = :engineType")
> .setParameter("engineType", engineType)
> .getSingleResult();
>
> if(usageCount > 0) {
> FacesUtil.error("Cannot delete engine type '" +
> engineType.getName() + "'. There are events for this engine type.");
> return false;
> }
> return true;
> }
>
> @Override
> public EntityQuery getEntityQuery() {
> if (engineTypesQuery == null) {
> engineTypesQuery = new TrinidadEntityQuery();
> String ejbql = "select engineType from EngineType engineType";
> engineTypesQuery.setEjbql(ejbql);
> engineTypesQuery.setMaxResults(15);
> engineTypesQuery.setOrder("engineType.name");
> }
> return engineTypesQuery;
> }
>
> @Transactional
> public String handleConfirmDeletionDialogReturn(ReturnEvent
> returnEvent){
> Long engineTypeId = (Long) returnEvent.getReturnValue();
> if (engineTypeId != null){
> // load the entity from the database
> EngineType engineType = entityManager.find(EngineType.class,
> engineTypeId);
>
> // make sure it has been loaded (no locking currently
> activated!)
> if (engineType == null){
> FacesUtil.error("Cannot delete engine type. It may have
> been deleted in the meantime.");
> return null;
> }
>
> // actually remove it
> if (checkRemovable(engineType)){
> entityManager.joinTransaction();
> entityManager.remove(engineType);
> entityManager.flush();
> }
>
> getEntityQuery().refresh();
> FacesContext.getCurrentInstance().renderResponse();
> }
> return "removed";
> }
>
> /**
> * Calls the super save method and refreshes the entity query.
> * @return The navigation outcome of HomeBase.save().
> */
> @Override
> public String save(){
> String outcome = super.save();
> if (engineTypesQuery != null){
> engineTypesQuery.refresh();
> }
> return outcome;
> }
> }
>
> The confirmation dialog page 'delete-entity_dlg.xhtml' looks like this:
>
> <?xml version="1.0" encoding="utf-8"?>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
> <html xmlns="http://www.w3.org/1999/xhtml"
> xmlns:ui="http://java.sun.com/jsf/facelets"
> xmlns:f="http://java.sun.com/jsf/core"
> xmlns:s="http://jboss.com/products/seam/taglib"
> xmlns:tr="http://myfaces.apache.org/trinidad"
> xmlns:trh="http://myfaces.apache.org/trinidad/html">
> <head/>
> <body>
> <ui:composition template="popup_template.xhtml">
> <ui:define name="main-content">
> <script type="text/javascript" xml:space="preserve">
> // <![CDATA[
> _pprUnsupported = false;
> // ]]>
> </script>
> <tr:form defaultCommand="okButton" styleClass="noprint">
> <tr:panelFormLayout>
> <tr:outputText inlineStyle="font-size:0.8em"
> value="Please confirm the
> deletion of the #{deleteEntityBackingBean.userPrompt}"/>
> <tr:messages globalOnly="true"/>
> <tr:panelButtonBar>
> <tr:commandButton id="okButton"
> styleClass="okButton"
>
> action="#{deleteEntityBackingBean.ok}"
>
> rendered="#{deleteEntityBackingBean.initOk}"/>
> <tr:commandButton id="cancelButton"
> styleClass="cancelButton"
>
> action="#{deleteEntityBackingBean.cancel}"
> immediate="true"/>
> </tr:panelButtonBar>
> </tr:panelFormLayout>
> </tr:form>
> </ui:define>
> </ui:composition>
> </body>
> </html>
>
> And here is it's backing bean 'DeleteEntityBackingBean.java':
>
> /**
> * Backing bean for the dialog page delete-entity_dlg.xhtml.
> */
> @Name("deleteEntityBackingBean")
> @Scope(ScopeType.CONVERSATION)
> public class DeleteEntityBackingBean {
> // the message displayed to the user
> private String userPrompt;
>
> // the entity to be deleted
> private Long objectId;
>
> // if false, an initialization error occurred (missing dialog
> parameter)
> private boolean initOk = true;
>
> @Logger("etd.edit")
> private Log log;
>
> @In(create = true)
> private EntityManager entityManager;
>
> public DeleteEntityBackingBean() {
> }
>
> @Create
> @Begin
> public void create() {
> // get the dialog startup parameters
> RequestContext requestContext = RequestContext.getCurrentInstance
> ();
> objectId = (Long) requestContext.getPageFlowScope
> ().get("objectId");
> userPrompt =
> (String)requestContext.getPageFlowScope().get("userPrompt");
>
> if (objectId == null) {
> FacesUtil.error("Internal error: no object to be deleted!");
> initOk = false;
> }
> }
>
> @Transactional
> @End
> public String ok() {
> // close the dialog returning the id
> RequestContext.getCurrentInstance().returnFromDialog(objectId,
> null);
> }
>
> @Transactional
> @End
> public String cancel() {
> // close the dialog returning null
> RequestContext.getCurrentInstance().returnFromDialog(null, null);
> }
>
> public String getUserPrompt() {
> return userPrompt;
> }
>
> public boolean isInitOk() {
> return initOk;
> }
> }
>
> There is a navigation rule for the dialog in the faces-config.xml:
> ...
> <navigation-case>
> <from-outcome>dialog:deleteEntity</from-outcome>
> <to-view-id>/delete-entity_dlg.xhtml</to-view-id>
> </navigation-case>
> ...
>
> Any help appreciated,
> Alexander Pohl
>
>
> --
> ------------------------
> Alexander Pohl
> ------------------------
> Think Applications GbR
> Zionskirchstrasse 73
> D-10119 Berlin
> ------------------------
> Phone +49 30 4171 4624
> Fax +49 30 4171 4625
> Mobile +49 173 211 2864
> ------------------------
> mailto:pohl@thinkapps.de
> ------------------------
>
>
--
http://www.irian.at
Your JSF powerhouse -
JSF Consulting, Development and
Courses in English and German
Professional Support for Apache MyFaces
Re: [Trinidad] How to force rendering a page after closing a popup
by returnFromDialog
Posted by Alexander Pohl <po...@thinkapps.de>.
Thanks a lot, that does the trick. The new main page looks like this now
and it works!
<tr:form>
<tr:table id="engineTypeTable"
var="engineType"
value="#{engineTypeHome.entityQuery.dataModel}"
rows="#{engineTypeHome.entityQuery.maxResults}"
rowBandingInterval="1" width="100%"
partialTriggers="engineTypeTable:clDeleteEntity">
<f:facet name="header">
<tr:outputText value="Engine Types"/>
</f:facet>
<!-- the edit button, redirects to this site
with the currently selected engineTypeId -->
<tr:column inlineStyle="width:4em">
<f:facet name="header">
<tr:outputText value="Edit"
styleClass="columnUnsortableHeaderText"/>
</f:facet>
<s:link view="/enginetypes.xhtml">
<f:param name="engineTypeId"
value="#{engineType.id}"/>
<img src="images/edit.gif"
alt="#{engineType.id}" style="border:0"/>
</s:link>
</tr:column>
<!-- the delete button, calls the
engineTypeHome's remove method -->
<tr:column inlineStyle="width:4em">
<f:facet name="header">
<tr:outputText value="Delete"
styleClass="columnUnsortableHeaderText"/>
</f:facet>
<tr:commandLink
id="clDeleteEntity"
action="dialog:deleteEntity"
immediate="true"
partialSubmit="true"
useWindow="true"
windowWidth="650"
windowHeight="300"
launchListener="#{engineType.addConfirmDeletionParams}"
returnListener="#{engineTypeHome.handleConfirmDeletionDialogReturn}">
<img src="images/delete.gif"
alt="#{engineType.name}" style="border:0"/>
<f:param name="engineTypeId" value=""/>
</tr:commandLink>
</tr:column>
<!-- the first (and only) column displays the
engineType's name -->
<tr:column sortable="true"
sortProperty="upper(engineType.name)">
<f:facet name="header">
<tr:outputText value="Name"
styleClass="columnSortableHeaderText"/>
</f:facet>
<tr:outputText value="#{engineType.name}"/>
</tr:column>
</tr:table>
</tr:form>
Gerhard Petracek schrieb:
> hello alexander,
>
> you have to use the ppr mechanism of trinidad.
>
> you'll find more details at:
> http://myfaces.apache.org/trinidad/devguide/ppr.html
> <http://myfaces.apache.org/trinidad/devguide/ppr.html>
>
> regards,
> gerhard
>
>
>
> 2008/1/3, Alexander Pohl <pohl@thinkapps.de <ma...@thinkapps.de>>:
>
> Hi all,
>
> I am quite new to Trinidad and JSF and have the following problem:
> in a
> page I list some entities from a
> TrinidadEntityQuery. The page displays a commandlink to let the user
> delete one of those entities. The
> deletion shall be confirmed by the user by clicking 'Ok' in a popup
> dialog. The dialog then passes back
> the enity's id to the main page's backup bean which has a return
> listener method. All works fine BUT the
> main page is not re-rendered after the deletion of the entity, so the
> entity still is displayed. In my application
> there are other usages of popups to update entites in quite the
> same way
> (main page listing enitity, popup
> editing entitiy, main page shows changes after popup has closed), so I
> really have no clue why in this
> case nothing happens.
>
> The table and commandling portion of the main page 'enginetypes.xhtml'
> looks like this:
>
> <!-- Table -->
> <tr:form>
> <tr:table var="engineType"
> value="#{engineTypeHome.entityQuery.dataModel}"
> rows="#{engineTypeHome.entityQuery.maxResults}" rowBandingInterval="1"
> width="100%">
> <f:facet name="header">
> <tr:outputText value="Engine Types"/>
> </f:facet>
>
> <!-- the edit button, redirects to this page
> with the currently selected engineTypeId -->
> <tr:column inlineStyle="width:4em">
> <f:facet name="header">
> <tr:outputText value="Edit"
> styleClass="columnUnsortableHeaderText"/>
> </f:facet>
> <s:link view="/enginetypes.xhtml">
> <f:param name="engineTypeId"
> value="#{engineType.id}"/>
> <img src="images/edit.gif"
> alt="#{engineType.id}" style="border:0"/>
> </s:link>
> </tr:column>
>
> <!-- the delete button, calls the
> engineTypeHome's remove method -->
> <tr:column inlineStyle="width:4em">
> <f:facet name="header">
> <tr:outputText value="Delete"
> styleClass="columnUnsortableHeaderText"/>
> </f:facet>
> <tr:commandLink
> action="dialog:deleteEntity"
> immediate="true"
> partialSubmit="true"
> useWindow="true"
> windowWidth="650"
> windowHeight="300"
>
> launchListener="#{engineType.addConfirmDeletionParams}"
>
> returnListener="#{engineTypeHome.handleConfirmDeletionDialogReturn}">
> <img src="images/delete.gif"
> alt="#{engineType.name}" style="border:0"/>
> </tr:commandLink>
> </tr:column>
>
> <!-- the first (and only) column displays the
> engineType's name -->
> <tr:column sortable="true"
> sortProperty="upper(engineType.name )">
> <f:facet name="header">
> <tr:outputText value="Name"
> styleClass="columnSortableHeaderText"/>
> </f:facet>
> <tr:outputText
> value="#{engineType.name}"/>
> </tr:column>
> </tr:table>
> </tr:form>
>
> This is the code of the backing bean 'EngineTypeHome.java':
>
> @Name("engineTypeHome")
> @Scope(ScopeType.CONVERSATION)
> public class EngineTypeHome extends HomeBase<EngineType> {
> private TrinidadEntityQuery engineTypesQuery;
>
> @In
> private EntityManager entityManager;
>
> public EngineTypeHome() {
> super("engineTypeId");
> }
>
> @Factory("selectedEngineType")
> public EngineType init() {
> return getInstance();
> }
>
> @Override
> public boolean checkRemovable() {
> EngineType engineType = getInstance();
> return checkRemovable(engineType);
> }
>
> public boolean checkRemovable(EngineType engineType) {
> long usageCount = (Long) entityManager.createQuery("select
> count(event) from Event event where event.engineType = :engineType")
> .setParameter("engineType", engineType)
> .getSingleResult();
>
> if(usageCount > 0) {
> FacesUtil.error("Cannot delete engine type '" +
> engineType.getName() + "'. There are events for this engine type.");
> return false;
> }
> return true;
> }
>
> @Override
> public EntityQuery getEntityQuery() {
> if (engineTypesQuery == null) {
> engineTypesQuery = new TrinidadEntityQuery();
> String ejbql = "select engineType from EngineType
> engineType";
> engineTypesQuery.setEjbql(ejbql);
> engineTypesQuery.setMaxResults(15);
> engineTypesQuery.setOrder ("engineType.name");
> }
> return engineTypesQuery;
> }
>
> @Transactional
> public String handleConfirmDeletionDialogReturn(ReturnEvent
> returnEvent){
> Long engineTypeId = (Long) returnEvent.getReturnValue();
> if (engineTypeId != null){
> // load the entity from the database
> EngineType engineType =
> entityManager.find(EngineType.class,
> engineTypeId);
>
> // make sure it has been loaded (no locking currently
> activated!)
> if (engineType == null){
> FacesUtil.error("Cannot delete engine type. It may
> have
> been deleted in the meantime.");
> return null;
> }
>
> // actually remove it
> if (checkRemovable(engineType)){
> entityManager.joinTransaction();
> entityManager.remove (engineType);
> entityManager.flush();
> }
>
> getEntityQuery().refresh();
> FacesContext.getCurrentInstance().renderResponse();
> }
> return "removed";
> }
>
> /**
> * Calls the super save method and refreshes the entity query.
> * @return The navigation outcome of HomeBase.save().
> */
> @Override
> public String save(){
> String outcome = super.save();
> if (engineTypesQuery != null){
> engineTypesQuery.refresh();
> }
> return outcome;
> }
> }
>
> The confirmation dialog page 'delete-entity_dlg.xhtml' looks like
> this:
>
> <?xml version="1.0" encoding="utf-8"?>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
> " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
> <html xmlns="http://www.w3.org/1999/xhtml"
> xmlns:ui=" http://java.sun.com/jsf/facelets"
> xmlns:f="http://java.sun.com/jsf/core"
> xmlns:s="http://jboss.com/products/seam/taglib
> <http://jboss.com/products/seam/taglib>"
> xmlns:tr="http://myfaces.apache.org/trinidad"
> xmlns:trh="http://myfaces.apache.org/trinidad/html
> <http://myfaces.apache.org/trinidad/html>">
> <head/>
> <body>
> <ui:composition template="popup_template.xhtml">
> <ui:define name="main-content">
> <script type="text/javascript" xml:space="preserve">
> // <![CDATA[
> _pprUnsupported = false;
> // ]]>
> </script>
> <tr:form defaultCommand="okButton"
> styleClass="noprint">
> <tr:panelFormLayout>
> <tr:outputText inlineStyle="font-size:0.8em"
> value="Please confirm the
> deletion of the #{ deleteEntityBackingBean.userPrompt}"/>
> <tr:messages globalOnly="true"/>
> <tr:panelButtonBar>
> <tr:commandButton id="okButton"
> styleClass="okButton"
>
> action="#{deleteEntityBackingBean.ok}"
>
> rendered="#{deleteEntityBackingBean.initOk}"/>
> <tr:commandButton id="cancelButton"
> styleClass="cancelButton"
>
> action="#{deleteEntityBackingBean.cancel}"
> immediate="true"/>
> </tr:panelButtonBar>
> </tr:panelFormLayout>
> </tr:form>
> </ui:define>
> </ui:composition>
> </body>
> </html>
>
> And here is it's backing bean ' DeleteEntityBackingBean.java':
>
> /**
> * Backing bean for the dialog page delete-entity_dlg.xhtml.
> */
> @Name("deleteEntityBackingBean")
> @Scope(ScopeType.CONVERSATION)
> public class DeleteEntityBackingBean {
> // the message displayed to the user
> private String userPrompt;
>
> // the entity to be deleted
> private Long objectId;
>
> // if false, an initialization error occurred (missing dialog
> parameter)
> private boolean initOk = true;
>
> @Logger("etd.edit")
> private Log log;
>
> @In(create = true)
> private EntityManager entityManager;
>
> public DeleteEntityBackingBean() {
> }
>
> @Create
> @Begin
> public void create() {
> // get the dialog startup parameters
> RequestContext requestContext =
> RequestContext.getCurrentInstance();
> objectId = (Long)
> requestContext.getPageFlowScope().get("objectId");
> userPrompt =
> (String)requestContext.getPageFlowScope().get("userPrompt");
>
> if (objectId == null) {
> FacesUtil.error ("Internal error: no object to be
> deleted!");
> initOk = false;
> }
> }
>
> @Transactional
> @End
> public String ok() {
> // close the dialog returning the id
> RequestContext.getCurrentInstance().returnFromDialog(objectId,
> null);
> }
>
> @Transactional
> @End
> public String cancel() {
> // close the dialog returning null
>
> RequestContext.getCurrentInstance().returnFromDialog(null, null);
> }
>
> public String getUserPrompt() {
> return userPrompt;
> }
>
> public boolean isInitOk() {
> return initOk;
> }
> }
>
> There is a navigation rule for the dialog in the faces-config.xml:
> ...
> <navigation-case>
> <from-outcome>dialog:deleteEntity</from-outcome>
> <to-view-id>/delete-entity_dlg.xhtml</to-view-id>
> </navigation-case>
> ...
>
> Any help appreciated,
> Alexander Pohl
>
>
> --
> ------------------------
> Alexander Pohl
> ------------------------
> Think Applications GbR
> Zionskirchstrasse 73
> D-10119 Berlin
> ------------------------
> Phone +49 30 4171 4624
> Fax +49 30 4171 4625
> Mobile +49 173 211 2864
> ------------------------
> mailto:pohl@thinkapps.de <ma...@thinkapps.de>
> ------------------------
>
>
>
>
> --
>
> http://www.irian.at
>
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
--
------------------------
Alexander Pohl
------------------------
Think Applications GbR
Zionskirchstrasse 73
D-10119 Berlin
------------------------
Phone +49 30 4171 4624
Fax +49 30 4171 4625
Mobile +49 173 211 2864
------------------------
mailto:pohl@thinkapps.de
------------------------