Window.open not working with IE7 - java

I am facing when i am opening a popup with IE 7..is there any way around for this
<h:form>
<h:commandButton value="Submit" action="#{bean.submit}">
<f:ajax render="popup" />
</h:commandButton>
<h:panelGroup id="popup">
<ui:fragment rendered="#{not empty bean.url}">
<script>window.open('#{bean.url}');</script>
</ui:fragment>
</h:panelGroup>
</h:form>

Then your IE7 is configured to block (certain) popups or has a popup blocker installed. Often it will block popups which points to external sites. Reconfigure IE or disable the blocker.
An alternative is to use a HTML/JS/CSS div-with-overlay approach or a 3rd party JSF component library like PrimeFaces/RichFaces which have components for this. For example, PrimeFaces with <p:dialog>.

Related

JSF actionListner not called after some time

I've got a modalPanel with some components (for example, a tree). At fisrt my actions and actionListners work correclty. After some time (from 5 to 10 minutes) actions stop working completely. The post is fired, but the AjaxViewRoot actions are empty. I have no validation errors.
All the page component ids are fixed (not generated) to prevent conversion error.
My bean is Conversation scoped and its timeout is over 30 minutes.
<rich:modalPanel id="modalId" resizeable="false" autosized="true">
<a4j:include id="myPage" viewId="#{bean.viewId}"/>
</rich:modalPanel>
Here is myPage (included page) code:
<ui:composition>
<h:form id="frmPage">
<h:panelGrid columns="1">
<a4j:region id="treeRegion">
<rich:panel id="tbPanelTrees">
<h:panelGrid columns="2" >
<h:panelGroup layout="block" style="height:#{(height-150)/2}px; width:#{(width-20)/2}px; overflow:visible; overflow-y:auto; overflow-x:auto;">
<rich:tree id="subjectTree"
style=" height: 100%"
switchType="ajax"
var="item"
nodeFace="#{item.nodeType}"
value="#{bean.subjTree.rootSubjectsTree}"
adviseNodeOpened="#{bean.subjTree.adviseNodeOpened}"
changeExpandListener="#{bean.subjTree.changeExpandListener}"
nodeSelectListener="#{bean.subjTree.nodeSelectListener}"
ajaxSubmitSelection="true"
reRender="elements outside region"
ajaxSingle="true"
ignoreDupResponses="true">
<rich:treeNode type="root" icon="#{item.subjectsIcon}" iconLeaf="#{item.subjectsIcon}" id="subjectRootNode">
<a4j:commandLink value="#{item.nodeName}" id="subjectRootNodeLink"/>
</rich:treeNode>
<rich:treeNode type="user" icon="#{item.userIcon}" iconLeaf="#item.userIcon}" id="userNode">
<a4j:commandLink value="#{item.nodeName}" id="userNodeLink"/>
</rich:treeNode>
</rich:tree>
</h:panelGroup>
</a4j:region>
</h:panel:Grid>
</h:form>
</ui:composition>
Does anybody have an idea, what's the problem?
Finally found a solution. Some of my components didn't have a defined id and had a generated one (like myForm:j1456546).
Another part of the page send a polling request (to show some news), which send a DOM-tree to the server for validation. The generated ids where changed on server-side, but remained the same on client side (because the polling didn't rerender anything apart from news panel). So when user clicked the button (or fired any other ajax-action), the button ids on the client and server-side where different and action was not invoked.
Solution: manualy define all of your ids.

Primefaces / JSF: selectOneMenu value is not set, ajax listener not called

I am using Primefaces and JSF to develop this frontend. My issue is that one of my selectonemenus never sets its value binding, "selectedGroup", so the second dropdown is never populated. My backing bean is being called to "update" the second selectonemenu, but the listener of that ajax is not called, nor is selectedGroup ever set. This code is effectively identical to the Showcase for "Select". I even verified that the showcase code works from scratch (which i did not doubt), but fail to see how my situation is any different from that example.
Other stackoverflow questions on this topic indicate that something was left out, but none of those suggestions matched my issue.
I have two selectOneMenus, like so.
<h:form id="outerForm">
<p:panel id="outerPanel">
<p:panelGrid id="outerPanelGrid">
<h:outputLabel for="groupSelection" value="Group: "/>
<p:selectOneMenu id="groupSelection" value="#{myBean.selectedGroup}" >
<p:ajax update="commandSelection"
listener="#{myBean.handleGroupSelection}" />
<f:selectItem itemLabel="---Please Select Group---" itemValue=""/>
<f:selectItems var="group" value="#{myBean.groups}"
itemLabel="#{group.name}" itemValue="#{group.name}" />
</p:selectOneMenu>
<h:outputLabel for="commandSelection" value="Command: "/>
<p:selectOneMenu id="commandSelection" value="#{myBean.command}">
<f:selectItems value="#{myBean.commandStringsList}"/>
</p:selectOneMenu>
</p:panelGrid>
</p:panel>
</h:form>
This page is being displayed in the "center" portion of my layout template like so..
<ui:define id="content" name="content">
<p:panel id="contentPanel" style="float:left; border:none">
<ui:include src="#{anotherBean.currentView}.xhtml"/>
</p:panel>
</ui:define>
The backing bean DOES use some data classes to contain some of the data which is populated, but I thought i was doing everything correct to map it into the view. For the most part, I am using Strings, though.
Does anyone see what I am missing? At the very least, is this xhtml valid?
I should also mention that this page was working before I created and used a template. Basically, I was rendering it in a tab of a tabview using ui:include in the body of index.xhtml. Though I did not notice initially, this page stopped working sometime after I incorporated the template (poor testing on my part, I know).
<f:selectItems var="group" value="#{myBean.groups}"
itemLabel="#{group.name}" itemValue="#{group.name}" />
you can't specify selectItems this way. translation has to be bidirectional. use a converter!
<f:selectItems var="group" value="#{myBean.groups}"
itemLabel="#{group.name}" itemValue="#{group}"
converter="groupConverter"/>

JSF p:commandLink and p:ajax have different behavior in update

I have a menu with list items and a p:commandLink inside. While using this for different pages I realized that I have problems updating form with a p:dataTable and p:columns inside. After clicking on the link, form2 which actually has some panels and the table inside should be updated. Now my problem: Only most of the content in form2 is updated correctly, but the p:columns have the old value. If I click again on the link, the correct values are shown.
The bean method public void selectProject(Project myProject) is called correctly and the values are correctly processed.
Now the strange thing: If I add a h:graphicImage with a p:ajax everything works fine!!
<h:form id="form1">
...
<li>
<p:commandLink update=":form2" actionListener="#{bean.selectProject(p)}">
<h:outputText value="#{p.name}" />
</p:commandLink>
<!-- Code below is for testing only, but works fine! -->
<h:graphicImage value="#{iconBean.icon(12,'clock')}">
<p:ajax event="click" update=":form2" listener="#{bean.selectProject(p)}"/>
</h:graphicImage>
</li>
...
</h:form>
Update This does not seem to be related to p:columns, a simplified test case shows the expected behavior of p:commandLink. In the original (still failing) setting the menu is implemented as a composite component.
As a workaround I use
<h:commandLink>
<h:outputText value="#{p.name}"/>
<p:ajax event="click" update=":form2" listener="#{bean.selectProject(p)}"/>
</h:commandLink>

Server side listener for rich:dataScroller (RF 4.1)

I'm using an extendedDataTable because I need multiselect. The table can get pretty large, so I'm using a dataScroller for paging.
What I want to achieve is, that the selection is cleared when switching to another page. The selection is stored in the backing bean and I have a method clearTableSelection to clear the selection.
Now my question is, how is it possible to call the method clearTableSelection when switching pages.
I found a simple solution:
...
<rich:extendedDataTable>
...
<f:facet name="footer">
<rich:dataScroller
onbegin="document.getElementById('form:hiddenButton').click()" />
</f:facet>
</rich:extendedDataTable>
<a4j:commandButton
id="hiddenButton" action="#{backingBean.clearTableSelection}"
value="HiddenButton" execute="#this" style="display: none;" />
...

Modal ConfirmDialog over modal Dialog -> everything is blocked

I have a modal ConfirmDialog that is shown over a modal Dialog using PrimeFaces 3.0.1.
If the ConfirmDialog is opend, the whole page becomes locked, inclusive the ConfirmDialog itself... rien ne va plus
I found a Bugreport for Primefaces that sounds similar http://code.google.com/p/primefaces/issues/detail?id=576 but since the bug is related to a Layout-Component this does not really apply in my case.
Is there a workaround or something?
Thanks!!!
use the appendToBody="true" attribute of the p:dialog tag to resolve this.
From PrimeFaces 5 on the attribute has changed. If you are using 5+ use appendTo="#(body)" instead, see the migration guide: migration guide
(It would have been helpful to know your Primefaces version)
Use appendTo="#(body)" in the tag it works for me
Since I need a submit-button in the Dialog I unfortunatly had to search for a different solution then appendToBody="true". For everybody who faces the same problem, here comes the solution:
If you want to to the following:
<p:dialog modal="true">
<h:form>
...
<p:confirmDialog>
<p:commandButton action="#{transportBean.execute}" type="submit" .../>
</p:confirmDialog>
...
</h:form>
</p:dialog
This will lead into a completly blocked page. Pull the Form Element two elements higher and it will work:
<h:form>
<p:dialog modal="true">
...
<p:confirmDialog>
<p:commandButton action="#{transportBean.execute}" type="submit" .../>
</p:confirmDialog>
...
</p:dialog
</h:form>

Categories