ADD avancement sur les trolls, partie d'administration presque terminée
authorGreg Burri <greg.burri@gmail.com>
Tue, 13 May 2008 21:14:53 +0000 (21:14 +0000)
committerGreg Burri <greg.burri@gmail.com>
Tue, 13 May 2008 21:14:53 +0000 (21:14 +0000)
css/1/pageAdmin.css
css/1/pageMinichat.css
doc/TODO.txt
doc/protocole3.txt
js/euphorik.js
js/pageAdmin.js
modules/erl/euphorik_bd.erl
modules/erl/euphorik_protocole.erl

index 82626ef..91a0961 100644 (file)
@@ -1,4 +1,35 @@
 /* La page d'administration */
 
-#page.admin {
+#page.admin p {
+       margin-left : 0px
+}
+
+
+#page.admin .troll {
+       margin-top: 10px
+}
+
+#page.admin .troll .content {
+       padding: 2px;
+       border: 1px solid;
+       border-color: #253f18;
+       background-color: #0c2003;
+}
+
+#page.admin .troll .author {
+       margin-left: 10px
+}
+
+#page.admin .troll .editTroll {
+       margin-left: 10px;
+       font-size: 9px;
+       border: 1px solid;
+       cursor: pointer
+}
+
+#page.admin .troll .delTroll {
+       margin-left: 10px;
+       font-size: 9px;
+       border: 1px solid;
+       cursor: pointer
 }
index 80a2e33..a753ba5 100755 (executable)
@@ -9,13 +9,12 @@
 }
 
 #smiles {
-       border-width: 1px 1px 1px 1px;
+       border: 1px solid;
        border-color: #253f18;
-       border-style: solid;
+       background-color: #0c2003;
        margin-bottom: 10px;
        padding: 1px;
        width: 140px;
-       background-color: #0c2003;
        position: absolute;
        display: none
 }
index 52d85f6..f6b6b16 100755 (executable)
 2 : Urgent
 3 : Peu grave\r
      
+[1] Possibilité d'enregistrer plusieurs users avec le même login
 [1] Lors de l'extraction d'une conv il arrive que la conv extractée soit bien créée mais vide, le bouton ne ferme pas la conv (très étrange, bug de firefox?)
    * Arrive une fois sur 20 environ
    * Jamais reproduit avec Opera\r
index 1a91d33..8c383c7 100644 (file)
@@ -220,7 +220,9 @@ s -> c
          [
             {
                "troll_id" : 5,
-               "content" : "plop"
+               "content" : "plop",
+               "author" : "<Pseudo>"
+               "author_id" : 2
             }
          ]
    }
index 8aaf875..d040dc3 100755 (executable)
@@ -74,6 +74,8 @@ function Util()
    })
 }
 
