ADD trois mode d'affichage pour les pseudos
authorGreg Burri <greg.burri@gmail.com>
Fri, 2 May 2008 19:42:27 +0000 (19:42 +0000)
committerGreg Burri <greg.burri@gmail.com>
Fri, 2 May 2008 19:42:27 +0000 (19:42 +0000)
14 files changed:
css/1/euphorik.css
doc/graphiques/fond2.xcf
doc/protocole3.txt
doc/uml.zargo [new file with mode: 0644]
index.html
js/euphorik.js
js/pageMinichat.js
js/pageProfile.js
modules/erl/euphorik_bd.erl
modules/erl/euphorik_minichat.erl
modules/erl/euphorik_minichat_conversation.erl
modules/erl/euphorik_protocole.erl
modules/erl/euphorik_requests.erl
modules/include/euphorik_bd.hrl

index fa7be6e..16b6436 100755 (executable)
@@ -54,10 +54,6 @@ body {
        z-index: 10;
        left: 600px;    
        top:0px;
-       border: 1px;
-       background-color: #164200; 
-       border: #2d8800 1px solid;
-       color: #EEEEEE;
        font-size: 9px;
 }
 
@@ -135,22 +131,11 @@ div#info .boutons div:hover {
 \r
 .captcha {\r
        display:none\r
-}\r
-\r
-/* Obsolète
-#captcha {
-       margin-bottom: 5px;
-}
-#captcha input {
-       margin-left: 5px;
 }
-#captcha .captchaImg {
-       background-color: #FFFFFF;
-       vertical-align: bottom;
-}*/
 
 form input,
