From: Greg Burri Date: Mon, 24 Mar 2008 11:23:59 +0000 (+0000) Subject: MOD avancement dans l'affichage des conversations (pas fini) X-Git-Tag: 1.0.0^2~172 X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=commitdiff_plain;h=481af0a8064ab4bdf6a5c6eba6766dd5e2d6d768 MOD avancement dans l'affichage des conversations (pas fini) --- diff --git a/doc/technique.txt b/doc/technique.txt index 81e781e..f44639a 100644 --- a/doc/technique.txt +++ b/doc/technique.txt @@ -3,6 +3,19 @@ Euphorik - doc technique == Page message == Classes : * Messages - * Conversation - * Message \ No newline at end of file + * Message + + +Sequences : + * Attente de nouveaux messages + a) Messages.rafraichirMessages + b) pour chaque conversation + i) Messages.ajouterMessages(lesMessages, numConv) + ii) Conversation.flush + + * Ajout d'un message + PageMinichat.envoyerMessage(pseudo, message) : requête AJAX + + * Création d'une conversation + * Suppression d'une conversation \ No newline at end of file diff --git a/js/pageMinichat.js b/js/pageMinichat.js index 223f6c9..c8a099a 100755 --- a/js/pageMinichat.js +++ b/js/pageMinichat.js @@ -26,8 +26,7 @@ PageMinichat.prototype.contenu = function() \