+var messageType = {informatif: 0, question: 1, erreur: 2}
+
 /**
   * Affiche une boite de dialogue avec un message à l'intérieur.
   * @param message le message (string)\r
@@ -105,9 +107,7 @@ Util.prototype.messageDialogue = function(message, type, boutons)
    
    $("#info").slideDown(200)
    this.timeoutMessageDialogue = setTimeout(fermer, conf.tempsAffichageMessageDialogue)   
-}
-
-var messageType = {informatif: 0, question: 1, erreur: 2}\r
+}\r
 
 /**
   * Utilisé pour l'envoie de donnée avec la méthode ajax de jQuery.
@@ -282,6 +282,11 @@ Formateur.prototype.getSmilesHTML = function()
    return XHTML\r
 }\r
 
+/**
+  * Formatage complet d'un texte.
+  * @M le message
+  * @pseudo facultatif, permet de contruire le label des images sous la forme : "<Pseudo> : <Message>"
+  */
 Formateur.prototype.traitementComplet = function(M, pseudo)
 {
    return this.traiterLiensConv(this.traiterSmiles(this.traiterURL(this.remplacerBalisesHTML(M), pseudo)))
@@ -327,9 +332,6 @@ Formateur.prototype.remplacerBalisesHTML = function(M)
 Formateur.prototype.traiterURL = function(M, pseudo)
 {
    thisFormateur = this
-   
-   if (pseudo == undefined)
-      pseudo = ""
          
    var traitementUrl = function(url)
    {    \r
@@ -337,7 +339,7 @@ Formateur.prototype.traiterURL = function(M, pseudo)
       if (!thisFormateur.regexTestProtocoleExiste.test(url))\r
          url = "http://" + url
       var extension = thisFormateur.getShort(url)
-      return "<a " + (extension[1] ? "title=\"" + thisFormateur.traiterPourFenetreLightBox(pseudo, url) + ": " +  thisFormateur.traiterPourFenetreLightBox(M, url) + "\"" + " rel=\"lightbox\"" : "") + " href=\"" + url + "\" >[" + extension[0] + "]</a>"
+      return "<a " + (extension[1] ? "title=\"" + (pseudo == undefined ? "" : thisFormateur.traiterPourFenetreLightBox(pseudo, url) + ": ") +  thisFormateur.traiterPourFenetreLightBox(M, url) + "\"" + " rel=\"lightbox\"" : "") + " href=\"" + url + "\" >[" + extension[0] + "]</a>"
    }
    return M.replace(this.regexUrl, traitementUrl)
 }
@@ -418,7 +420,8 @@ function Client(util)
 }
 \r
 Client.prototype.resetDonneesPersonnelles = function()\r
