From 5f49b7e6af9be3e2415136013370af4ac99d59da Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Sat, 3 May 2008 23:03:00 +0000 Subject: [PATCH] FIX gros bug moisi (ajout de l'information du dernier message au niveau des conversations) --- doc/TODO.txt | 6 ++- doc/graphiques/fond3.xcf | Bin 0 -> 1837 bytes doc/protocole3.txt | 3 +- img/css1/fond.png | Bin 212 -> 362 bytes js/euphorik.js | 6 --- js/pageMinichat.js | 49 +++++++++++++----- modules/erl/euphorik_minichat.erl | 4 +- .../erl/euphorik_minichat_conversation.erl | 14 +++-- modules/erl/euphorik_protocole.erl | 8 ++- 9 files changed, 60 insertions(+), 30 deletions(-) create mode 100644 doc/graphiques/fond3.xcf diff --git a/doc/TODO.txt b/doc/TODO.txt index 4daa86d..be11f27 100755 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -151,7 +151,11 @@ 1 : Critique 2 : Urgent 3 : Peu grave - + +[1] Bug rafraichissement des conversations, exemple : + - la page 2 de la conv est affiché (mess 1 à 10) et la conv principale contient les mess de 11 à 2. + - lors de l'ajout d'un mess dans la conv celle ci n'est pas rafraichit. + - trouver une solution : donné un idDernierMess pour chaque conv ou supprimer cet idDernierMess et jouer sur le fait que l'on recoit un message après l'autre (orientation des messages après attente) [1] Lors de l'extraction d'une conv il arrive que la conv extracté soit bien créée mais vide, le bouton ne ferme pas la conv (très étrange, bug de firefox?) [2] Quand on revient en arrière dans firefox le message en rédaction est perdu [2] En changeant de page puis en revenant sur la page principale les smiles ne sont plus highlightés lorsque le curseur les survol diff --git a/doc/graphiques/fond3.xcf b/doc/graphiques/fond3.xcf new file mode 100644 index 0000000000000000000000000000000000000000..33cf542db1a4c3124a3eb0abced4c23a062eb5a8 GIT binary patch literal 1837 zcmc&#&2G~`5OxB}2A6spe(a-{Q_@3lfrGDBk%Ex;@rk?Zt{scSu54FLBqUyd124gW zSKtA7D+J%z>ne!Yk$hpKZ@+JMc4lYncoQe=AHRv8goedyM_>!N)Pu&ckfImT8H(M$QK>a~YKKQrslvQoMTo)+f(NwKZ7>v7E!y zL(@hdni<$rpr@<9lQ-f`u$4I`+K>j=2%s1B8yG81yYDFt()1mDw4?9u=;IyDp($5m z41&%eYknAa>M4!GrP3alfW5;{U^1`9@C!|t!E_GTy_xHd(T=I%Ab&fo4qqK->kRps z(TCm6v#D?1Q9JeJ9`IWRGuea#c5mhr$85*cbdbLtR)?>SvnLGsnc0Wk&ab6l| zHhtIH(RmPljPvX|t*-a~btyHMA}SjFstUWkfHYiKjQ;M(yc+BYP0-Fa;5+d14~PHg A s "conversations" : [ { "racine" : 123, - "page" : 1 + "page" : 1, + "last_message_id" : 4 (pas obligatoire) } ] } diff --git a/img/css1/fond.png b/img/css1/fond.png index 948403721e935b3321523c0f98484f9b54ed0593..84fd46678871cf1a8011bc191c76ecdcf29e767f 100755 GIT binary patch delta 288 zcmcb@_=-ufGr-TCmrII^fq{Y7)59eQNIQTq2OE%Fm05UiqM|(yvjDHGQqs~HKq1MA zIg<76p1uL$jeO!j{!vdC$B>F!Z*LoNwK(vwUMRen)~#zh{kwff@1b{`*F+RGo-CD> znA5IU@38#*uG-_SbC1_;wR!f`)+lsueaQNYdw^yDt$RLevvkVyim!9NgX{%?|HlhV zj;}6u`o(ZkW+5wB$loV7;0i+O-_M`>_^PENH&{i(Im-v{e((6twiV1}*s->5GJ_7|qv;M{c~4hAmvv4F FO#m|7VS)ev delta 137 zcmaFGbcIo|Gr-TCmrII^fq{Y7)59eQNDF{42OE%-|NK93qM|(yqX-Mzm809UfI_kp zb0qykGEx=XJ$(b-r>N!u#k4(L978NlCqEJ9{&Bv6{m;+8yz@<%g_&Cut~4A>VBlU@ jk(T&WiucIFd\n", "text/xml") - var s = new XMLSerializer() - alert(s.serializeToString(doc)) */ - var util = new Util() var client = new Client(util) var pages = new Pages() diff --git a/js/pageMinichat.js b/js/pageMinichat.js index a6ba5a6..9e042e4 100755 --- a/js/pageMinichat.js +++ b/js/pageMinichat.js @@ -296,6 +296,7 @@ function Conversation(num, util, formateur, client) this.util = util this.formateur = formateur this.client = client + this.idDernierMessageAffiche = 0 this.messages = new Array() this.messagesParId = new Object() @@ -403,6 +404,7 @@ Conversation.prototype.ajouterMessage = function(message) Conversation.prototype.viderMessages = function() { this.messages = new Array() + this.idDernierMessageAffiche = 0 jQuery("#conversations #" + this.getId() + " .message").remove() } @@ -415,18 +417,15 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv) { var thisConversation = this - var idDernierMessageAffiche = jQuery("#conversations #" + this.getId() + " div:first").attr("id") - idDernierMessageAffiche = (idDernierMessageAffiche == undefined ? 0 : parseInt(idDernierMessageAffiche, 36)) - // est-ce que le prochain message est pair ? (permet d'alterner le style des messages) - var messagePair = (idDernierMessageAffiche == 0 ? true : + var messagePair = (this.idDernierMessageAffiche == 0 ? true : (jQuery("#conversations #" + this.getId() + " div:first").attr("class").search("messagePair") == -1) ) // construction de l'XHTML des messages var XHTML = "" for (var i = this.messages.length - 1; i >= 0; i--) - if (this.messages[i].id > idDernierMessageAffiche) + if (this.messages[i].id > this.idDernierMessageAffiche) { var message = this.messages[i] @@ -470,7 +469,7 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv) jQuery("#conversations #" + this.getId() + " .message").slice(this.nbMessageMax, nbMessagesAffiche).empty() // Ajoute les événements liés à chaque message - jQuery("#conversations #" + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > idDernierMessageAffiche}).each( + jQuery("#conversations #" + this.getId() + " .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > thisConversation.idDernierMessageAffiche}).each( function() { jQuery(".lienConv", this).click( @@ -520,6 +519,9 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv) ) } ) + + this.idDernierMessageAffiche = jQuery("#conversations #" + this.getId() + " div:first").attr("id") + this.idDernierMessageAffiche = (this.idDernierMessageAffiche == undefined ? 0 : parseInt(this.idDernierMessageAffiche, 36)) } /** @@ -574,7 +576,8 @@ function Messages(client, formateur, util) this.conversations = new Array() // les conversations, la première représente la conversation principale this.nouvelleConversation(0) - this.idDernierMessage = null // l'id du dernier message connu +// Obsolète + //this.idDernierMessage = null // l'id du dernier message connu // l'objet JSONHttpRequest représentant la connexion d'attente this.attenteCourante = null @@ -590,15 +593,28 @@ Messages.prototype.getJSONrafraichirMessages = function() "page" : "chat", "message_count" : conf.nbMessageAffiche, "main_page" : this.client.pagePrincipale, - "conversations" : this.client.getJSONConversations() + "conversations" : this.getJSONConversations() } if (this.client.cookie != null) mess["cookie"] = this.client.cookie; - if (this.idDernierMessage != null) mess["last_message_id"] = this.idDernierMessage + mess["last_message_id"] = this.conversations[0].idDernierMessageAffiche + + // obsolète + //if (this.idDernierMessage != null) mess["last_message_id"] = this.idDernierMessage return mess } +Messages.prototype.getJSONConversations = function() +{ + var clientConv = this.client.getJSONConversations() + for (var i = 1; i < this.conversations.length; i++) + { + clientConv[i-1]["last_message_id"] = this.conversations[i].idDernierMessageAffiche + } + return clientConv +} + /** * Ajoute un ensemble de messages puis les affiches. * @param elements un tableau d'éléments JSON représentant les messages, voir protocole.txt @@ -624,8 +640,9 @@ Messages.prototype.ajouterMessage = function(element, numConversation) // pas d'utilisation de jquery pour des raisons de performance var id = element["id"] - if (this.idDernierMessage == null || id > this.idDernierMessage) - this.idDernierMessage = id + // Obsolète + /*if (this.idDernierMessage == null || id > this.idDernierMessage) + this.idDernierMessage = id*/ var message = new Message( id, @@ -756,7 +773,8 @@ Messages.prototype.flush = function(numConv) Messages.prototype.viderMessages = function() { - this.idDernierMessage = null + // Obsolète + //this.idDernierMessage = null for (var i = 0; i < this.conversations.length; i++) this.conversations[i].viderMessages() @@ -785,8 +803,11 @@ Messages.prototype.rafraichirMessages = function(vider) this.stopAttenteCourante() + /*if (vider) + this.idDernierMessage = null*/ if (vider) - this.idDernierMessage = null + for (var i = 0; i < this.conversations.length; i++) + this.conversations[i].idDernierMessageAffiche = 0 dumpObj(this.getJSONrafraichirMessages()) this.attenteCourante = jQuery.ajax({ @@ -802,7 +823,7 @@ Messages.prototype.rafraichirMessages = function(vider) if (vider) thisMessages.viderMessages() - // ajoute les messages reçu à leur conversation respective + // ajoute les messages reçus à leur conversation respective for (var numConv = 0; numConv < data["conversations"].length; numConv++) { // ya pas de nouveaux message -> on passe à la prochaine conversation diff --git a/modules/erl/euphorik_minichat.erl b/modules/erl/euphorik_minichat.erl index 519870c..6f229ac 100755 --- a/modules/erl/euphorik_minichat.erl +++ b/modules/erl/euphorik_minichat.erl @@ -196,14 +196,14 @@ update_pseudo_user(UserId, Pseudo) -> % Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié. -set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Nick_format, Conversations) -> +set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, Page_principale, Conversations) -> if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login -> resultat_transaction(mnesia:transaction( fun() -> case user_by_cookie(Cookie) of {ok, User} -> case user_by_login(Login) of - {ok, U} when U#user.id =/= User#user.id -> + {ok, U} when User#user.login =/= [], U#user.id =/= User#user.id -> login_deja_pris; _ -> User_modifie = User#user{ diff --git a/modules/erl/euphorik_minichat_conversation.erl b/modules/erl/euphorik_minichat_conversation.erl index 9015fec..a280e1f 100755 --- a/modules/erl/euphorik_minichat_conversation.erl +++ b/modules/erl/euphorik_minichat_conversation.erl @@ -27,7 +27,7 @@ % Message est le message de type #minichat et Parents une liste d'Id. % Plus est un bool. Si Plus vaut true alors il y a encore des messages. % Si il n'y a pas de nouveaux message alors la fonction est bloquante et attend un nouveau message. -% @spec conversations([{integer(), integer()}], integer(), integer(), integer()) -> [Conversation()] +% @spec conversations([{integer(), integer(), integer()}], integer(), integer(), integer()) -> [Conversation()] conversations(Racines, N, D, P) -> % écoute des nouveaux messages case subscribe(minichat, 2) of @@ -36,6 +36,7 @@ conversations(Racines, N, D, P) -> _ -> % demande des conversations Conversations = conversations_detailees(Racines, N, D, P), + %io:format("Conversations : ~p~n", [Conversations]), % si les conversations sont vides alors on attend un nouveau message Vide = not any( fun(C) -> @@ -50,11 +51,14 @@ conversations(Racines, N, D, P) -> Conversations_mises_en_forme = mise_en_forme_conversations( if Vide -> attend_nouveau_message(), + %io:format("Racines = ~p, N = ~p, D = ~p, P = ~p~n", [Racines, N, D, P]), + %io:format("Conversations = ~p~n", [conversations_detailees(Racines, N, D, P)]), conversations_detailees(Racines, N, D, P); true -> Conversations end ), + %io:format("Conversations_mises_en_forme = ~p~n", [Conversations_mises_en_forme]), unsubscribe(minichat), Conversations_mises_en_forme end. @@ -132,7 +136,7 @@ mise_en_forme_conversation(Messages) -> % Racines est une liste de tuple {Id, P} des racines des conversations ou P est la page et Id l'id du message. % @spec conversations_detailees([{integer(), integer()}], integer(), integer(), integer()) -> [[integer()] | Conversation_detailee()] conversations_detailees(Racines, N, D, P) -> - Conversations = map(fun({Racine, P_conv}) -> conversation(Racine, N, D, P_conv) end, Racines), + Conversations = map(fun({Racine, P_conv, Dernier}) -> conversation(Racine, N, Dernier, P_conv) end, Racines), Conversation_principale = resultat_transaction(transaction(fun() -> Curseur = qlc:cursor(q([E#minichat.id || E <- qlc:sort(table(minichat), [{order, descending}])])), {CP, Plus} = conversation_principale(Curseur, Conversations, N, P), @@ -202,10 +206,10 @@ conversation(R, N, D, P) -> if Decalage > length(C) -> []; true -> - reverse(filter( + filter( fun(E) -> E > D end, - sublist(C, Decalage, N) - )) + reverse(sublist(C, Decalage, N)) + ) end, reverse(X), Decalage + N - 1 < length(C) diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index c2cb984..7519ba8 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -109,7 +109,13 @@ wait_event(Data) -> {value, {_, Message_count}} = lists:keysearch(message_count, 1, Data), Main_page = case lists:keysearch(main_page, 1, Data) of {value, {_, P}} -> P; _ -> 1 end, {value, {_, {array, Conversations_json}}} = lists:keysearch(conversations, 1, Data), - Conversations = lists:map(fun({struct, [{root, Racine}, {page, Page}]}) -> {Racine, Page} end, Conversations_json), + Conversations = lists:map( + fun({struct, [{root, Racine}, {page, Page} | Reste]}) -> + Last_mess_conv = case Reste of [{last_message_id, L}] -> L; _ -> 0 end, + {Racine, Page, Last_mess_conv} + end, + Conversations_json + ), User = case euphorik_minichat:user_by_cookie(Cookie) of {ok, U} -> U; _ -> inconnu -- 2.45.2