FIX gros bug moisi (ajout de l'information du dernier message au niveau des conversat...
authorGreg Burri <greg.burri@gmail.com>
Sat, 3 May 2008 23:03:00 +0000 (23:03 +0000)
committerGreg Burri <greg.burri@gmail.com>
Sat, 3 May 2008 23:03:00 +0000 (23:03 +0000)
doc/TODO.txt
doc/graphiques/fond3.xcf [new file with mode: 0644]
doc/protocole3.txt
img/css1/fond.png
js/euphorik.js
js/pageMinichat.js
modules/erl/euphorik_minichat.erl
modules/erl/euphorik_minichat_conversation.erl
modules/erl/euphorik_protocole.erl

index 4daa86d..be11f27 100755 (executable)
 1 : Critique
 2 : Urgent
 3 : Peu grave\r
-
+     
+[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\r
diff --git a/doc/graphiques/fond3.xcf b/doc/graphiques/fond3.xcf
new file mode 100644 (file)
index 0000000..33cf542
Binary files /dev/null and b/doc/graphiques/fond3.xcf differ
index 02051e9..585794a 100644 (file)
@@ -143,7 +143,8 @@ c -> s
       "conversations" : [
          {
             "racine" : 123,
-            "page" : 1
+            "page" : 1,
+            "last_message_id" : 4 (pas obligatoire)
          }
       ]\r
    }
index 9484037..84fd466 100755 (executable)
Binary files a/img/css1/fond.png and b/img/css1/fond.png differ
index 27ec5bb..6685b16 100755 (executable)
@@ -781,12 +781,6 @@ jQuery.noConflict()
 jQuery(document).ready(
    function()
    {  
-      /* FIXME : ce code pose problème sur konqueror, voir : http://www.kde-forum.org/thread.php?threadid=17993
-      var p = new DOMParser();
-      var doc =  p.parseFromString("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<action/>", "text/xml")
-      var s = new XMLSerializer()
-      alert(s.serializeToString(doc)) */
-   
       var util = new Util()
       var client = new Client(util)
       var pages = new Pages()
index a6ba5a6..9e042e4 100755 (executable)
@@ -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\r
+      for (var i = 0; i < this.conversations.length; i++)
+         this.conversations[i].idDernierMessageAffiche = 0\r
       
    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
index 519870c..6f229ac 100755 (executable)
@@ -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é.\r
-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} ->               \r
                      case user_by_login(Login) of\r
-                        {ok, U} when U#user.id =/= User#user.id ->\r
+                        {ok, U} when User#user.login =/= [], U#user.id =/= User#user.id ->\r
                            login_deja_pris;\r
                         _ ->               \r
                            User_modifie = User#user{
index 9015fec..a280e1f 100755 (executable)
@@ -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) 
index c2cb984..7519ba8 100755 (executable)
@@ -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\r
       {ok, U} -> U;\r
       _ -> inconnu\r