Does any one have an idea how to generate and populate nested tables with JSF.
An example of the expected output:
<table align="center" width="100%" border="1">
<tr>
<th colspan="6" scope="col">School
</th>
</tr>
<tr>
<th colspan="6" scope="col">Time
</th>
</tr>
<tr>
<th colspan="6" scope="col"> Semester </th>
</tr>
<tr>
<th scope="row">Week Commencing</th>
<th scope="row">Monday</th>
<th scope="row">Tuesday</th>
<th scope="row">Wednesday</th>
<th scope="row">Thursday</th>
<th scope="row">Friday</th>
</tr>
<tr>
<td>
<table width="100%" border="1">
<tr>
<td><br /><br />12/04/10<br /><br /> </td>
<td><table width="100%" border="1">
<tr><td>08:30 - 10:00</td></tr>
<tr><td>10:15 - 11:45</td></tr>
<tr><td>12:30 - 14:00</td></tr>
<tr><td>14:15 - 15:45</td></tr>
<tr><td>16:00 - 17:30</td></tr>
</table> </td>
</tr>
</table>
</td>
<td> <table width="100%" border="1">
<tr ><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
</table></td>
<td><table width="100%" border="1">
<tr ><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
</table></td>
<td><table width="100%" border="1">
<tr ><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
</table></td>
<td><table width="100%" border="1">
<tr ><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
</table></td>
<td><table width="100%" border="1">
<tr ><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
<tr><td>subject</td></tr>
</table></td>
</tr>
</table>
Not sure if it is exactly what you want, but subtables can be created using Richfaces's <rich:subTable> inside a <rich:dataTable>. Check the example.
Related
I am trying to make an item appear last on the list if it appears on an in the invoice (Advanced PDF,NetSuite).
I was thinking bout trying to sort by and adding some ZZZs to the item name, but thats because I dont really know much outside of basic HTML.
Any Help would be appreciated.
Below is the table code I am dealing with.
<table class="itemtable" style="width: 100%; margin-top: 10px;"><!-- start items --><#list record.item as item><#if item_index==0>
<thead>
<tr>
<th align="center" colspan="3">${item.quantity#label}</th>
<th colspan="12">${item.item#label}</th>
<th colspan="3">${item.options#label}</th>
<th align="right" colspan="4">${item.rate#label}</th>
<th align="right" colspan="4">${item.amount#label}</th>
</tr>
</thead>
</#if><tr>
<td align="center" colspan="3" line-height="150%">${item.quantity}</td>
<td colspan="12"><span class="itemname">${item.item}</span><br />${item.description}</td>
<td colspan="3">${item.options}</td>
<td align="right" colspan="4">${item.rate}</td>
<td align="right" colspan="4">${item.amount}</td>
</tr>
</#list>
I need the to be able to choose a specific itemname to always show at the bottom.
You can use the assign tag to hold the values for your bottom item.
<#assign bottomItemName = 'Bottom Item Name'>
<#assign bottomItem = {}>
<#list record.item as item>
<#if item_index==0>
<thead>
<tr>
<th align="center" colspan="3">${item.quantity#label}</th>
<th colspan="12">${item.item#label}</th>
<th colspan="3">${item.options#label}</th>
<th align="right" colspan="4">${item.rate#label}</th>
<th align="right" colspan="4">${item.amount#label}</th>
</tr>
</thead>
</#if>
<#if item.item == bottomItemName>
<#assign bottomItem = bottomItem + item>
<#else>
<tr>
<td align="center" colspan="3" line-height="150%">${item.quantity}</td>
<td colspan="12"><span class="itemname">${item.item}</span><br />${item.description}</td>
<td colspan="3">${item.options}</td>
<td align="right" colspan="4">${item.rate}</td>
<td align="right" colspan="4">${item.amount}</td>
</tr>
</#if>
</#list>
<#if bottomItem.item??>
<tr>
<td align="center" colspan="3" line-height="150%">${bottomItem.quantity}</td>
<td colspan="12"><span class="itemname">${bottomItem.item}</span><br />${bottomItem.description}</td>
<td colspan="3">${bottomItem.options}</td>
<td align="right" colspan="4">${bottomItem.rate}</td>
<td align="right" colspan="4">${bottomItem.amount}</td>
</tr>
</#if>
You could try looping 2x.
<table class="itemtable" style="width: 100%; margin-top: 10px;"><!-- start items --><#list record.item as item><#if item_index==0>
<thead>
<tr>
<th align="center" colspan="3">${item.quantity#label}</th>
<th colspan="12">${item.item#label}</th>
<th colspan="3">${item.options#label}</th>
<th align="right" colspan="4">${item.rate#label}</th>
<th align="right" colspan="4">${item.amount#label}</th>
</tr>
</thead>
</#if><#if ${item.item}!="Your Item"><tr>
<td align="center" colspan="3" line-height="150%">${item.quantity}</td>
<td colspan="12"><span class="itemname">${item.item}</span><br />${item.description}</td>
<td colspan="3">${item.options}</td>
<td align="right" colspan="4">${item.rate}</td>
<td align="right" colspan="4">${item.amount}</td>
</tr>
</#list>
<#list record.item as item><#if ${item.item}=="Your Item"><tr>
<td align="center" colspan="3" line-height="150%">${item.quantity}</td>
<td colspan="12"><span class="itemname">${item.item}</span><br />${item.description}</td>
<td colspan="3">${item.options}</td>
<td align="right" colspan="4">${item.rate}</td>
<td align="right" colspan="4">${item.amount}</td>
</tr>
</#list>
I haven't tested the if statement, so good luck
Image table
Please write full html codes for this table. You may see the Table image from above via the link.
<table border="1" width="800">
<tr>
<th>Level1</th>
<th>Level2</th>
<th>Level2</th>
<th>Info</th>
<th>Name</th>
</tr>
<tr>
<td rowspan="6">System</td>
</tr>
<tr>
<td rowspan="4">System Apps</td>
<td rowspan="2">System Memory</td>
</tr>
<tr>
<td rowspan="3">SystemEnv</td>
<td rowspan="1">SystemEnv2</td>
<td rowspan="2">Memeory Test</td>
</tr>
Here is the table code :
<table border="2">
<tr>
<th>Level 1</th>
<th>Level 2</th>
<th>Level 3</th>
<th>info</th>
<th>Name</th>
</tr>
<tr>
<td rowSpan="6">System</td>
<td rowSpan="4">System apps</td>
<td rowSpan="3">SystemEnv</td>
<td>App Text</td>
<td>foo</td>
</tr>
<tr>
<td>App memory</td>
<td>foo</td>
</tr>
<tr>
<td>App test</td>
<td>bar</td>
</tr>
<tr>
<td>Systemenv2</td>
<td>App test</td>
<td>bar</td>
</tr>
<tr>
<td rowSpan="2">System Memory</td>
<td rowSpan="2">Memory test</td>
<td>memory func</td>
<td>foo</td>
</tr>
<tr>
<td>Memory Func</td>
<td>foo</td>
</tr>
</table>
I have an Inbound Shipment saved search of items coming in listed by container. I have no problem printing the list of the items with quantities, description, etc. but when I add in the "vessel Number" or "shipment number" I don't need it to repeat on every line. I would prefer to show the information that I would normally "group" at the top of the PDF vs. on each line.
I should note that when I print the saved search, I would have already filtered the search down to one container, meaning only one "shipment number" and one "vessel number".
<table align="center" border=".5" cellpadding=".5" cellspacing=".5" class="NATIVE-TABLE" style="width:100%;"><#list results as result><#if result_index == 0>
<thead>
<tr>
<th align="center" scope="col" style="width: 107px;">
<div><big>Shipment #</big></div>
</th>
<th align="center" scope="col" style="width: 103px;">
<div><big>Status</big></div>
</th>
<th align="center" scope="col" style="width: 156px;">
<div><big>Destination</big></div>
</th>
<th align="center" scope="col" style="width: 150px;">
<div><big>Actual Ship Date</big></div>
</th>
<th align="center" scope="col" style="width: 154px;">
<div><big>Expected Delivery Date</big></div>
</th>
<th align="center" scope="col">
<div><big>Carrier</big></div>
</th>
<th align="center" scope="col">
<div><big>Vessel #</big></div>
</th>
</tr>
</thead>
</#if><tr>
<td align="center" style="width: 107px;">${result.shipmentnumber}</td>
<td align="center" style="width: 103px;">${result.status}</td>
<td align="center" style="width: 156px;">${result.custrecord142}</td>
<td align="center" style="width: 150px;">${result.actualshippingdate}</td>
<td align="center" style="width: 154px;">${result.expecteddeliverydate}</td>
<td align="center" style="width: 154px;">${result.custrecord_htd_shipper_info}</td>
<td align="center" style="width: 154px;">${result.vesselnumber}</td>
</tr>
</#list></table>
First: please post your code so we can see where you're up to and respond accordingly - it helps us to help you!
Second: The general pattern would be that you simply use values from the first result to make up your header, and then iterate through all results to give your lines. It would look something like:
<#list results as result>
<#if result_index == 0>
*header information goes here*
</#if>
*line information goes here*
</#list>
Edited to add code
<table align="center" border=".5" cellpadding=".5" cellspacing=".5" class="NATIVE-TABLE" style="width:100%;"><#list results as result><#if result_index == 0>
<thead>
<tr>
<th align="center" scope="col" style="width: 107px;">
<div><big>Shipment #</big></div>
</th>
<th align="center" scope="col" style="width: 103px;">
<div><big>Status</big></div>
</th>
<th align="center" scope="col" style="width: 156px;">
<div><big>Destination</big></div>
</th>
<th align="center" scope="col" style="width: 150px;">
<div><big>Actual Ship Date</big></div>
</th>
<th align="center" scope="col" style="width: 154px;">
<div><big>Expected Delivery Date</big></div>
</th>
<th align="center" scope="col">
<div><big>Carrier</big></div>
</th>
<th align="center" scope="col">
<div><big>Vessel #</big></div>
</th>
</tr>
</thead>
<tr>
<td align="center" style="width: 107px;">${result.shipmentnumber}</td>
<td align="center" style="width: 103px;">${result.status}</td>
<td align="center" style="width: 156px;">${result.custrecord142}</td>
<td align="center" style="width: 150px;">${result.actualshippingdate}</td>
<td align="center" style="width: 154px;">${result.expecteddeliverydate}</td>
<td align="center" style="width: 154px;">${result.custrecord_htd_shipper_info}</td>
<td align="center" style="width: 154px;">${result.vesselnumber}</td>
</tr>
</#if>
<tr>
<td align="center" style="width: 107px;"></td>
<td align="center" style="width: 103px;">${result.status}</td>
<td align="center" style="width: 156px;">${result.custrecord142}</td>
<td align="center" style="width: 150px;">${result.actualshippingdate}</td>
<td align="center" style="width: 154px;">${result.expecteddeliverydate}</td>
<td align="center" style="width: 154px;">${result.custrecord_htd_shipper_info}</td>
<td align="center" style="width: 154px;"></td>
</tr>
</#list>
</table>
I use dustjs to render my mail content and I found that it's slow when render some bigger templates. Is any tips when write dustjs template to increase the render speed, or some good practice?
details:
my template consists of several components (more than 5), each component if different from others, there is one example of the component as follow:
<tr>
<td align="center" valign="top" bgcolor="#FFFFFF">
<table cellpadding="0" cellspacing="0" width="650">
<tr>
<td align="center">
<table width="590" border="0" cellspacing="0" cellpadding="0">
{#eq key=haveBanner value=1}
<tr>
<td height="105" align="center" valign="middle">
<img src="{bannerUrl|pictureUrl}" width="590" border="0">
</td>
</tr>
{:else}
<tr>
<td align="center">
<table cellpadding="0" cellspacing="0" width="590" height="75" style="border-top:solid 3px #343434">
<tr>
<td width="130" align="left" valign="middle">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left" height="55">
<img src="{sellerLogo|pictureUrl}" width="110" height="55">
</td>
</tr>
</table>
</td>
<td width="460" align="left">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left"><font style="font-family:arial;font-size:16px;color:#292929">{compName}</strong></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
{/eq}
<tr>
<td>
<table border="0" cellpadding="0" cellspacing="0" style="border:solid 1px #dbdbdb" width="594">
<tr>
<td width="149" valign="top" style="border-right:solid 1px #dbdbdb">
<table width="146" cellspacing="0" cellpadding="0">
<tr>
{#eq key=selectedProductFlag value=1}
<td height="80" style="padding:20px 20px"><font style="font-family:arial;font-size:18px;color:#333333"><b>Promotion Products</b></font></td>
{:else}
<td height="80" style="padding:20px 20px"><font style="font-family:arial;font-size:18px;color:#333333"><b>Promotion Products</b></font></td>
{/eq}
</tr>
<tr>
<td align="center" height="26" valign="top">
<table width="119" border="0" cellspacing="0" cellpadding="0">
<tr>
<td style="border-top:solid 1px #e5e5e5"><img src="http://newimg.globalmarket.com/PA/edm/images/spacer.gif" height="1" width="1"></td>
</tr>
</table>
</td>
</tr>
{#finalProdGroupList}
<tr>
<td height="35" valign="top">
<table width="146" cellspacing="0" cellpadding="0">
<tr>
<td style="padding-left:25px"><font style="font-family:arial;font-size:12px;color:#484848">{prodGroupName}</font></td>
</tr>
</table>
</td>
</tr>
{/finalProdGroupList}
</table>
</td>
<td width="443" valign="top">
<table width="442" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<table width="442" border="0" cellspacing="0" cellpadding="0" height="255">
<tr>
{#secondaryProducts}
{#productList spIdx=$idx}
{#eq key=$idx value=2}
<td align="center" valign="top" width="147">
{:else}
<td align="center" valign="top" style="border-right:solid 1px #dbdbdb" width="147">
{/eq}
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="146" align="center">
<img src="{photoUrl|pictureUrl}" border="0" width="126" height="126" alt="{fullProdName}">
</td>
</tr>
<tr>
<td align="center">
<table width="126" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center">
<table cellpadding="0" cellspacing="0" width="126">
<tr>
<td align="left" height="33" valign="top" style="line-height:15px">
<font style="font-family:Arial;font-size:12px;color:#333333">{productName}</font>
</td>
</tr>
<tr>
<td align="left" height="20" valign="middle"><font style="font-family:Arial;font-size:12px;color:#999999">{certification}</font></td>
</tr>
<tr>
{#eq key=payForInqFlag value=1}
<td align="left" height="35" valign="middle"><img src="http://newimg.globalmarket.com/PA/edm/images/getprice2.png" width="128" height="25"></td>
{:else}
<td align="left" height="35" valign="middle"><img src="http://newimg.globalmarket.com/PA/edm/images/getprice2.png" width="128" height="25"></td>
{/eq}
</tr>
<tr>
<td height="7"></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
{/productList}
{/secondaryProducts}
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
Your problem is very likely the large amount of Dust filters you are using.
Example:
&{trackCodeData|gaTrackCode|dbTrackCode|entityId|entityType|edmpid|recId|userId|token|final}
Some of these filters are even being run in a loop. It looks like you are running well over 100 filters per render of this template. Filters are executed synchronously and serially, so Dust can't continue to render the template until the filter is done.
Without knowing what these filters do, it's hard to make specific recommendations about the filters themselves. However, you seem to use the same filters multiple times to output the same data. If possible, you should pregenerate this data and add it into the context instead of dynamically generating it.
You can gain a few more cycles by turning on whitespace compression, if you have it turned off:
dust.config.whitespace = false;
But Dust intrinsically is very fast. Without your filters, your template renders in around 3ms for me.
I have a table in JSF Page:
<table cellpadding="0" cellspacing="0" border="1" align="center">
<col width="300"/>
<col width="150"/>
<col width="150" span="3"/>
<thead>
<tr>
<th rowspan="3" > </th>
<th rowspan="3" >A</th>
<th colspan="3" >B</th>
</tr>
<tr>
<th colspan="2">C</th>
<th rowspan="2">D</th>
</tr>
<tr>
<th>E</th>
<th>F</th>
</tr>
</thead>
<tbody>
<c:forEach items="${indexbean.regions}" var="r">
<tr>
<td colspan="5" >#{r.region}</td>
</tr>
<c:forEach items="${indexbean.table_data}" var="s">
<c:if test="${s.reg eq r.region}">
<tr>
<td>#{s.rowname}</td>
<td>#{s.d1}</td>
<td>#{s.d2}</td>
<td>#{s.d3}</td>
<td>#{s.d4}</td>
</tr>
</c:if>
</c:forEach>
</c:forEach>
</tbody>
</table>
These codes work properly. But i want to use primefaces p:dataExporter (for download this table as Excel), that is why i must create this table with p:dataTable. I can't find solution what i can replace 2 forEach method in p:dataTable.
How can i create this table with Primefaces p:dataTable? Please, help me.