-form button {
+form button,
+form select {
        background-color: #164200; 
        border: #2d8800 1px solid;
        color: #EEEEEE;
index 676ced8..902ba65 100644 (file)
Binary files a/doc/graphiques/fond2.xcf and b/doc/graphiques/fond2.xcf differ
index 3f154a3..02051e9 100644 (file)
@@ -81,7 +81,8 @@ ou
       "nick" : "Paul",\r
       "login" : "paul49",\r
       "email" : "paul@pierre.com",\r
-      "css" : "css/3/euphorik.css",\r
+      "css" : "css/3/euphorik.css",
+      "nick_format" : "nick" | "login" | "nick_login",\r
       "main_page" : 1,
       "conversations" : [
          {
@@ -109,7 +110,8 @@ c -> s
       "password" : "IJKJDHHSAD9081238",\r
       "nick" : "Paul",\r
       "email" : "paul@pierre.com",\r
-      "css" : "css/3/euphorik.css",\r
+      "css" : "css/3/euphorik.css",
+      "nick_format" : "nick" | "login" | "nick_login",\r
       "main_page" : 1,
       "conversations" : [
          {
diff --git a/doc/uml.zargo b/doc/uml.zargo
new file mode 100644 (file)
index 0000000..14e23be
Binary files /dev/null and b/doc/uml.zargo differ
index 0a9eeb2..f96d0a8 100755 (executable)
          <div id="menu">
             <div class="minichat">chat</div><div class="profile"></div><div class="register">register</div><div class="logout">logout</div><div class="about">about</div>\r
          </div>
-         <select id="menuCss">
-            <option value="1" selected="selected">Dark</option>
-            <option value="2">Cold</option>
-            <option value="3">Classic</option>
-         </select>
+         <form>
+            <select id="menuCss">
+               <option value="1" selected="selected">Dark</option>
+               <option value="2">Cold</option>
+               <option value="3">Classic</option>
+            </select>
+         </form>
          <div id="page"></div>
          <div id="footer"><a href="http://yaws.hyber.org"><img src="img/powered-by-yaws.gif" alt="powered by Yaws" /></a></div>
       </div>
index d7ef712..27ec5bb 100755 (executable)
@@ -415,6 +415,7 @@ Client.prototype.resetDonneesPersonnelles = function()
    this.password = ""\r
    this.email = ""\r
    this.css = jQuery("link#cssPrincipale").attr("href")
+   this.nickFormat = "nick"
    
    this.pagePrincipale = 1
    
@@ -550,6 +551,7 @@ Client.prototype.getJSONProfile = function()
       "nick" : this.pseudo,
       "email" : this.email,
       "css" : this.css,
+      "nick_format" : this.nickFormat,
       "main_page" : this.pagePrincipale < 1 ? 1 : this.pagePrincipale,
       "conversations" : this.getJSONConversations()
    }
@@ -660,7 +662,8 @@ Client.prototype.connexion = function(messageJson)
 }\r
 \r
 Client.prototype.deconnexion = function()\r
-{\r
+{
+   this.flush()\r
    this.setStatut(statutType.deconnected) // deconnexion\r
    this.resetDonneesPersonnelles()\r
    this.delCookie ()\r
@@ -681,6 +684,7 @@ Client.prototype.chargerDonnees = function(data)
       this.pseudo = data["nick"]\r
       this.email = data["email"]\r
       this.css = data["css"]
+      this.nickFormat = data["nick_format"]
       
       // la page de la conversation principale
       this.pagePrincipale = data["main_page"] == undefined ? 1 : data["main_page"]
index d82648e..e8d607a 100755 (executable)
@@ -210,11 +210,12 @@ function Reponse(id, pseudo, login)
   * @param pseudo
   * @param contenu
   */
-function Message(id, date, pseudo, contenu)
+function Message(id, date, pseudo, login, contenu)
 {
    this.id = id
    this.date = date
    this.pseudo = pseudo
+   this.login = login
    this.contenu = contenu
    
    this.appartientAuClient = false
@@ -285,7 +286,7 @@ Message.prototype.getConversation = function(messages)
   * @param numConv le numéro (appelé id) de la conversation
   * @param formateur outil permettant la mise en forme du texte des messages
   */
-function Conversation(num, util, formateur)
+function Conversation(num, util, formateur, client)
 {
    var thisConversation = this
 
@@ -294,6 +295,8 @@ function Conversation(num, util, formateur)
    this.messageOver = null // le message sur lequel se trouve le curseur
    this.util = util
    this.formateur = formateur
+   this.client = client
+   
    this.messages = new Array()
    this.messagesParId = new Object()
    
@@ -424,9 +427,14 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv)
    var XHTML = ""
    for (var i = this.messages.length - 1; i >= 0; i--)
       if (this.messages[i].id > idDernierMessageAffiche)
-      {
+      {      
          var message = this.messages[i]
          
+         // construit l'identifiant de la personne
+         var identifiant = 
+            this.client.nickFormat == "nick" ? message.pseudo : 
+            (this.client.nickFormat == "login" ? message.login : message.pseudo + "(" + message.login +")" )
+         
          var XHTMLrepondA = ""
          for (var id in message.repondA)
             XHTMLrepondA += this.formateur.traitementComplet(message.repondA[id].pseudo) + "&gt; "
@@ -441,7 +449,7 @@ Conversation.prototype.flush = function(funClickExtract, funClickLienConv)
             "\">" +
                "<div class=\"extraire\">&gt;</div>" +
                "[<span class=\"date\">" + message.date + "</span>]" +
-               "<span class=\"pseudo\">" + this.formateur.traitementComplet(message.pseudo) + "</span>:" +
+               "<span class=\"pseudo\">" + this.formateur.traitementComplet(identifiant) + "</span>:" +
                XHTMLrepondA +
                "<span class=\"contenu\">" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo)) + "</span>" +
             "</div>"
@@ -623,6 +631,7 @@ Messages.prototype.ajouterMessage = function(element, numConversation)
       id,      
       element["date"],
       element["nick"],
+      element["login"],
       element["content"]
    )   \r
    
@@ -657,7 +666,7 @@ Messages.prototype.nouvelleConversation = function(num, funFermer, funLien)
 {
    var thisMessages = this
 
-   this.conversations[num] = new Conversation(num, this.util, this.formateur)
+   this.conversations[num] = new Conversation(num, this.util, this.formateur, this.client)
    if (funFermer != undefined)
       this.conversations[num].eventFermer(funFermer)
    if (funLien != undefined)
@@ -796,6 +805,8 @@ Messages.prototype.rafraichirMessages = function(vider)
             // ajoute les messages reçu à leur conversation respective
             for (var numConv = 0; numConv < data["conversations"].length; numConv++)
             {
+               //PLOP if (data["conversations"][numConv]["messages"].length == 0) continue
+               
                thisMessages.ajouterMessages(data["conversations"][numConv], numConv)
                
                // définit les événements liés à la conversation
index 4a86aee..f3ef3a8 100755 (executable)
@@ -11,6 +11,7 @@ function PageProfile(client, formateur, util)
 
 PageProfile.prototype.contenu = function()
 {
+   // pourquoi ?
    return ""
 }
 
@@ -33,13 +34,18 @@ PageProfile.prototype.chargerProfile = function()
    \r
    jQuery("form#profile input.login").val(this.client.login)\r
    jQuery("form#profile input.pseudo").val(this.client.pseudo)\r
-   jQuery("form#profile input.email").val(this.client.email)\r
+   jQuery("form#profile input.email").val(this.client.email)
+   
+   jQuery("form#profile select#affichagePseudo option").removeAttr("selected")
+   jQuery("form#profile select#affichagePseudo option[value=" + this.client.nickFormat + "]").attr("selected", "selected")
+   \r
 \r
-   jQuery("#page form#profile button").click(\r
+   jQuery("form#profile button").click(\r
       function()\r
       {\r
          thisPage.client.pseudo = thisPage.formateur.filtrerInputPseudo(jQuery("form#profile input.pseudo").val())\r
-         thisPage.client.email = jQuery("form#profile input.email").val()\r
+         thisPage.client.email = jQuery("form#profile input.email").val()
+         thisPage.client.nickFormat = jQuery("form#profile select#affichagePseudo option:selected").attr("value") 
          \r
          var password = jQuery("form#profile input.password").val()\r
          var passwordRe = jQuery("form#profile input.passwordRe").val()  \r
@@ -108,6 +114,16 @@ return '\
    <td>e-mail</td>\
    <td><input class="email" type="text" size="40" maxlength="100"/></td>\
   </tr>\
+  <tr>\
+   <td>Affichage des identifiants</td>\
+   <td>\
+    <select id="affichagePseudo">\
+     <option value="nick">Pseudo</option>\
+     <option value="login">Login</option>\
+     <option value="nick_login">Pseudo(Login)</option>\
+    </select>\
+   </td>\
+  </tr>\
   <tr>' : '') + '\
   <tr>\
   <td></td>\
@@ -115,4 +131,5 @@ return '\
   </tr>\
  </table>\
 </form>' 
-}
\ No newline at end of file
+}
+
index 298db8d..c836776 100755 (executable)
@@ -14,6 +14,7 @@
 
 % Instructions pour créer une nouvelle base : 
 % $erl -sname yaws -mnesia dir '"/projets/euphorik/BD"'
+% voir doc/installation.txt
 % >l(euphorik_bd).
 % >euphorik_bd:create().\r
 create() ->\r
@@ -83,7 +84,17 @@ vers_version(5) ->
       end,
       record_info(fields, user),
       user
-   ).      
+   );
+% Ajout le format d'affichage des pseudos
+vers_version(6) ->
+   mnesia:transform_table(
+      user,
+      fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, Indice_flood, Page_Principale, Conversations}) ->
+            {user,  Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, nick, Indice_flood, Page_Principale, Conversations}
+      end,
+      record_info(fields, user),
+      user
+   ).   
 
 
 % exemple de peuplage de la BD, utilisé pour les tests
index 2e2f406..519870c 100755 (executable)
@@ -28,7 +28,7 @@
    est_une_reponse_a_user/2,
    % set :\r
    update_pseudo_user/2,
-   set_profile/8,
+   set_profile/9,
    update_date_derniere_connexion/1,
    nouveau_user/2,
    nouveau_user/3,
@@ -196,33 +196,38 @@ 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, Conversations) ->
-   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
-                     login_deja_pris;\r
-                  _ ->               \r
-                     User_modifie = User#user{
-                        % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?
-                        % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)\r
-                        login = if is_list(Login) -> Login; true -> User#user.login end,\r
-                        password = if is_list(Password) -> Password; true -> User#user.password end,\r
-                        pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,\r
-                        email = if is_list(Email) -> Email; true -> User#user.email end,\r
-                        css = if is_list(Css) -> Css; true -> User#user.css end,
-                        page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
-                        conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end\r
-                     },\r
-                     mnesia:write(User_modifie),\r
-                     ok\r
-               end;
-            _ -> erreur
-         end
-      end
-   )).
+set_profile(Cookie, Login, Password, Pseudo, Email, Css, Page_principale, Nick_format, 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
+                           login_deja_pris;\r
+                        _ ->               \r
+                           User_modifie = User#user{
+                              % TODO : pourquoi ne pas tester avec la valeur "undefined" plutôt qu'avec "is_list" ?
+                              % TODO : validation plus strict des données (pas de page négative dans les conv par exemple)\r
+                              login = if is_list(Login) -> Login; true -> User#user.login end,\r
+                              password = if is_list(Password) -> Password; true -> User#user.password end,\r
+                              pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end,\r
+                              email = if is_list(Email) -> Email; true -> User#user.email end,\r
+                              css = if is_list(Css) -> Css; true -> User#user.css end,
+                              nick_format = Nick_format,
+                              page_principale = if is_integer(Page_principale), Page_principale > 0 -> Page_principale; true -> User#user.page_principale end,
+                              conversations = if is_list(Conversations) -> Conversations; true -> User#user.conversations end\r
+                           },\r
+                           mnesia:write(User_modifie),\r
+                           ok\r
+                     end;
+                  _ -> erreur
+               end
+            end
+         ));
+      true ->
+         erreur
+   end.
 
 
 % Met à jour la date de la dernière connexion d'un utilisateur à maintenant
