« Liferay, Glassfish,... | Main | Incremental deplyome... »

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.