Thursday, January 24, 2013

SharePoint 2007/2010 - Implementare un Select All Checkbox su tutta la Site Collection

Grazie al lavoro di un collega, effettuato su una form di una lista, al Cliente è venuta l'idea di implementare lo stesso controllo per selezionare/deselezionare tutti i check di una colonna di tipo Choice, su tutti i form che utilizzano la Site Column, su SharePoint 2007..

Se il lavoro fosse stato quello di implementare il controllo solo su una lista, lo avrei fatto comodamente sulle pagine di Edit e New Item per quella lista, tramite SharePoint Designer.
Ma purtroppo, la colonna in oggetto è presente su diverse liste o library della site collection (sub site compresi!).

L'idea è stata quella di utilizzare la master page (comune a tutti i siti e sottositi), un po' di jquery e una modifica sulla Site Column in questione.

Abbiamo una colonna di sito, di tipo Choice, con nome MyCheck, visualizzata con i checkbox.
Inseriamo in testa ai valori di scelta della colonna il valore "Select All MyCheck" (uso il nome della colonna così da poter replicare il concetto anche su altre site column analoghe!).

Ora modifichiamo, con il Designer la master.page di default, inserendo semplicemente il link agli script jquery e al nostro script "magico".
Salviamo, pubblichiamo, approviamo e rendiamo la modifica valida per tutti i siti.

Ora creiamo il file javascript e posizioniamolo nella root della site collection (ad es in SiteAttets).

Inseriamo il codice che segue. Richiamando quindi la funzione

checkSelectAll("Select All MyCheck");

Viene implementato il controllo, lato client, e alla selezione del primo check ("Select All MyCheck") vengono selezionati tutti i check seguenti e deselezionandolo, vengono deselezionati!

Questo script viene richiamato ad ogni caricamento di ogni pagina, di ogni form, di ogni sito che usa la stessa master.page: se incontra il check in questione, allora implementa il controllo, altrimenti, prosegue senza problemi.

Non ho testato se può funzionare con il 2010..

Lo script è stato creato in poco tempo, quindi è senz'altro da ottimizzare: ogni suggerimento è ben accetto!


<script>


function getField_JQ(fieldType,fieldTitle)
{
return $(fieldType+"[title='"+fieldTitle+"']");
}

function checkSelectAll(objCheckAll_Title)
{
//select span with title = "Select All MyCheck"
var objCheckAll = getField_JQ("span",objCheckAll_Title);
        //select input checkbox in span
var inpCheckAll = objCheckAll.children(':input');
        //find parent tbody for span (table>tbody>tr>td>span)
var parentTableBody = objCheckAll.parent().parent().parent();
        //for check all, set event for change value
inpCheckAll.change(function(){
if(this.checked){ 
parentTableBody.children('tr').children('td').children('span').children('input').each(function(){
this.checked = true;
});
}
else{
parentTableBody.children('tr').children('td').children('span').children('input').each(function(){
this.checked = false;
});
}
});
}

//then call function to set control!
checkSelectAll("Select All MyCheck");

//if you have other site columns with this behaviour, call function
//checkSelectAll("Select All NameColumn");

</script>