-{\r
+{
+   this.id = 0\r
    this.pseudo = conf.pseudoDefaut\r
    this.login = ""\r
    this.password = ""\r
@@ -690,7 +693,8 @@ Client.prototype.chargerDonnees = function(data)
    {
       this.cookie = data["cookie"]
       this.setCookie()
-      \r
+      
+      this.id = data["id"]\r
       this.login = data["login"]
       this.pseudo = data["nick"]\r
       this.email = data["email"]\r
index 93b94d5..9be3ca1 100644 (file)
@@ -12,7 +12,8 @@ function PageAdmin(client, formateur, util)
 PageAdmin.prototype.contenu = function()
 {
    return '<h1>Trolls</h1>\
-   <form id="nouveauTroll"><p>Nouveau troll\
+   <p>Chaque semaine un troll est choisit au hasard parmis les trolls proposés et devient le troll de la semaine.</p>\
+   <form id="nouveauTroll"><p>\
       <input class="troll" name="troll" type="text" size="80" maxlength="500" value=""></input>\
       <button class="return" value="return">poster</button>\
    </p></form><div id="trolls"></div>'
@@ -24,12 +25,13 @@ PageAdmin.prototype.charger = function()
       
    var thisPage = this
    
-   this.trolls = new Trolls(this.util)
+   this.trolls = new Trolls(this.client, this.util, this.formateur)
    this.trolls.rafraichirTrolls()
    
    $("#page form#nouveauTroll button.return").click(
       function()
-      {         
+      {
+         thisPage.posterTroll()
       }
    )
 }
@@ -39,16 +41,125 @@ PageAdmin.prototype.decharger = function()
    this.trolls.pageEvent.stopAttenteCourante()
 }
 
+PageAdmin.prototype.posterTroll = function()
+{
+   var thisPageAdmin = this
+   
+   var content = $("#page form#nouveauTroll input.troll").val()
+   
+   content = content.trim()
+   if (content == "")
+   {
+      this.util.messageDialogue("Le troll est vide")
+      return
+   }
+
+   var dataToSend = 
+      {
+         "action" : "put_troll", 
+         "cookie" : this.client.cookie,
+         "content" : content
+      }
+
+   ;;; dumpObj(dataToSend)
+   jQuery.ajax(
+      {
+         type: "POST",
+         url: "request",
+         dataType: "json",
+         data: this.util.jsonVersAction(dataToSend),
+         success:
+            function(data)
+            {
+               ;;; dumpObj(data)
+               
+               if (data["reply"] == "ok")
+               {
+                  $("#page form#nouveauTroll input.troll").val("")
+               }
+               else if (data["reply"] == "error")
+               {
+                  thisPageAdmin.util.messageDialogue(data["error_message"])
+               }
+            }
+      }
+   )
+}
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-function Trolls(util)
+function Trolls(client, util, formateur)
 {
+   this.client = client
    this.util = util
+   this.formateur = formateur
    this.dernierTroll = 0
    this.pageEvent = new PageEvent("admin", this.util)
 }
 
+
+Trolls.prototype.modifier = function(id, content)
+{
+   var dataToSend =
+      {
+         "action" : "mod_troll",
+         "cookie" : this.client.cookie,
+         "troll_id" : id,
+         "content" : content
+      }
+
+   ;;; dumpObj(dataToSend)
+   jQuery.ajax(
+      {
+         type: "POST",
+         url: "request",
+         dataType: "json",
+         data: this.util.jsonVersAction(dataToSend),
+         success:
+            function(data)
+            {
+               ;;; dumpObj(data)
+               if (data["reply"] == "error")
+               {
+                  thisPageAdmin.util.messageDialogue(data["error_message"])
+               }
+            }
+      }
+   )
+}
+
+/**
+  * Supprime un troll en fonction de son id.
+  */
+Trolls.prototype.supprimer = function(id) 
+{
+   var dataToSend =
+      {
+         "action" : "del_troll",
+         "cookie" : this.client.cookie,
+         "troll_id" : id
+      }
+
+   ;;; dumpObj(dataToSend)
+   jQuery.ajax(
+      {
+         type: "POST",
+         url: "request",
+         dataType: "json",
+         data: this.util.jsonVersAction(dataToSend),
+         success:
+            function(data)
+            {
+               ;;; dumpObj(data)
+               if (data["reply"] == "error")
+               {
+                  thisPageAdmin.util.messageDialogue(data["error_message"])
+               }
+            }
+      }
+   )
+}
+
 Trolls.prototype.rafraichirTrolls = function()
 {
    var thisTrolls = this
@@ -57,18 +168,76 @@ Trolls.prototype.rafraichirTrolls = function()
       function() { return { "last_troll" : thisTrolls.dernierTroll }},
       function(data)
       {
-         switch (data["reply"]) {
+         switch (data["reply"])
+         {
             case "troll_added" :
                var XHTML = ""
                for (var i = 0; i < data["trolls"].length; i++)
                {
-                  thisTrolls.dernierTroll = data["trolls"][i]["troll_id"]
-                  XHTML += '<p id="troll' + data["trolls"][i]["troll_id"] + '">' + data["trolls"][i]["content"] + '</p>'
+                  XHTML +=
+                     '<div id="troll' + data["trolls"][i]["troll_id"] + '" class="troll">' +
+                     '<span class="content">' + thisTrolls.formateur.traitementComplet(data["trolls"][i]["content"], data["trolls"][i]["author"]) + '</span>' +
+                     '<span class="author">' + thisTrolls.formateur.traitementComplet(data["trolls"][i]["author"]) + '</span>' +
+                     (data["trolls"][i]["author_id"] == thisTrolls.client.id ? '<span class="editTroll">éditer</span><span class="delTroll">Supprimer</span>' : '') +
+                     '</div>'
                }
                $("#trolls").append(XHTML)
+               $("#trolls .troll").filter(function(){return parseInt($(this).attr("id").substr(5)) > thisTrolls.dernierTroll}).each(
+                  function()
+                  {
+                     var troll = this
+                     var id = parseInt($(this).attr("id").substr(5))
+                     $(".delTroll", this).click(
+                        function()
+                        {
+                           thisTrolls.util.messageDialogue(
+                              "Êtes-vous sur de vouloir supprimer le troll \"" + $("#trolls .troll .content").html() + "\" ?",
+                              messageType.question,
+                              {
+                                 "oui" : function()
+                                    {
+                                       thisTrolls.supprimer(id)
+                                    },
+                                 "non" : function(){}
+                              }
+                           )
+                        }
+                     )
+                     $(".editTroll", this).click(
+                        function()
+                        {
+                           $("span", troll).css("display", "none")
+                           $(troll).append(
+                              '<form><p><input class="content" type="text" size="50" maxlength="500" value="' + $(".content", troll).html() + '"></input><button class="modifier">modifier</button><button class="annuler">annuler</button></p></form>'
+                           )
+                           var virerLeFormulaire = function()
+                           {
+                              $("form", troll).remove()
+                              $("span", troll).css("display", "inline")
+                           }
+                           $("button.modifier", troll).click(
+                              function()
+                              {
+                                 var content = $("form input.content", troll).val()
+                                 virerLeFormulaire()
+                                 thisTrolls.modifier(id, content)
+                              }
+                           )
+                           $("button.annuler", troll).click( virerLeFormulaire )
+                           $("form", troll).submit(function(){ return false})
+                        }  
+                     )
+                  }
+               )
+               
+               if (data["trolls"].length > 0)
+                  thisTrolls.dernierTroll = data["trolls"][data["trolls"].length - 1]["troll_id"]
                break
             case "troll_modified" :
-               $("#trolls #troll"+data["troll_id"]).html(data["content"])
+               $("#trolls #troll" + data["troll_id"] + " .content").html(data["content"])
+               break
+            case "troll_deleted" :
+               $("#trolls #troll"+data["troll_id"]).remove()
                break
          }
       }
index 8875973..28267f0 100755 (executable)
@@ -55,6 +55,7 @@
    put_troll/2,
    mod_troll/2,
    del_troll/1,
+   troll_by_id/1,
    
    % versions :
    update_version/1,
@@ -259,8 +260,7 @@ user_by_cookie(Cookie) ->
 user_by_id(ID) ->
    resultat_transaction(mnesia:transaction(
       fun() ->
-         Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= ID])),
-         case Users of
+         case qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= ID])) of
             [User] -> {ok, User};
             _ -> erreur
          end
@@ -697,6 +697,18 @@ del_troll(Troll_id) ->
       end
    ).
  
