venerdì 19 febbraio 2010

Multi filtro un solo GO button!

Salve a tutti, come primo post vediamo di scriverne uno che possa interessare veramente tutti.

Vi é mai capitato di mettere su una pagina del dashboard piú filtri Promped e voler avere solo un tasto di GO?
Esiste la soluzione ed é estremamente facile.
L'idea non é mia l'ho presa da un'altro blog:
http://sranka.wordpress.com/2008/11/09/how-to-replace-multi-go-button-prompt-by-one/
poi ho corretto qua e la qualche cosetta e l'ho rielaborata al volo.

Dunque:

Questi sono per esempio due filtri prompt con due bei GO button:





Per ottenere un solo tasto di GO bisogna utilizzare nella pagina del dashboard degli oggetti Text.


Puó essere un text unico oppure per mettere le cose con o piú ordine utilizzare piú oggetti text. Non vi é differenza alla fine in quanto tutto quello che viene scritto sui text viene caricato nella pagina html risultante del dashboard.

Per prima cosa si aggiunge il codice javascript per non far vedere i GO button:




Il testo é:

<style>
.GFPSubmit {display: none;}
</style>


Il risultato sará:




Ora bisogna inserire due funzioni javascript e il codice html per il nuovo pulsante di GO.



Queste due nuove funzioni possono stare entrambe in due altri text object oppure una delle due puó essere messa nella libreria dei javascript per poter essere utilizzata da altre parti del dashboard.




Io ho preferito mettere tutto nella pagina per evitare di dover andare a modificare gli standard accedendo al server che non sempre é facilmente raggiungibile.


la prima funzione, quella che viene chiamata dall'altra é:


<script>

function GFPDoFilters_samvi(sViewID, tTable, bGFPReloadInline)
{
if(sViewID == ksGFPStatePath)
return;

var tExpr = XUICreateElement(saw.xml.kSawxNamespace, 'expr');
tExpr.setAttribute("xsi:type", "sawx:logical");
tExpr.setAttribute("op", "and");

for (var h = 0; h < tTable.length; ++h)
{
var tPromptCells_New = tTable[h].getElementsByTagName("TD");

for (var i = 0; i < tPromptCells_New.length; ++i)
{
var tElement = tPromptCells_New[i];
if (tElement.getAttribute("GFPBuilder") != null)
{
try
{
var tFilter = eval(tElement.getAttribute("GFPBuilder"));
if (tFilter)
{
tExpr.appendChild(tFilter);
}
}
catch (e)
{
alert('XXXX ' + e);
return;
}
}
}

}

/*
var tPromptCells = tTable.getElementsByTagName("TD");
for (var i = 0; i < tPromptCells.length; ++i)
{
var tElement = tPromptCells[i];
if (tElement.getAttribute("GFPBuilder") != null)
{
try
{
var tFilter = eval(tElement.getAttribute("GFPBuilder"));
if (tFilter)
{
tExpr.appendChild(tFilter);
}
}
catch (e)
{
alert(e);
return;
}
}
}

*/

var tDelayedDash = document.getElementById("sawDashboardDelayed");

if (tExpr.childNodes.length == 0 && !document.getElementById("sawDashboardDelayed"))
return false;
else if (tExpr.childNodes.length == 0)
tExpr = null;
else if (tExpr.childNodes.length == 1)
tExpr = tExpr.childNodes[0];

if (tExpr)
{
tExpr.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
}


var tForm = GetViewForm('', -1, bGFPReloadInline);

if (sViewID == ksGFPStatePath) // the view id (for GFP preview) is recently changed to this
{
var tRoot = XUIGetRootXML("idXUIGFPPreview");
tForm.P1.value = saw.getXmlText(saw.getFirstChildElement(tRoot));
tForm.action = saw.commandToURL("ViewPreview");
submitViewForm(tForm,null);
return;
}

GFPApplyFilters(tForm,tExpr, sViewID);
return false;
}

</script>


A questo punto non rimane che mettere l'ultimo text object che conterrá questo codice:


<script>

function customCall()
{
try{
var aElm=document.getElementsByTagName('table');
var tTableArray = new Array();
var k = 0;
for(var i=0; i<aElm.length; i++) {
if(aElm[i].className=='GFPBox') {
tTableArray[k] = document.getElementById(aElm[i].id);
k++;
}
}
GFPDoFilters_samvi('',tTableArray,true);
}
catch(e)
{alert(' XXX ' + e);}
}
</script>
<!--<td class="GFPSubmit"> -->
<td >
<table cellspacing="0">
<tbody><tr>
<td class="XUIPromptEntry">

<span class="minibuttonOn">
<a onclick="javascript:customCall();" href="javascript:void(null)">Custom Go New
</a>
</span>
<div value="dashboard" id="d:dashboard~p:b10pia6cf02k1ngq~s:j8obsfvm99vnd77s~g:c7te6i611dqgunnkScope"/>
</td>
</tr>
<tr>
<td/>
</tr>
</tbody></table></td>

Il risultato sará:

Ora basterá cliccare sul nuovo pulsante per lanciare la request associata con tutti e due i prompt che filtreranno contemporaneamente.

Spero di esservi stato di aiuto.

Ciao a tutti e benvenuti qui da me!