RichFaces panelMenu - how to save the expand state
Today I stumbled into a problem with the RichFaces PanelMenueGroup which was often discussed in forums and blogs: The expand state of the RichFaces panelMenu placed into a facelet will be lost if you navigate into different pages.
If you build a simple richfaces menue into a navigation facelet like this you will see the problem after switching the page:
<rich:panelMenu iconCollapsedTopGroup="triangle" iconExpandedTopGroup="triangleDown" >
<rich:panelMenuGroup label="#{global.open_menu_ta}">
<rich:panelMenuItem label="#{global.open_ta_heute}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_a}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_b}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_c}">
</rich:panelMenuItem>
</rich:panelMenuGroup>
<rich:panelMenuGroup label="#{global.open_menu_ereignis}">
<rich:panelMenuItem label="#{global.open_ereignis_aufgaben}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_ereignis_alle}">
</rich:panelMenuItem>
</rich:panelMenuGroup>
</rich:panelMenu>
The expanded panelMenuGroup will be collapsed if you swich into another page because the state of the menue (expanded/collapsed) is not saved.
After playing arround I found a very simple solution for my situation. The only thing which is necessary to save the state is a simple session scoped Backing Bean providing a hashMap to save the state:
public class MenueMB {
HashMap<String, Boolean> menueState=new HashMap<String, Boolean>();
public Map getState() {
return menueState;
}
}Now you can provide the expanded property form the rich:PanelMenueGroup with the right state:
<rich:panelMenu iconCollapsedTopGroup="triangle" iconExpandedTopGroup="triangleDown" >
<rich:panelMenuGroup expanded="#{menueMB.state['menue_ta']}" label="#{global.open_menu_ta}">
<rich:panelMenuItem label="#{global.open_ta_heute}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_a}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_b}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_c}">
</rich:panelMenuItem>
</rich:panelMenuGroup>
<rich:panelMenuGroup expanded="#{menueMB.state['menue_ereignis']}" label="#{global.open_menu_ereignis}">
<rich:panelMenuItem label="#{global.open_ereignis_aufgaben}">
</rich:panelMenuItem>
<rich:panelMenuItem label="#{global.open_ereignis_alle}">
</rich:panelMenuItem>
</rich:panelMenuGroup>
</rich:panelMenu>
Now the state of each menueGroup will be saved over the complete user session.
Posted at 11:25AM Sep 10, 2010
Posted by: Ralph
Category: General
Posted by Roy on November 05, 2010 at 03:50 PM GMT #
Posted by Martin on May 18, 2011 at 06:50 PM GMT #
Posted by Ralph on May 19, 2011 at 12:37 PM GMT #