I have a table that has some data on it and some of their cell must be sum into some other cells in the same row for each data row present. I'd like to make it dinamically at clientside to reduce some of the serverload since there are some millions of family rows paginated in some cases.
The table is generated as follows:
<rich:subTable id="tb" var="fila" value="#{AdministrarDMPermanente.listaDistribucionRecHum}" rowKeyVar="rowk">
<rich:column style="text-align:center">
<h:outputText value="#{fila.familiasP}"
id="family1#{rowk+1}" />
</rich:column>
<rich:column style="text-align:center">
<h:outputText value="#{fila.familiasPA}"
id="family2#{rowk+1}" />
</rich:column>
<rich:column style="text-align:center">
<h:outputText value="#{fila.familiasPAS}"
id="family3#{rowk+1}" />
</rich:column>
<rich:column style="text-align:center">
<h:outputText value="cargando..." id="totalfam#{rowk+1}" />
<h:outputText value="#{fila.totalFamilias}" />
</rich:column>
</rich:subTable>
And I want it to be generated in some way more like:
<rich:subTable id="tb" var="fila" value="#{AdministrarDMPermanente.listaDistribucionRecHum}" rowKeyVar="rowk">
<rich:column style="text-align:center">
<h:outputText value="#{fila.familiasP}"
id="family1#{rowk+1}" />
</rich:column>
<rich:column style="text-align:center">
<h:outputText value="#{fila.familiasPA}"
id="family2#{rowk+1}" />
</rich:column>
<rich:column style="text-align:center">
<h:outputText value="#{fila.familiasPAS}"
id="family3#{rowk+1}" />
</rich:column>
<rich:column style="text-align:center">
<h:outputText value="cargando..." id="totalfam#{rowk+1}" />
<rich:jQuery
selector="[id^='frmCalculoRHP'][id$='totalfam#{rowk+1}']"
query="[id^='frmCalculoRHP'][id$='family1#{rowk+1}']+
[id^='frmCalculoRHP'][id$='family2#{rowk+1}']+
[id^='frmCalculoRHP'][id$='family3#{rowk+1}']" />
<ui:remove>
<h:outputText value="#{fila.totalFamilias}" />
</ui:remove>
</rich:column>
</rich:subTable>
When I try this approach get some javascript code with brackets changed to entities:
<script type="text/javascript">//<![CDATA[
{
var selector = "[id^=\'frmCalculoRHP\'\x5D[id$=\'totalfam1\'\x5D";
try {
selector = eval("[id^=\'frmCalculoRHP\'\x5D[id$=\'totalfam1\'\x5D");
} catch (e) {}
jQuery(selector).[id^='frmCalculoRHP'][id$='family1']+[id^='frmCalculoRHP'][id$='family2']+[id^='frmCalculoRHP'][id$='family3'];
}
//]]>
</script>
On my research I found that it could be done in some similar way to:
function totalFrom() {
var table = document.getElementById(document.querySelector('[id^="frmCalculoRHP:table"]').id);
for (var i = 3; i < table.rows.length; i++) {
var total = 0;
var firstColumn = table.rows[i].cells[6]
var input = firstColumn.getElementsByTagName('span')[0];
var value = parseInt(input.textContent);
if (!isNaN(value)) {
total += value;
}
var secondColumn = table.rows[i].cells[7];
var input = secondColumn.getElementsByTagName('span')[0];
var value1 = parseInt(input.textContent);
if (!isNaN(value1)) {
total += value1;
}
var thirdColumn = table.rows[i].cells[8];
var input = thirdColumn.getElementsByTagName('span')[0];
var value2 = parseInt(input.textContent);
if (!isNaN(value2)) {
total += value2;
}
var qry="[id^='frmCalculoRHP'][id$='totalfam"+(i-2)+"']";
var resu=document.getElementById(document.querySelector(qry).id);
resu.textContent=total;
}
}
content table row starts on 3rd row that's why in the script you can see var i = 3
.