Admettons qu’un client possède plusieurs collections de site de GED. Elles traitent toutes du même sujet mais possèdent des droits différents. Naturellement il souhaite une page d’accueil permettant de savoir auxquelles l’utilisateur courant peut accéder. Il me fournit une image non découpée et souhaite que

  • Chaque tuile corresponde à un site;
  • La tuile d’un site non accessible soit grisée;
  • La tuile d’un site accessible dispose d’un effet sympa au survol.

Parce que sans contraintes techniques ce n’est pas marrant, il faut que cela fonctionne avec IE8 et soit livrable en solution sandbox.

Aspect graphique

Premièrement un peu de découpe d’image afin de faire un beau fichier de sprite avec le CSS associé. Ensuite du HTML/CSS pour assembler tout ça.

RucheAnonyme
Image fournie spritesheet2
Sprite généré assemblage
Assemblage HTML

 

Aspect SharePoint

Nous avons donc besoin de savoir si un utilisateur a le droit d’accéder à plusieurs collections de sites et cela en sandbox.

La possibilité de faire des appels cross-sitecollection en JSOM est apparue avec la version 2013 et ses apps. Il est donc impossible d’utiliser DoesUserHavePermissions. Par contre on peut toujours ruser. Par exemple en demandant par webservice si l’utilisateur peut voir des listes sur le site.

var soapEnv =
        "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>
            <soapenv:Body>
                <GetListCollection xmlns='http://schemas.microsoft.com/sharepoint/soap/'>
                </GetListCollection>
            </soapenv:Body>
        </soapenv:Envelope>";

var pathToListAsmx = "/_vti_bin/lists.asmx";

function HasAccess(name, urlToAccess)
{
    $.ajax({
        url: urlToAccess + pathToListAsmx,
        type: "POST",
        dataType: "xml",
        data: soapEnv,
        complete: function (xData, status) {
            var nbList = $(xData.responseXML).find("List").length;
            if (nbList > 2) {
                $("#" + name).removeClass("sprite-" + name + "-bw").addClass("sprite-" + name);
                
                $("#" + name).append("<a href='" + urlToAccess + "' alt='" + name + "'></a>");
                $("#" + name).hover(function () {
                    $(this).addClass('transition');
                }, function () {
                    $(this).removeClass('transition');
                });
            }
        },
        contentType: "text/xml; charset="utf-8""
    });
}

$(document).ready(function () {
    HasAccess("site1", "http://sharepoint/sitecol1");
    HasAccess("site2", "http://sharepoint/sitecol2");
    HasAccess("site3", "http://sharepoint/sitecol3");
    HasAccess("site4", "http://sharepoint/sitecol4");
    HasAccess("site5", "http://sharepoint/sitecol5");
    HasAccess("site6", "http://sharepoint/sitecol6");
});

On peut donc déployer le HTML, CSS, JS et l’image avec une sandbox.

Il suffit de référencer les fichiers dans une page avec par exemple une webpart de contenu et voilà le résultat :

bdu-ano

Etonnant, non ?