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
"conversations" : [
{
"racine" : 123,
- "page" : 1
+ "page" : 1,
+ "last_message_id" : 4 (pas obligatoire)
}
]\r
}
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()
this.util = util
this.formateur = formateur
this.client = client
+ this.idDernierMessageAffiche = 0
this.messages = new Array()
this.messagesParId = new Object()
Conversation.prototype.viderMessages = function()
{
this.messages = new Array()
+ this.idDernierMessageAffiche = 0
jQuery("#conversations #" + this.getId() + " .message").remove()
}
{
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]
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(
)
}
)
+
+ this.idDernierMessageAffiche = jQuery("#conversations #" + this.getId() + " div:first").attr("id")
+ this.idDernierMessageAffiche = (this.idDernierMessageAffiche == undefined ? 0 : parseInt(this.idDernierMessageAffiche, 36))
}
/**
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
"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
// 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,
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()
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({
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
% 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{
% 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
_ ->
% 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) ->
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.
% 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),
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)
{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