Confirm dialog doesnt work with pa:tabMenu?

Forum rules
Please note that response time for technical support is within 3-5 business days.
Post Reply
IdexxOpsSys
Posts: 1
Joined: 24 Mar 2017, 17:38

03 May 2017, 15:51

I have tried to put the confirm dialog in my menu.xhtml and my main page and it just ignores the confirmation dialog and executes the code. This worked in a regular p:menubar menuitem.

Am i doing something wrong?

Code: Select all

    <pa:tabMenu id="tabMenu">
        <pa:tab icon="home" title="Menu" class="ui-datatable ui-shadow-3">
            <h:form id="menu-form">
                <pa:menu widgetVar="me">
                    <p:menuitem id="closeSessionMenuItem"
                                value="Close Session" 
                                icon="&#xe2c0;"
                                actionListener="#{bean.closeSession()}"
                                onstart="PF('blockUIWidget').block()" 
                                oncomplete="PF('blockUIWidget').unblock()">
                        <p:confirm header="Close Session" 
                                   message="Are you sure you want close session?" 
                                   icon="ui-icon-alert" />     
                    </p:menuitem>
                </pa:menu>
            </h:form>
        </pa:tab>
    </pa:tabMenu>    
    <p:confirmDialog global="true" showEffect="fade" hideEffect="fade">
        <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
        <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
    </p:confirmDialog>


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

08 May 2017, 09:28

This feature isn't supported for now. But, you can try your case after making my changes in MenuRenderer.java

Code: Select all

public class MenuRenderer extends BaseMenuRenderer {

  ...
  
    @Override
    protected void encodeMenuItem(FacesContext context, AbstractMenu menu, MenuItem menuitem) throws IOException {
        ...

        if(disabled) {
            writer.writeAttribute("href", "#", null);
            writer.writeAttribute("onclick", "return false;", null);
        }
        else {
            setConfirmationScript(context, menuitem);          // PLEASE ADD THIS LINE
            String onclick = menuitem.getOnclick();

            ....
            
            if(onclick != null) {                                                // PLEASE ADD THESE LINES
                if(menuitem.requiresConfirmation()) {
                    writer.writeAttribute("data-pfconfirmcommand", onclick, null);
                    writer.writeAttribute("onclick", menuitem.getConfirmationScript(), "onclick");
                }
                else {
                    writer.writeAttribute("onclick", onclick, null);
                }
            }
        }

        ...
	}
Full encodeMenuitem codes;

Code: Select all

public class MenuRenderer extends BaseMenuRenderer {

    ....
    
    @Override
    protected void encodeMenuItem(FacesContext context, AbstractMenu menu, MenuItem menuitem) throws IOException {
        ResponseWriter writer = context.getResponseWriter();
        String title = menuitem.getTitle();
        boolean disabled = menuitem.isDisabled();
        String style = menuitem.getStyle();
        String styleClass = menuitem.getStyleClass();
        String defaultStyleClass = "ripplelink";
        styleClass = (styleClass == null) ? defaultStyleClass : defaultStyleClass + " " + styleClass;

        writer.startElement("a", null);
        if(title != null) writer.writeAttribute("title", title, null);
        if(style != null) writer.writeAttribute("style", style, null);
        if(styleClass != null) writer.writeAttribute("class", styleClass, null);

        if(disabled) {
            writer.writeAttribute("href", "#", null);
            writer.writeAttribute("onclick", "return false;", null);
        }
        else {
            setConfirmationScript(context, menuitem);
            String onclick = menuitem.getOnclick();

            //GET
            if(menuitem.getUrl() != null || menuitem.getOutcome() != null) {                
                String targetURL = getTargetURL(context, (UIOutcomeTarget) menuitem);
                writer.writeAttribute("href", targetURL, null);

                if(menuitem.getTarget() != null) {
                    writer.writeAttribute("target", menuitem.getTarget(), null);
                }
            }
            //POST
            else {
                writer.writeAttribute("href", "#", null);

                UIComponent form = ComponentUtils.findParentForm(context, menu);
                if(form == null) {
                    throw new FacesException("MenuItem must be inside a form element");
                }

                String command;
                if(menuitem.isDynamic()) {
                    String menuClientId = menu.getClientId(context);
                    Map<String,List<String>> params = menuitem.getParams();
                    if(params == null) {
                        params = new LinkedHashMap<String, List<String>>();
                    }
                    List<String> idParams = new ArrayList<String>();
                    idParams.add(menuitem.getId());
                    params.put(menuClientId + "_menuid", idParams);

                    command = menuitem.isAjax() ? buildAjaxRequest(context, menu, (AjaxSource) menuitem, form, params) : buildNonAjaxRequest(context, menu, form, menuClientId, params, true);
                } 
                else {
                    command = menuitem.isAjax() ? buildAjaxRequest(context, (AjaxSource) menuitem, form) : buildNonAjaxRequest(context, ((UIComponent) menuitem), form, ((UIComponent) menuitem).getClientId(context), true);
                }

                onclick = (onclick == null) ? command : onclick + ";" + command;
            }

            if(onclick != null) {
                if(menuitem.requiresConfirmation()) {
                    writer.writeAttribute("data-pfconfirmcommand", onclick, null);
                    writer.writeAttribute("onclick", menuitem.getConfirmationScript(), "onclick");
                }
                else {
                    writer.writeAttribute("onclick", onclick, null);
                }
            }
        }

        encodeMenuItemContent(context, menu, menuitem);

        writer.endElement("a");
	}
	
	...
}

Post Reply

Return to “Barcelona - PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 12 guests