index d264bcc..eb154ee 100755 (executable)
@@ -13,6 +13,8 @@
    conversations/4\r
 ]).
 
+-compile(export_all).
+
 -include("euphorik_bd.hrl").
 -include_lib("stdlib/include/qlc.hrl").
 
@@ -222,7 +224,7 @@ conversation(Messages, [M | Reste], X) ->
    true ->
       Enfants = enfants(M),
       Parents = parents(M),
-      % un message est dit exiterne si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
+      % un message est dit externe si un de ses parent ne fait pas partie de la conversation ou si un de ses parents fait partie de X
       Est_message_externe =  Parents -- Messages =/= [] orelse intersection(Parents, X) =/= [],
       conversation([M | Messages], Reste ++ Enfants, if Est_message_externe -> [M | X]; true -> X end)
    end;
index 154c7d4..c2cb984 100755 (executable)
@@ -45,7 +45,10 @@ loginUser({ok, User}) ->
    euphorik_minichat:update_date_derniere_connexion(User#user.id),
    json_reponse_login_ok(User);
 loginUser(_) ->
-   erreur("Erreur login").
+   % ajoute un délais d'attente (TODO : un autre moyen plus élégant ?)
+   receive after 1000 ->
+      erreur("Erreur login")
+   end.
    
    \r
 % Renvoie un string() représentant un cookie en base 36. Il y a 10^32 possibillités.\r
@@ -69,6 +72,7 @@ profile(
       {nick, Pseudo},
       {email, Email},
       {css, Css},
+      {nick_format, Nick_format_str},
       {main_page, Main_page},
       {conversations, {array, Conversations_json}}
    ]
@@ -86,7 +90,7 @@ profile(
       [],
       Conversations_json
    ),
-   case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css, Main_page, Conversations) of
+   case euphorik_minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css, list_to_atom(Nick_format_str), Main_page, Conversations) of
       ok ->
          json_reponse_ok();
       login_deja_pris ->
