How to make menu work from a model?

Forum rules
Please note that response time for technical support is within 3-5 business days.
Post Reply
mauricio.olieira
Posts: 8
Joined: 20 Dec 2018, 16:21

03 Jan 2019, 18:19

I have a model implemented this way:

Code: Select all

	private void preparaMenus() {
		
		menuModel = new DefaultMenuModel();
		
		if(menus != null && !menus.isEmpty()){
			for(Menu menuDTO : menus){
				
				if(!temPermissao(menuDTO.getPermissao().getIdFuncionalidade())){
					continue;
				}
				
				if(menuDTO.getMenusFilhos() != null && !menuDTO.getMenusFilhos().isEmpty()){
					DefaultSubMenu subMenu =  new DefaultSubMenu(menuDTO.getNome());
					processSubMenus(subMenu, menuDTO.getMenusFilhos());
					menuModel.addElement(subMenu);
				}else{
					DefaultMenuItem menuItem = new DefaultMenuItem(menuDTO.getNome(), menuDTO.getIcone());
					
					if(!StringUtil.isBlankOrNull(menuDTO.getUrl())){
						menuItem.setCommand("#{sessaoBean.redirect('"+menuDTO.getUrl()+"','"+menuDTO.getNome()+"')}");
//						menuItem.setOutcome(menuDTO.getUrl());
//						menuItem.setParam("nome", menuDTO.getNome());
					}
					menuItem.setAjax(true);
					menuItem.setImmediate(true);
					menuItem.setOnstart("PF('statusDialog').show()");
					menuItem.setOnsuccess("PF('statusDialog').hide()");
					menuModel.addElement(menuItem);
				}
				
			}
		}
		
	}

	/**
	 * 
	 * @param subMenu
	 * @param menusFilhos
	 */
	private void processSubMenus(DefaultSubMenu subMenu, List<Menu> menusFilhos) {
		
		if(menusFilhos != null && !menusFilhos.isEmpty()){
			for(Menu menuDTO : menusFilhos){
				
				if(!temPermissao(menuDTO.getPermissao().getIdFuncionalidade())){
					continue;
				}
				
				if(menuDTO.getMenusFilhos() == null || menuDTO.getMenusFilhos().isEmpty()){
					DefaultMenuItem menuItem = new DefaultMenuItem(menuDTO.getNome(), menuDTO.getIcone());
					menuItem.setOnstart("PF('blockUIWidget').block()");
					menuItem.setOnsuccess("PF('blockUIWidget').unblock()");
					menuItem.setImmediate(true);
					menuItem.setAjax(true);
					if(!StringUtil.isBlankOrNull(menuDTO.getUrl())){
						menuItem.setCommand("#{sessaoBean.redirect('"+menuDTO.getUrl()+"','"+menuDTO.getNome()+"')}");
//						menuItem.setOutcome(menuDTO.getUrl());
//						menuItem.setParam("nome", menuDTO.getNome());
					}

					subMenu.addElement(menuItem);
				}else{
					DefaultSubMenu asubMenu = new DefaultSubMenu(menuDTO.getNome());
					
					if(StringUtil.isBlankOrNull(menuDTO.getIcone())){
						asubMenu.setIcon(menuDTO.getIcone());
					}
					
					processSubMenus(asubMenu, menuDTO.getMenusFilhos());
					subMenu.addElement(asubMenu);
				}
			}
		}
		
	}
This way the menu does not work, only the labels are displayed but the redirection to the pages does not happen.
What is the correct way to implement?

mert.sincan
Posts: 5281
Joined: 29 Jun 2013, 12:38

08 Jan 2019, 12:14

Which menu do you using? p:* menu component or pc:menu of california layout

mauricio.olieira
Posts: 8
Joined: 20 Dec 2018, 16:21

08 Jan 2019, 15:49

aragorn wrote:
08 Jan 2019, 12:14
Which menu do you using? p:* menu component or pc:menu of california layout
I'm using pc:menu of california layout.

mert.sincan
Posts: 5281
Joined: 29 Jun 2013, 12:38

11 Jan 2019, 13:33

I couldn't replicate this issue. My test code;

Code: Select all

package org.primefaces.california.view.menu;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuModel;

@ManagedBean
public class MenuView {

    private MenuModel model;

    @PostConstruct
    public void init() {
        model = new DefaultMenuModel();

        //First submenu
        DefaultSubMenu firstSubmenu = new DefaultSubMenu("Dynamic Submenu");

        DefaultMenuItem item = new DefaultMenuItem("External");
        item.setUrl("http://www.primefaces.org");
        item.setIcon("ui-icon-home");
        firstSubmenu.addElement(item);

        model.addElement(firstSubmenu);

        //Second submenu
        DefaultSubMenu secondSubmenu = new DefaultSubMenu("Dynamic Actions");

        item = new DefaultMenuItem("Save");
        item.setIcon("ui-icon-disk");
        item.setCommand("#{menuView.save}");
        secondSubmenu.addElement(item);

        item = new DefaultMenuItem("Delete");
        item.setIcon("ui-icon-close");
        item.setCommand("#{menuView.delete}");
        item.setAjax(false);
        secondSubmenu.addElement(item);

        item = new DefaultMenuItem("Redirect");
        item.setIcon("ui-icon-search");
        item.setCommand("#{menuView.redirect}");
        secondSubmenu.addElement(item);

        model.addElement(secondSubmenu);
    }

    public MenuModel getModel() {
        return model;
    }

    public void save() {
        addMessage("Success", "Data saved");
    }

    public void update() {
        addMessage("Success", "Data updated");
    }

    public void delete() {
        addMessage("Success", "Data deleted");
    }
    
    public String redirect() {
        return "empty?faces-redirect=true";
    }

    public void addMessage(String summary, String detail) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail);
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
}

Code: Select all

//sidebar.xhtml
<h:form id="menuform">
      <pc:menu widgetVar="me" model="#{menuView.model}" />
</h:form>

Post Reply

Return to “California - PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 1 guest