\ \ -
\ -
' +
' } PageMinichat.prototype.charger = function() @@ -39,15 +38,6 @@ PageMinichat.prototype.charger = function() this.messages.rafraichirMessages(true) this.util.setCaretToEnd(jQuery("form input.message")[0]) - - jQuery("#messages").hover( - function(){}, - function(event) - { - jQuery("#messages .message").removeClass("cache") - thisPage.messages.messageOver = null - } - ) // affichage des smiles jQuery("#smiles").html(this.formateur.getSmilesHTML()).children().each( @@ -86,9 +76,7 @@ PageMinichat.prototype.charger = function() function() { // captcha anti bot - if (jQuery("form input.captcha").val() != "") return - - thisPage.messages.allerSurLaPage(1) + if (jQuery("form input.captcha").val() != "") return thisPage.envoyerMessage( jQuery("form input.pseudo").val(), @@ -166,7 +154,7 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message) // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche) for (var i = 0; i < repondA.length; i++) { - jQuery("#messages div#" + repondA[i]).addClass("repondu") + jQuery("#conversation div#" + repondA[i]).addClass("repondu") for (var m = 0; m < this.messages.messages.length; m++) this.messages.messages[m].clientARepondu = true } @@ -307,15 +295,44 @@ Message.prototype.afficherConversation = function(messages) /** * Représente une conversation. + * @param numConv le numéro (appelé id) de la conversation + * @param formateur outil permettant la mise en forme du texte des messages */ -function Conversation() +function Conversation(numConv, formateur) { + var thisConversation = this + + this.id = numConv + this.messageOver = null // le message sur lequel se trouve le curseur + this.formateur = formateur this.messages = new Array() this.messagesParId = new Object() this.idDernierMesssage = null // la racine de la conversation (string), null = conversation principale this.page = 1 // par défaut on se trouve sur la première page + + jQuery("#conversations").append( + "
" + ) + + // enlève la mise en évidence pour la conversation + jQuery(this.getId()).hover( + function(){}, + function(event) + { + jQuery("#conversations .message").removeClass("cache") + thisConversation.messageOver = null + } + ) +} + +/** + * Retourne l'id de la conversation sous la forme (par exemple) "#conv453" + */ +Conversation.prototype.getId = function() +{ + return "#" + this.id } Conversation.prototype.ajouterMessage = function(message) @@ -329,7 +346,7 @@ Conversation.prototype.ajouterMessage = function(message) Conversation.prototype.viderMessages = function() { this.messages = new Array() - jQuery("#messages").empty() + jQuery("#conversations " + this.getId()).empty() } /** @@ -338,9 +355,9 @@ Conversation.prototype.viderMessages = function() */ Conversation.prototype.flush = function() { - var thisMessages = this + var thisConversation = this - var idDernierMessageAffiche = jQuery("#messages div:first").attr("id") + var idDernierMessageAffiche = jQuery("#conversations " + this.getId() + " div:first").attr("id") if (idDernierMessageAffiche == undefined) idDernierMessageAffiche = "0" var XHTML = "" @@ -363,16 +380,16 @@ Conversation.prototype.flush = function() "
" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo))+ "
" + "
" } - jQuery("#messages").prepend(XHTML) + jQuery("#conversations " + this.getId()).prepend(XHTML) if (myLightbox != null) myLightbox.updateImageList() - var nbMessagesAffiche = jQuery("#messages .message").size() + var nbMessagesAffiche = jQuery("#conversations " + this.getId() + " .message").size() if (nbMessagesAffiche > this.nbMessageMax) - jQuery("#messages .message").slice(this.nbMessageMax, nbMessagesAffiche).empty(); + jQuery("#conversations " + this.getId() + " .message").slice(this.nbMessageMax, nbMessagesAffiche).empty(); - jQuery("#messages .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > parseInt(idDernierMessageAffiche, 36)}).each( + jQuery("#conversations " + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > parseInt(idDernierMessageAffiche, 36)}).each( function() { jQuery(this).click( @@ -385,18 +402,18 @@ Conversation.prototype.flush = function() var tag = jQuery(".pseudo", this).text() + "{" + jQuery(this).attr("id") + "}" + ">" if (valCourant.indexOf(tag, 0) == -1) jQuery("input.message").val(tag + " " + valCourant) - thisMessages.util.setCaretToEnd(jQuery("form input.message")[0]) + thisConversation.util.setCaretToEnd(jQuery("form input.message")[0]) } ) // Q : pourquoi pas un .hover ? - // R : simplement pour éviter que lorsqu'un message arrive cela n'affecte la conversation actuellement mise en évidence + // R : simplement pour éviter que lorsqu'un message arrive cela n'affecte la conversation actuellement mise en évidence (uniquement pour Firefox) .mousemove( function(e) { - if (this !== thisMessages.messageOver) + if (this !== thisConversation.messageOver) { - thisMessages.afficherConversation(this) - thisMessages.messageOver = this + thisConversation.afficherConversation(this) + thisConversation.messageOver = this } } ) @@ -404,6 +421,33 @@ Conversation.prototype.flush = function() ) } +/** + * Etablit une liste des messages à mettre en evidence et des messages à cacher. + * Puis applique un plan diabolique. + * @param element un message de la liste des messages + */ +Conversation.prototype.afficherConversation = function(element) +{ + // cherche le message selectionné + var id = jQuery(element).attr("id") + var message = this.messagesParId[id] + if (message == undefined) return + + mess = message.afficherConversation(this) + + // FIXME : cet appel est très lent + jQuery("#conversations " + this.getId() + " .message").each( + function() + { + var jq = jQuery(this) + if (!mess.hasOwnProperty(jq.attr("id"))) + jq.addClass("cache") + else + jq.removeClass("cache") + } + ) +} + /////////////////////////////////////////////////////////////////////////////////////////////////// /** @@ -416,14 +460,12 @@ function Messages(client, formateur, util) this.util = util this.conversations = new Array() // les conversations, la première représente la conversation principale - this.conversations[0] = new Conversation() + this.conversations[0] = new Conversation(0, this.formateur) this.idDernierMesssage = null // l'id du dernier message connu // l'objet XMLHttpRequest représentant la connexion d'attente this.attenteCourante = null - - var messageOver = null // element } /** @@ -455,7 +497,7 @@ Messages.prototype.getXMLrafraichirMessages = function() XMLDocument.documentElement.appendChild(nodeNombreMessage) var nodePage = XMLDocument.createElement("page") - nodePage.appendChild(XMLDocument.createTextNode(this.conversation[0].page)) + nodePage.appendChild(XMLDocument.createTextNode(this.conversations[0].page)) XMLDocument.documentElement.appendChild(nodePage) // les conversations @@ -476,6 +518,18 @@ Messages.prototype.getXMLrafraichirMessages = function() return XMLDocument; } +/** + * Ajoute un ensemble de messages puis les affiches. + * @param elements un tableau d'éléments représentant les messages, voir protocole.txt + * @param numConversation le numéro de la conversation auquel appartiennent les messages + */ +Messages.prototype.ajouterMessages = function(elements, numConversation) +{ + for (var i = 0; i < elements.length; i++) + this.ajouterMessage(elements[i], numConversation) + this.flush(numConversation) +} + /** * Création d'un nouveau message. * Les message sont données dans l'ordre de leur id. @@ -501,44 +555,25 @@ Messages.prototype.ajouterMessage = function(element, numConversation) message.setRepondA(jQuery("repondA", element)) if (this.conversations[numConversation] == null) - this.conversations[numConversation] = new Conversation() + this.conversations[numConversation] = new Conversation(numConversation, this.formateur) this.conversations[numConversation].ajouterMessage(message) } /** * Demande à toutes les conversations de se flusher (afficher les messages non-affichés). */ -Messages.prototype.flush = function() +Messages.prototype.flushAll = function() { for (var i = 0; i < this.conversations.length; i++) - this.conversations[i].flush(). + this.flush(i) } /** - * Etablit une liste des messages à mettre en evidence et des messages à cacher. - * Puis applique un plan diabolique. - * @param element un message de la liste des messages + * Demande à une conversation de se flusher. */ -Messages.prototype.afficherConversation = function(element) +Messages.prototype.flush = function(numConv) { - // cherche le message selectionné - var id = jQuery(element).attr("id") - var message = this.messagesParId[id] - if (message == undefined) return - - mess = message.afficherConversation(this) - - // FIXME : cet appel est très lent - jQuery("#messages .message").each( - function() - { - var jq = jQuery(this) - if (!mess.hasOwnProperty(jq.attr("id"))) - jq.addClass("cache") - else - jq.removeClass("cache") - } - ) + this.conversations[numConv].flush() } Messages.prototype.viderMessages = function() @@ -587,21 +622,26 @@ Messages.prototype.rafraichirMessages = function(vider) //thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text())) - // ajoute chaque message reçu à sa conversation respective + // ajoute les messages reçu à leur conversation respective + var numConv = 0 jQuery("conversation", data.documentElement).each( function(i) { + var messages = [] jQuery("message", this).each( function(j) { - thisMessages.ajouterMessage(this, numConv) + // thisMessages.ajouterMessage(this, numConv) + messages.push(this) } ) + thisMessages.ajouterMessages(messages, numConv) + numConv += 1 } ) // demande à toutes les conversations d'afficher les messages non-affichés - thisMessages.flush() + //thisMessages.flush() // rappel de la fonction dans 100 ms setTimeout(function(){ thisMessages.rafraichirMessages() }, 100);