Monday, December 9, 2013

Office365 / SharePoint 2013 - Modificare l'ordine dei link del menu contestuale (ECB)

Se vi è capitato di utilizzare, da SharePoint Designer 2013, una Custom Action per aggiungere nel menu contestuale di un item un nuovo link (ad esempio verso una funzionalità custom o una form personalizzata), vi sarete accorti anche voi della difficoltà di inserire questo nuovo link in una posizione definita.

Al contrario dei bottoni sul Ribbon, non possiamo utilizzare schemi per la posizione e il sequence numerico sembra non avere nessun effetto.

Utilizzando la stessa funzione del mio post Office365 / SharePoint 2013 - Nascondere link del menu contestuale (ECB), ho inserito un comando aggiuntivo per invertire ad esempio il link per Eliminare un Articolo, posizionandolo al terzo posto dell'item




La funzione per la sostituzione è la seguente:

function ExchangePositionWith(firstselector, secondselector) {
    var other = $(secondselector);
    var first = $(firstselector).after(other.clone());
    other.after(first).remove();
}


In cui richiamo il primo elemento (firstselector) e lo metto al posto del secondo (secondselector).
Nel mio caso, Elimina Articolo, visualizzato per primo, mi interessa al terzo posto, quindi ho eseguito due volte la funzione:

ExchangePositionWith($("a[title='Elimina Articolo']").parent(), $("a[title='Modifica elemento']").parent());
  ExchangePositionWith($("a[title='Modifica elemento']").parent(), $("a[title='Visualizza elemento']").parent());

Et voilà:

Office365 / SharePoint 2013 - Nascondere link del menu contestuale (ECB)

Utilizzando jQuery ho inserito in un javascript un comando per sostituire le funzioni richiamate dal clic sul Menu dell'item (i "...").

$("div.ms-list-itemLink").click(function(){
  CoreInvoke('ShowECBMenuForTr', this, event);GestioneMenuItem(); return false;
 });

 $("a.ms-lstItmLinkAnchor").click(function(){
  CoreInvoke('ShowECBMenuForTr', this, event);GestioneMenuItem(); return false;
 });


Questi comandi aggiungono una funzione al metodo standard richiamato dal clic e che genera il menu contestuale dell'item.

La funzione "iniettata" esegue un secondo comando dopo qualche ms, attendendo la creazione del menu.

function GestioneMenuItem(){
 setTimeout("DoGestioneMenuItem()",300);
}


La funzione responsabile della modifica del menu è la seguente e cerca gli elementi da nascondere tramite il titolo del link:

function DoGestioneMenuItem(){
 $("a[title='Elimina elemento']").parent().hide();
}


Il risultato è che, dopo il clic ed un leggero intervallo, verrà nascosta la voce di menu.

Prima:
 
Dopo: