I use PanelMenu to build menu and the target is an iframe.
What I want to get, when I click menuItem in panelMenu, the result should display in iframe.
What I get, the result display in same windows, like "_self".
I tried use an other menu component, like slideMenu and tieredMenu, it display in target iframe, like what I want.
Is this a bug in panelMenu or may be I use in wrong way?
panelMenu code:
<h:form id="menuForm">
<p:panelMenu id="appSlideMenu" autoDisplay="false" toggleEvent="click" style="width:250px">
<p:submenu label="Homepage">
<p:menuitem value="Primefaces" url="http://www.primefaces.org" target="dcontainer" />
</p:submenu>
</p:panelMenu>
</h:form>
slideMenu code:
<h:form id="menuForm">
<p:slideMenu id="appSlideMenu" autoDisplay="false" toggleEvent="click" style="width:250px">
<p:submenu label="Homepage">
<p:menuitem value="Primefaces" url="http://www.primefaces.org" target="dcontainer" />
</p:submenu>
</p:slideMenu>
</h:form>
iframe code:
<h:body>
<div class="row-container">
<div class="first-row">
<div class="start-button">
<p:commandButton icon="fa fa-arrow-right" value="Start"
oncomplete="PF('nsidebar').show()" />
</div>
<div class="bottom">
<ui:include src="bottom.xhtml" />
</div>
</div>
<div class="second-row">
<iframe id="dcontainer" name="dcontainer"> </iframe>
</div>
</div>
<p:sidebar widgetVar="nsidebar" style="width:300px;">
<ui:include src="menu.xhtml" />
</p:sidebar>
</h:body>
Please help... Thank you...
Primeface 7.0 Community
Tomcat 9.0.6
Related
I've checked all PrimeFaces 6.x documentation and online as well on p:panel + facet "options" + p:menu and have tried facet "actions"/"header" along with "options", but I can't seem to either change the icon to the right of a p:panel with a facet "options" + p:menu or to set a css class to its generated anchor link.
Does anyone know how to apply either of those?
Screenshot #1:
Generated code:
<div id="myForm:formPanel" class="ui-panel ui-widget ui-widget-content ui-corner-all templateWidgetPanel" data-widget="widget_myForm_formPanel">
<div id="myForm:formPanel_header" class="ui-panel-titlebar ui-widget-header ui-helper-clearfix ui-corner-all">
<span class="ui-panel-title">Menu Test</span>
<a id="myForm:formPanel_menu" href="#" class="ui-panel-titlebar-icon ui-corner-all ui-state-default" title="Edit...">
<span class="ui-icon ui-icon-gear"></span>
</a>
</div>
<div id="myForm:formPanel_content" class="ui-panel-content ui-widget-content">Hola!</div>
</div>
Source code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
<title>Panel Menu Icon</title>
</h:head>
<h:body>
<h:form id="myForm" style="width: 30%">
<p:panel header="Menu Test"
id="formPanel"
menuTitle="Edit..."
styleClass="templateWidgetPanel" >
<f:facet name="options">
<p:menu id="formPanelMenu" styleClass="templateWidgetMenu">
<p:submenu label="Options.." styleClass="templateWidgetSubMenu">
<p:menuitem value="Menu #1"
styleClass="templateWidgetSubMenuConfigure"
target="_top"
outcome="index.xhtml"
icon="ui-icon-settings"/>
<p:menuitem value="Menu #2"
styleClass="templateWidgetSubMenuConfigure"
target="_top"
outcome="index.xhtml"
icon="ui-icon-settings"/>
</p:submenu>
</p:menu>
</f:facet>
Hola!
</p:panel>
</h:form>
</h:body>
</html>
You could start by creating the right selector that disables the default icon (it most likely includes .ui-icon.ui-icon-gear in it) and then in this selector set a different icon. Yes, it is (ab)using the ui-icon-gear class for this case, but it works
.templateWidgetPanel .ui-icon-gear {
background-position: -224px -112px;
}
The css (all basic css, nothing PF specific) above changes it into a 'star' However...
PrimeFaces panel also has the option to add custom actions to the panel (from the same showcase):
<p:panel id="custom" header="Custom Actions" style="margin-bottom:20px">
<h:panelGrid columns="2" cellpadding="10">
<p:graphicImage name="demo/images/godfather/godfather3.jpg" />
<h:outputText value="After a break of more than 15 years..." />
</h:panelGrid>
<f:facet name="actions">
<h:commandLink styleClass="ui-panel-titlebar-icon ui-corner-all ui-state-default">
<h:outputText styleClass="ui-icon ui-icon-help" />
</h:commandLink>
<h:commandLink styleClass="ui-panel-titlebar-icon ui-corner-all ui-state-default">
<h:outputText styleClass="ui-icon ui-icon-star" />
</h:commandLink>
</f:facet>
</p:panel>
In which you can declare your own components and icons (star and help in the example above)
I have the following menu where all menuItem are starting different views that use FlowScope.
In my home page ex: "http://localhost:8080/abc" I can Start any flow from the MenuItem. But when I get into one flow, I get the error: Could not resolve NavigationCase for outcome: view-all
If I change from outcome to action in the menuItem, I can get into the view, but if I try to start another follow I cant.
Here is my menu :
<h:body>
<div id="page">
<div id="header">
<ui:insert name="header">
<h:form>
<p:menubar id="menu">
<p:menuitem>
<h:link>
<h:graphicImage name="fme.png" height="50" />
</h:link>
</p:menuitem>
<p:submenu label="Colaborador" icon="ui-icon-document">
<p:menuitem value="Criar Colaborador" action="create-colaborator" />
<p:menuitem value="Editar Colaborador" action="create-colaborator" />
<p:menuitem value="Listar Todos" action="view-all" />
</p:submenu>
<p:submenu label="Relatorio" icon="ui-icon-document">
<p:menuitem value="Relatorio" action="exportar-relatorio" />
</p:submenu>
<p:menuitem style="margin-right:600px">
<h:link>
<h:graphicImage name="swiss.png" height="40" />
</h:link>
</p:menuitem>
</p:menubar>
</h:form>
</ui:insert>
</div>
<div id="contentWrap" class="ui-fluid">
<div id="content">
<ui:insert name="content"></ui:insert>
</div>
</div>
<div id="footer">
<ui:insert name="footer">
Um produto de FME em parceria com a SwissContact.
</ui:insert>
</div>
</div>
</h:body>
Here is my view
<h:body>
<div id="header"></div>
<div id="upload">
<h:form id="frmMain" enctype="multipart/form-data">
<p:inputTextarea id="text" style="width: 99%" value="#{uploadfile.content}" placeholder="What are you thinking?"></p:inputTextarea>
<p:fileUpload auto="true" oncomplete="input()" id="fileIdPhoto" previewWidth="200" style="width: 100%" messageTemplate="{name}" fileUploadListener="#{uploadfile.upload}" mode="advanced" dragDropSupport="true"
multiple="true" update="messages" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />
<p:messages id="messages" autoUpdate="true" closable="true" />
<p:menubar autoDisplay="false">
<p:menuitem />
<f:facet name="options">
<p:commandButton value="Publish" update="fileIdPhoto" icon="ui-icon-extlink" actionListener="#{uploadfile.uploadPhoto}">
</p:commandButton>
</f:facet>
</p:menubar>
</h:form>
</div>
<div id="body">
<div id="post_container">
<ul>
<ui:repeat value="#{image.allpost}" var="value">
<h:form id="form">
<li>
<div id="post">
<p:commandButton rendered="false" id="dynaButton" process="#this,form" value="Show" type="button" icon="ui-icon-extlink"/> cant not trigger it so I set render false
<p:menu overlay="true" trigger="dynaButton" my="left top" at="left bottom">
<p:submenu label="Ajax">
<p:menuitem value="Delete" icon="ui-icon-disk"/>
<p:menuitem value="Update" icon="ui-icon-arrowrefresh-1-w"/>
</p:submenu>
</p:menu>
<b>#{value.content}</b> <br/>
#{value.createtime} <br/>
<br />
<p:galleria value="#{image.getImgByID(value.id)}" rendered="#{not empty image.getImgByID(value.id)}" var="a" panelWidth="720" panelHeight="400" showCaption="true">
<h:graphicImage value="data:image/jpeg;base64,#{a.imgUrl}" style="width:100%;height:100% " alt="Image Description for #{a.imgName}" title="#{a.imgName}"/>
</p:galleria>
<p:rating value="#{value.rating}" stars="10" cancel="false"/>cant change those stars by clicking on it
</div>
<div id="post_ceperator"/>
</li>
</h:form>
</ui:repeat>
</ul>
</div>
</div>
</h:body>
What I am trying to do is change the value of p:rating tag and p:menu to trigger but its seem like my page is only submitting the first form. Also how can I submit a post and div that contains my post will automatically update?
In my opinion the problem is that your components inside of the ui:repeat have all the time the same id's for each iteration.
The way i used to define ids in loops like that was to add some sort of unique prefix or suffix to them based on some field of the data over which i am iterating:
<ui:repeat value="#{image.allpost}" var="value">
<h:form id="form_#{value.id}">
<li>
<div id="post_#{value.id}">
Now each of your components, including the form, which is highly likely to be the cause of your problem, will have its unique id for each of the loop repetition.
I have this xhtml (primefaces) simple page:
....
<div id="header">
<h:outputText value="#{userBean.name}"/>
</div>
<div id="content">
<p:tabView value="#{appTabbedView.tabs}" var="tab" dynamic="true"
cache="false">
<p:tab title="#{tab.title}">
<iframe frameborder="0" src="#{tab.page}" />
</p:tab>
</p:tabView>
</div>
.....
Inside the iframe, I load a p:tab which loads a page named "Profile.xhtml" which allows edit (change) the user's name.
How can I refresh the header to show the new user's name (im inside an iframe!)?
I cant find a solution, I tried everything.
This is my solution. It works!
....
<div id="header">
<h:form id="formHeader">
<p:commandLink id="hiddenLink" update="user" value="hiddenLink" style="display:none" />
<h:outputText value="#{userBean.name}" id="user"/>
</h:form>
</div>
<div id="content">
<p:tabView value="#{appTabbedView.tabs}" var="tab" dynamic="true" cache="false">
<p:tab title="#{tab.title}">
<iframe frameborder="0" src="#{tab.page}" />
</p:tab>
</p:tabView>
</div>
.....
script.js:
function refreshHeader() {
window.parent.document.getElementById('formHeader:hiddenLink').click();
}
inside Profile.xhtml:
....
<p:commandButton id="accept" ... oncomplete="refreshHeader()" />
....
I have a page 'report1.xhtml'and 'report2.xhtml'both of which is using the same template 'template.xhtml'.
Here's 'template.xhtml':
<pe:layout fullPage="true" id="collapsibleLayoutPanel" stateCookie="false" widgetVar="templateLayoutWidget" style="100%;">
<pe:layoutPane id="topPanel" styleClassContent="topPanel unhideMenus" position="north" resizable="false"
closable="false" spacingClosed="0" spacingOpen="0">
<p:outputPanel id="dg">
<p:outputPanel id="dMHeader" styleClass="A_class Amarks_top">
#{tController.classificationMarking}
</p:outputPanel>
</p:outputPanel>
<div id="Ar" class="Aer" role="banner">
<div id="my_apps" style="display:none;">
<h:outputLink rendered="#{primaryMenuController.renderReturnToMyApps}"
value="#{primaryMenuController.myAppsUrl}">
<img id="my_apps_img" src="#{request.contextPath}/resources/img/my_apps.png" alt="My Apps"
title="My Apps"/>
</h:outputLink>
</div>
<b:navBar brandImg="#{request.contextPath}/resources/img/X_logo.png"
brandHref="#{request.contextPath}/view/landingPage.jsf">
<b:navbarLinks>
<div class="ui-grid-col-6">
<ui:include src="prnu.xhtml"/>
</div>
<div class="ui-grid-col-6">
<div id="A_logout">
<h:form id="helpLogoutForm">
<p:menubar styleClass="Aout_menu" autoDisplay="false">
<p:submenu
label="#{pController.name} (#{pController.accountType})"
icon="primnav-user-acct">
<p:menuitem id="myDashboardLink" value="My Dashboard"
action="landingPage" a:allowRead="true"
icon="primnav-dashboard"/>
<p:menuitem id="myMessagesLink" value="My Messages"
action="userMessageList" a:allowRead="true"
icon="primnav-inbox"/>
<p:menuitem id="myPrefLink" value="My Preferences"
oncomplete="PF('upDialog_widget').show();"
a:allowRead="true" icon="primnav-preferences"/>
<p:separator/>
<p:menuitem id="logoutLink" value="Logout"
action="#{primaryMenuController.logout}"
a:allowRead="true" onclick="X.logoutHandler();"
icon="primnav-logout" ajax="false"/>
</p:submenu>
<p:submenu icon="primnav-help">
<p:menuitem value="Help"
onclick="window.open('#{request.contextPath}/help/default.htm', 'Help', 'height=600,width=850,resizable=yes'); return false;"
icon="primnav-help_menu_child" a:allowReadHelp="true"/>
<p:menuitem value="About"
action="#{aController.updateMemoryValues()}"
oncomplete="PF('aboutDialog_widget').show();"
a:allowRead="true" icon="primnav-help_menu_child"
update=":aboutDialog"/>
</p:submenu>
</p:menubar>
</h:form>
</div>
</div>
</b:navbarLinks>
</b:navBar>
</div>
<ui:insert name="tertiaryNavMenu"/>
</pe:layoutPane>
<!-- Main content -->
<pe:layoutPane id="centerPanel" styleClassContent="centerPanel" position="center" spacingClosed="0"
spacingOpen="0">
<pe:layoutPane position="north" id="nestedTopPanel" size="45" resizable="false" closable="false"
styleClassContent="unhideMenus"
spacingClosed="0" spacingOpen="0" rendered="#{not hideTitleActionBar}">
<div id="A_content" class="AE_content" role="main">
<div class="ui-grid ui-grid-responsive">
<div class="ui-grid-row template-header">
<div class="ui-grid-col-3 template-title">
<div id="A_content_pagetitle" class="AE_content_pagetitle">
<h1 class="pagetitle_h1"><ui:insert name="contentHeader"></ui:insert></h1>
</div>
</div>
<div class="ui-grid-col-9 template-actions">
<div class="action_buttons">
<ui:insert name="actionMenu"></ui:insert>
</div>
</div>
</div>
</div>
</div>
</pe:layoutPane>
<pe:layoutPane position="center" id="nestedCenterPanel" spacingClosed="0" spacingOpen="0">
<div id="A_content_body" class="A_content_body" style="padding:0 12px;">
<p:growl id="siteMessages" globalOnly="true" showDetail="true" life="4000" autoUpdate="false"
widgetVar="siteMessages_widget"
sticky="#{not empty facesContext.maximumSeverity and facesContext.maximumSeverity.ordinal gt 1}"/>
<ui:insert name="content"></ui:insert>
</div>
</pe:layoutPane>
</pe:layoutPane>
<!-- Bottom markings -->
<pe:layoutPane id="bottomPanel" styleClassContent="bottomPanel" position="south" resizable="false"
closable="false" spacingClosed="0" spacingOpen="0">
<!-- TODO: Determine classification marks to display -->
<!-- BEGIN FOOTER -->
<p:outputPanel styleClass="A_classmarking AE_body_classmarks_bottom" id="documentMarkingFooter">
#{tController.classificationMarking}
</p:outputPanel>
<!-- END FOOTER -->
</pe:layoutPane>
</pe:layout>
When I load report1.xhtml and resize window to iPhone size(640x960) everything works as expected and the burger menu onclick is showing the previously hidden menu options. However after the onchange event that causes page forward to report2.xhtml, the burger menu onclick is no longer working.. It's still clickable but nothing happens after clicking it.. If I make the navigation redirect instead of page forward, everything works just fine, so my conclusion is this has something to do with page forward...
After debugging on the devtools console I've got this error showing up after page load(for page forward only):
Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.
The source js is http://localhost:8080/javax.faces.resource/jquery/jquery.js.jsf?ln=primefaces&v=5.2.7
Then on resize I've got this error from source https://raw.githubusercontent.com/primefaces-extensions/core/master/src/sourcemap/3.2.0/layout.source.js:
Uncaught TypeError: Cannot read property 'state' of undefined
Again, note that those errors only occur when navigation is page forward and goes away when doing a redirect. I don't want to do a redirect because I want the URL to stay the same..