Ajouter un lien dans la Suite Links se fait simplement avec le SuiteLinksDelegate, un nouveau delegate de SP2013. D’ailleurs Tobias Zimmergren a fait un très bel article sur le sujet.

Links

Lister les sites que l’utilisateur courant suit se fait aussi facilement en JSOM en utilisant la méthode [Ajouter un lien dans la Suite Links se fait simplement avec le SuiteLinksDelegate, un nouveau delegate de SP2013. D’ailleurs Tobias Zimmergren a fait un très bel article sur le sujet.

Links

Lister les sites que l’utilisateur courant suit se fait aussi facilement en JSOM en utilisant la méthode](http://msdn.microsoft.com/fr-fr/library/office/jj679681%28v=office.15%29.aspx) de l’objet SP.Social.SocialFollowingManager.

Par contre ajouter un menu déroulant dans la Suite Links pour les afficher demande une petite gymnastique JavaScript. Au passage, un lien vers le site personnel de l’utilisateur est le bienvenu pour qu’il puisse gérer ses suivis.

Il reste à faire l’habillage de la liste imbriquée ainsi créée avec du CSS. Pour le déploiement, le delegate AdditionalPageHead va permettre l’enregistrement des fichiers JS et CSS.

Et voilà le rendu :

FollowedSites

Ci-dessous le code nécessaire :

function getFollowedSitesSucceeded() {
    // add Communautés link in SuiteLinks section
    var navU = jQuery("#suiteLinksBox > ul.ms-core-suiteLinkList");
    var addNode = jQuery("<a id='Suite_CustomSites_ShellAddNew' href='#' class='ms-core-suiteLink-a' />")
    .append(jQuery("<span/>")
        .text("Communaut351s")
        .append(jQuery("<span class='ms-suitenav-downarrowBox'/>")
                .append(jQuery("<img class='ms-suitenav-downarrowIcon' src='/_layouts/15/images/spcommon.png?rev=23' />"))
        )
    );
    
    // create drop down menu
    var menu = jQuery("<ul class='ms-core-menu-list' id='custom-sites-menu'/>");
    var subli = jQuery("<li/>");
    var innerDiv;
    for (var i = 0; i < this.result.length; i++) {
        var actor = this.result[i];
        // split sites into columns of 5 elements
        if (i % 5 == 0) {
            subli.append(innerDiv);
            innerDiv = jQuery("<div/>").attr("class", "subcontainer");
        }

        innerDiv.append(jQuery("<div/>").attr("id", actor.get_id().split(".").join(""))
                .append(
                    jQuery("<a/>")
                        .attr("class", "ms-core-menu-link")
                        .attr("href", actor.get_uri())
                        .text(actor.get_name()))
        );
    }

    // build everything
    subli.append(innerDiv);
    menu.append(subli);

    var menuNode = jQuery("<div/>")
        .attr("class", "ms-core-menu-box ms-core-suitemenu")
        .append(menu);

    newLi = jQuery("<li/>").attr("class", "ms-core-suiteLink")
        .append(addNode)
        .append(menu);

    navU.prepend(newLi);
    
    getUserProperties();
}

function getFollowedSites() {
    var clientContext = SP.ClientContext.get_current();
    var socialManager = new SP.Social.SocialFollowingManager(clientContext);
    var socialActor = new SP.Social.SocialActorInfo();
    socialActor.set_actorType(SP.Social.SocialActorTypes.sites);
    this.result = socialManager.getFollowed(socialActor);
    clientContext.executeQueryAsync(Function.createDelegate(this, this.getFollowedSitesSucceeded), Function.createDelegate(this, this.onQueryFailed));
}

// Alert error
function onQueryFailed(sender, args) {
    alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());
}

function getUserProperties() {
    var clientContext = new SP.ClientContext.get_current();
    var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);
    personProperties = peopleManager.getMyProperties();
    clientContext.load(personProperties);
    clientContext.executeQueryAsync(getUserPropertiesSuccess, onQueryFailed);
}

function getUserPropertiesSuccess() {
    // if personalUrl is set, add a link to personal page
    var personalUrl = personProperties.get_personalUrl();
    if (personalUrl === "undefined") {
    }
    else {
        $("#custom-sites-menu").append(jQuery("<li/>").attr("class", "clear").append(
            jQuery("<a/>").attr("href", personalUrl + "Social/Sites.aspx")
                        .attr("class", "ms-core-menu-link footer")
                        .text("Ma page de suivi")
        ));
    }
}

jQuery(document).ready(function () {
    // Make sure SP.ClientContext is available
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
        // Make sure SocialFollowingManager is available
        SP.SOD.executeFunc('userprofile', 'SP.Social.SocialFollowingManager', function () {
            getFollowedSites();
        });
    });
});
#suiteLinksBox ul li ul{display:none;background-color:#006668;}
#suiteLinksBox ul li ul a,#suiteLinksBox ul li ul a:hover,#suiteLinksBox ul li ul a:link,#suiteLinksBox ul li ul a:visited{color:#FFF;}
#suiteLinksBox ul li:hover ul{display:block;z-index:5;background-color:#006668;}
#suiteLinksBox li ul{position:absolute;}
.clear{clear:both;}
#suiteLinksBox .footer{font-weight:700;text-align:center;}
#suiteLinksBox li ul div.subcontainer{float:left;}
#suiteLinksBox li ul div.subcontainer div:hover,#suiteLinksBox .footer:hover{background-color:#009597;}