Avec Sharepoint (2003 & 2007) on peut voir la présence (sur IM/MSN/Microsoft Messenger/Office Messenger/Microsoft Lynk) des utilisateurs directement dans une page Web grâce à des petites bulles de couleur. Quand on place le curseur au-dessus on aperçoit un popup avec diverses informations et possibilités. Cela n’est disponible que pour Internet Explorer puisqu’on utilise ici de l’ActiveX (et en particulier NameCtrl).
Je force le mode standard d’IE dans mon Sharepoint, et j’ai remarqué que les fonctions ProcessImn()
et IMNRC()
(l’une appelant l’autre) causaient un plantage d’IE avec un CPU qui montait en charge, et cela pour les pages qui contiennent un grand nombre de personnes et donc de bulles de présence (typiquement une liste AllItems avec des colonnes qui montrent cette information).
J’ai donc décidé de créer une alternative à l’affichage de la présence dans Sharepoint en utilisant mes propres fonctions.
Le résultat est le suivant :
/* on commence par supprimer les deux fonctions qui posent problèmes */ function IMNRC() {} function ProcessImn() {} var nameCtrl; // on s'assure de définir nameCtrl var presence={}; // on crée un objet presence qui va nous servir à mettre en cache l'état de chaque individu // Cette fonction fait apparaitre un menu/popup avec les informations de présence de l'utilisateur function showIMMenu() { var el=window.event.srcElement; var pos=el.getBoundingClientRect(); // on place le menu en question à la position pos.left et pos.top nameCtrl.ShowOOUI(el.getAttribute("sip"), 0, pos.left, pos.top); } // Cette fonction va cacher le menu function hideIMMenu() { nameCtrl.HideOOUI() } // Cette fonction va permettre de modifier la bulle avec celle qui correspond à l'état de présence de l'utilisateur function ChangeIMPresence(sip, state, imgID) { if (presence[imgID] == state) return; presence[imgID]=state; var imgIM=document.getElementsByName(imgID); for (var i=0; i<imgIM.length; i++) { var alt="",src="imnhdr.gif"; // default image (grey) switch(state) { case 0: alt="Online"; src="imnon.png"; break; case 1: alt="Offline"; src="imnoff.png"; break; case 2: alt="Away"; src="imnaway.png"; break; case 4: alt="Be Right Back"; src="imnaway.png"; break; case 3: alt="Busy"; src="imnbusy.png"; break; case 5: alt="On the Phone"; src="imnbusy.png"; break; case 6: alt="Out to Lunch"; src="imnaway.png"; break; default: alt="Unknown"; src="imnhdr.gif"; } imgIM[i].src="http://your_sharepoint/_layouts/images/"+src; imgIM[i].alt=alt; } } // Maintenant on initialise l'objet ActiveX function initIMPresence() { if (typeof ActiveXObject == "function") { // seulement pour IE if (typeof nameCtrl=="undefined") nameCtrl=new ActiveXObject('Name.NameCtrl.1'); var imgIM=document.getElementsByName("imnmark"); // toutes les bulles de présence ont le nom "imnmark" for (var i=0; i<imgIM.length; i++) { var sip=imgIM[i].getAttribute("sip"); // l'attribut "sip" retourne l'information que l'on souhaite if (sip!=null) { sip=sip.slice(4); var state=nameCtrl.GetStatus(sip, "imnmark_"+sip); // retourne la présence basée sur le SIP (adresse email) nameCtrl.OnStatusChange=ChangeIMPresence; imgIM[i].src="http://your_sharepoint/_layouts/images/imnhdr.gif"; imgIM[i].alt="Unknown"; imgIM[i].name+="_"+sip; imgIM[i].onclick=showIMMenu; imgIM[i].onmouseover=showIMMenu; // quand on passe la souris au-dessus d'une bulle on verra le menu imgIM[i].onmouseout=hideIMMenu; } } } } // et on lance tout ça ! initIMPresence();
En ajoutant ce bout de code à ma masterpage j’ai pu conserver les bulles de présence tout en évitant un plantage d’IE 🙂