11 Replies Latest reply on Mar 31, 2009 4:25 AM by sebo sebo

    panelMenu - selectedChild

    Krzysztof Kalinowski Newbie

      I want to use panelMenu to navigation in my application.
      I created session bean to save selectedChild and linked it with panelMenu and use expanded attribute.
      Almost everything works fine but:
      - after refresh page I lost selected item in panelMenu
      - I must use expanded attribute because use only selectedChild attribute doesn't work

      How should I set attributes in panelMenu that panelMenu remember state (selected item) between pages ?
      What do I wrong ?

      Thanks for any help


      @Name("menuRend")
      @Scope(ScopeType.CONVERSATION)
      public class MenuRendering {
      
       private String activeItem;
      
       public String getActiveItem() {
       return activeItem;
       }
      
       public void setActiveItem(String activeItem) {
       this.activeItem = activeItem;
       }
      
       public String addSlStopnieAwans() {
       activeItem = "dodajStopienAwansu";
       return "/sl_stopnie_awansu/SlStopnieAwansuEdit.xhtml";
       }
      
       public String showStopnieAwans() {
       activeItem = "pokazStopnieAwansu";
       return "/sl_stopnie_awansu/SlStopnieAwansuList.xhtml";
       }
      ....
      

       <a4j:form id="form" ajaxSubmit="true" reRender="body" limitToList="true">
       <rich:panelMenu style="width:170px; " mode="ajax"
       iconExpandedGroup="disc" iconCollapsedGroup="disc"
       iconExpandedTopGroup="chevronUp" iconGroupTopPosition="right"
       iconCollapsedTopGroup="chevronDown" iconCollapsedTopPosition="right" selectedChild="#{menuRend.activeItem}" expandSingle="true" expandMode="ajax" rendered="#{identity.loggedIn}" >
       <rich:panelMenuGroup label="#{msg['view.miasta.title']}" expanded="#{menuRend.activeItem=='dodajMiasto' || menuRend.activeItem=='listaMiast' ? true : false}">
       <rich:panelMenuItem label="#{msg['view.miasta.dodaj']}" action="#{menuRend.addMiasto}" name="dodajMiasto">
       <f:param name="miastaPkM"/>
       </rich:panelMenuItem>
       <rich:panelMenuItem label="#{msg['view.miasta.lista']}" action="#{menuRend.showMiasta}" name="listaMiast"/>
       </rich:panelMenuGroup>
       <rich:panelMenuGroup label="#{msg['view.jednostki.title']}" expanded="#{menuRend.activeItem=='dodajJednostke' || menuRend.activeItem=='listaJednostek' ? true : false}" >
       <rich:panelMenuItem label="#{msg['view.jednostki.dodaj']}" action="#{menuRend.addJednostka}" name="dodajJednostke"/>
       <rich:panelMenuItem label="#{msg['view.jednostki.lista']}" action="#{menuRend.showJednostki}" name="listaJednostek"/>
       </rich:panelMenuGroup>
      ......
      


        • 1. Re: panelMenu - selectedChild
          Krzysztof Kalinowski Newbie

          Your ideas on how to do this is appreciated.
          Please anyone can help me ?

          • 2. Re: panelMenu - selectedChild
            Krzysztof Kalinowski Newbie

            knock, knock
            Is anybody here ?

            • 5. Re: panelMenu - selectedChild
              Mikael Andersson Master

              I'm also interested in the solution to this.

              Trying out different richfaces components for navigation but having problems with saving selection state as well.

              • 6. Re: panelMenu - selectedChild
                Dragos Newbie

                It seems that the selectedChild is a readonly attribute, it is not set when selecting an item. I don't know why. Someone with other ideas?

                • 7. Re: panelMenu - selectedChild
                  sammy Jenkis Newbie

                  I'm also having problems with the selectedChild attribute. According to the docs, I would have thought this would work similarly to panelBar.selectedPanel, but I haven't gotten it to work with panelMenu.

                  Is there a JIRA opened on this?

                  • 8. Re: panelMenu - selectedChild
                    Stefan Bley Newbie

                    Have you found a solution for that? I'm facing the same problem.

                    • 10. Re: panelMenu - selectedChild
                      sebo sebo Newbie

                      Solution for that is:
                      xhtml

                      ...
                      <rich:panelMenu expandSingle="true" iconItem="triangle" expandMode="client" selectedChild="#{defaultNavigationBackingBean.selectedMenuGroup}"
                       id="navigationPanelMenu">
                       <rich:panelMenuGroup label="Informacje" id="information">
                       <rich:panelMenuItem label="Lista jeden" action="# {defaultNavigationBackingBean.commonPublicationListLink}"
                       actionListener="#{defaultNavigationBackingBean.leaveSelectedItem}"/>
                      ...
                      

                      bean (defaultNavigationBackingBean) [scope: session]
                      ...
                      define some static fields with id of groups (you will need them to set selectedMenuGroup) for example:
                       private final static String INFORMATION_GROUP = "information"
                      
                      private String itemId;
                      private String selectedMenuGroup;
                      public String getSelectedMenuGroup() {
                       if(this.selectedMenuGroup != null)
                       {
                       FacesContext context = FacesContext.getCurrentInstance();
                       ((HtmlPanelMenuGroup)context.getViewRoot().findComponent(this.selectedMenuGroup)).setExpanded(true);
                      
                      ((HtmlPanelMenuItem)context.getViewRoot().findComponent(this.itemId)).setStyle("font-style:italic;font-weight:bold;");
                       context = null;
                       }
                       return this.selectedMenuGroup;
                      }
                      public void setSelectedMenuGroup(String selectedMenuGroup) {
                       this.selectedMenuGroup = selectedMenuGroup;
                      }
                      public void leaveSelectedItem(ActionEvent e) {
                       UIComponent component = e.getComponent();
                       if(component instanceof HtmlPanelMenuItem)
                       this.itemId = ((HtmlPanelMenuItem)component).getId();
                      }
                      public String someInformationAction()
                      {
                       this.selectedMenuGroup = INFORMATION_GROUP;
                       return "action";
                      }
                      ...
                      


                      It's hard to set styles in editor :) ... so sorry for that ;)

                      • 11. Re: panelMenu - selectedChild
                        sebo sebo Newbie

                        Solution for that is:
                        xhtml

                        ...
                        <rich:panelMenu expandSingle="true" iconItem="triangle" expandMode="client" selectedChild="#{defaultNavigationBackingBean.selectedMenuGroup}"
                         id="navigationPanelMenu">
                         <rich:panelMenuGroup label="Informacje" id="information">
                         <rich:panelMenuItem label="Lista jeden" action="# {defaultNavigationBackingBean.commonPublicationListLink}"
                         actionListener="#{defaultNavigationBackingBean.leaveSelectedItem}"/>
                        ...
                        

                        bean (defaultNavigationBackingBean) [scope: session]
                        ...
                        define some static fields with id of groups (you will need them to set selectedMenuGroup) for example:
                         private final static String INFORMATION_GROUP = "information"
                        
                        private String itemId;
                        private String selectedMenuGroup;
                        public String getSelectedMenuGroup() {
                         if(this.selectedMenuGroup != null)
                         {
                         FacesContext context = FacesContext.getCurrentInstance();
                         ((HtmlPanelMenuGroup)context.getViewRoot().findComponent(this.selectedMenuGroup)).setExpanded(true);
                        
                        ((HtmlPanelMenuItem)context.getViewRoot().findComponent(this.itemId)).setStyle("font-style:italic;font-weight:bold;");
                         context = null;
                         }
                         return this.selectedMenuGroup;
                        }
                        public void setSelectedMenuGroup(String selectedMenuGroup) {
                         this.selectedMenuGroup = selectedMenuGroup;
                        }
                        public void leaveSelectedItem(ActionEvent e) {
                         UIComponent component = e.getComponent();
                         if(component instanceof HtmlPanelMenuItem)
                         this.itemId = ((HtmlPanelMenuItem)component).getId();
                        }
                        public String someInformationAction()
                        {
                         this.selectedMenuGroup = INFORMATION_GROUP;
                         return "action";
                        }
                        ...
                        


                        It's hard to set styles in editor :) ... so sorry for that ;)