@@ -245,6 +249,7 @@ json_reponse_login_ok(User) ->
          {login, User#user.login},
          {email, User#user.email},
          {css, User#user.css},
+         {nick_format, atom_to_list(User#user.nick_format)},
          {main_page, User#user.page_principale},
          {conversations, 
             {array,
index 13a86cb..7ee5c7d 100755 (executable)
@@ -12,8 +12,9 @@
 \r
 -include_lib("xmerl/include/xmerl.hrl").\r
 -include_lib("yaws/include/yaws_api.hrl").
+
 \r
-% Test du module\r
+% Test du module (TODO)\r
 tester() ->
    que_dal.\r
 
@@ -22,15 +23,13 @@ tester() ->
 out(A) ->\r
    %inet:setopts(A#arg.clisock, inet:getopts(A#arg.clisock, [active])),\r
    {value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)),\r
-   Ret = traiter_donnees(Contenu),\r
-   %{content, "text/xml", Ret}.
+   Ret = traiter_donnees(Contenu),
    {content, "application/json", Ret}.\r
 
 \r
 traiter_donnees(Contenu) ->
    case json:decode_string(Contenu) of
       {ok, {struct, [{action, Action}| Reste]}} ->
-         %io:format("~p~n", [euphorik_protocole:login(JSON)]),
          json:encode(traiter_action(Action, Reste));
       _ ->
          error
index 841d7a4..173ab09 100755 (executable)
@@ -40,6 +40,7 @@
       date_creation, % erlang:now()\r
       date_derniere_connexion, % erlang:now(), est mis à jour lors de n'importe quelle activitée (envoie de message par exemple)\r
       css = [], % string()
+      nick_format = nick, %atom(), peut valoir 'nick', 'login' ou 'nick_login'
       indice_flood = 0, % integer() est incrémenté lorsque l'utilisateur envoie trop rapidement des messages.
       page_principale = 1, % la page de la conversation principale
       conversations = [] % [{integer(), integer()}], la liste des messages correspondant au conversation ainsi que la page affichée\r