+troll_by_id(Troll_id) ->
+   resultat_transaction(mnesia:transaction(
+      fun() ->
+         case qlc:e(qlc:q([T || T <- mnesia:table(troll), T#troll.id =:= Troll_id])) of
+            [T] -> {ok, T};
+            _ ->
+               erreur
+         end
+      end
+   )).
+   
    
 update_version(1) ->
    mnesia:transform_table(
index 24569de..fcce9c3 100755 (executable)
@@ -208,10 +208,13 @@ wait_event([{page, "admin"}, {last_troll, Last_troll}]) ->
                {trolls, {array, 
                   lists:map(
                      fun(T) ->                        
+                        {ok, User} = euphorik_bd:user_by_id(T#troll.id_user),
                         {struct,
                            [
                               {troll_id, T#troll.id},
-                              {content, T#troll.content}
+                              {content, T#troll.content},
+                              {author, User#user.pseudo},
+                              {author_id, User#user.id}
                            ]
                         }
                      end,
@@ -390,7 +393,7 @@ mod_troll(
          User_id = User#user.id,
          case euphorik_bd:troll_by_id(Troll_id) of
             {ok, #troll{id_user = User_id}} ->
-               euphorik_bd:mod_troll(User#user.id, Content),
+               euphorik_bd:mod_troll(Troll_id, Content),
                json_reponse_ok();
             _ ->
                erreur("Vous ne posséder pas ce troll")
@@ -412,7 +415,7 @@ del_troll(
          User_id = User#user.id,
          case euphorik_bd:troll_by_id(Troll_id) of
             {ok, #troll{id_user = User_id}} ->
-               euphorik_bd:del_troll(User#user.id),
+               euphorik_bd:del_troll(Troll_id),
                json_reponse_ok();
             _ ->
                erreur("Vous ne posséder pas ce troll")