From bb692b6ec033e2c6ce4dd12d95831af96033ec6f Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Thu, 3 Jul 2008 20:21:21 +0000 Subject: [PATCH] =?utf8?q?ADD=20possibilit=C3=A9=20d'inverser=20le=20sens?= =?utf8?q?=20du=20chat?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- css/1/pageMinichat.css | 65 +++++++++------- doc/TODO.txt | 48 +++++++----- doc/protocole3.txt | 2 + js/euphorik.js | 23 ++++-- js/pageMinichat.js | 119 ++++++++++++++++++----------- js/pageProfile.js | 23 +++++- modules/erl/euphorik_bd.erl | 5 +- modules/erl/euphorik_protocole.erl | 3 + modules/erl/euphorik_requests.erl | 1 + modules/include/euphorik_bd.hrl | 2 +- nbproject/private/private.xml | 6 +- 11 files changed, 188 insertions(+), 109 deletions(-) diff --git a/css/1/pageMinichat.css b/css/1/pageMinichat.css index 752ef9c..946c06c 100755 --- a/css/1/pageMinichat.css +++ b/css/1/pageMinichat.css @@ -66,8 +66,16 @@ #page.minichat form#posterMessage { background-color: #e19671; padding-left: 10px; +} + +#page.minichat.orderReverse form#posterMessage { padding-bottom: 10px; } + +#page.minichat.orderChrono form#posterMessage { + padding-top: 10px; +} + #page.minichat form#posterMessage p { margin: 0px; padding: 0px; @@ -121,31 +129,32 @@ /* voir pour l'astuce css "float left" des conversations : http://www.quirksmode.org/css/clearing.html */ #page.minichat #conversations { overflow: hidden; - width: 100% -} -#page.minichat #conversations .conversation { - border-width: 0px; - border-style: solid; - border-color: white; - float: left; width: 100%; + border-spacing: 0px; + background-color:#E19671; } -#page.minichat #conversations .titre { +#page.minichat.orderChrono #conversations td +{ + vertical-align: bottom +} +#page.minichat.orderReverse #conversations td +{ + vertical-align: top +} +#page.minichat.orderChrono #conversations .titre { + border-bottom: 1px dashed white +} +#page.minichat.orderReverse #conversations .titre { border-top: 1px dashed white } -#page.minichat #conversations .titre .barre { +#page.minichat #conversations .titre .nav { text-align: center; padding-right: 8px; background-color: #e19671; color: #ffffff; } -#page.minichat #conversations .titre .extraire, -#page.minichat #conversations .titre .extraireCompletement { - display: none -} - -#page.minichat #conversations .titre .barre .reduire { +#page.minichat #conversations .titre .nav .reduire { margin-top: 1px; margin-left: 5px; float: right; @@ -154,11 +163,11 @@ background-image: url(../../img/css1/reduire_conv.png); cursor: pointer; } -#page.minichat #conversations .titre .barre .reduire:hover { +#page.minichat #conversations .titre .nav .reduire:hover { background-image: url(../../img/css1/reduire_conv_hover.png); } -#page.minichat #conversations .titre .barre .fermer { +#page.minichat #conversations .titre .nav .fermer { margin-top: 1px; margin-left: 5px; float: right; @@ -167,10 +176,10 @@ background-image: url(../../img/css1/fermer_conv.png); cursor: pointer; } -#page.minichat #conversations .titre .barre .fermer:hover { +#page.minichat #conversations .titre .nav .fermer:hover { background-image: url(../../img/css1/fermer_conv_hover.png); } -#page.minichat #conversations .titre .barre .lien { +#page.minichat #conversations .titre .nav .lien { margin-top: 1px; margin-left: 5px; float: right; @@ -179,24 +188,24 @@ background-image: url(../../img/css1/copier_conv.png); cursor: pointer; } -#page.minichat #conversations .titre .barre .lien:hover { +#page.minichat #conversations .titre .nav .lien:hover { background-image: url(../../img/css1/copier_conv_hover.png); } -#page.minichat #conversations .titre .barre .next, -#page.minichat #conversations .titre .barre .prev { +#page.minichat #conversations .titre .nav .next, +#page.minichat #conversations .titre .nav .prev { display: none; } -#page.minichat #conversations .titre .barre .next, -#page.minichat #conversations .titre .barre .prev, -#page.minichat #conversations .titre .barre .numPage { +#page.minichat #conversations .titre .nav .next, +#page.minichat #conversations .titre .nav .prev, +#page.minichat #conversations .titre .nav .numPage { background-color: #841919; cursor: pointer; padding-right: 5px; padding-left: 5px; } -#page.minichat #conversations .titre .barre .next:hover, -#page.minichat #conversations .titre .barre .prev:hover, -#page.minichat #conversations .titre .barre .numPage:hover { +#page.minichat #conversations .titre .nav .next:hover, +#page.minichat #conversations .titre .nav .prev:hover, +#page.minichat #conversations .titre .nav .numPage:hover { background-color: #cb2626 } diff --git a/doc/TODO.txt b/doc/TODO.txt index b74e68b..902dca8 100755 --- a/doc/TODO.txt +++ b/doc/TODO.txt @@ -1,7 +1,7 @@ == TODO == === v1.1 === -* étudier la solution SVG et le calcul de pourcentage pour la largeur des fenêtres +* étudier la solution SVG et le calcul de pourcentage pour la largeur des fenêtres * le calcul des largeurs devra surement être fait en pixel et actualisé lorsque le conteneur change de taille * Gestion de l'historique au niveau du navigateur (pouvoir revenir aux pages précédentes). Utiliser un plugin jQuery si possible. Voir du coté des ancres (fragment d'url) : #ancre. * http://www.euphorik.ch/#page=chat @@ -16,27 +16,30 @@ * un bouton "fermer" * Possibilité de fermer temporairement une conversation (la réduire sous la forme d'un onglet) * etre averti lorsqu'un nouveau message arrive dans une conversation réduite - * lien vers une conversation : http://www.euphorik.ch/#conv=45 * Mettre un icon (genre sablier ou truc qui tourne à la apple) lorsque le chat se charge (également lors d'un changement de page par exemple) * L'icon apparait tout en haut (absolute) * Simuler un réseau lent -* supprimer le cookie si le client n'arrive pas à s'authentifier avec (réponse négative du serveur) * Mise à jour automatique de la version dans le about en fonction du tag/branche courant (lors de la mise en production) ? + * Remplacé par un fichier VERSION et un script dans /tools * Tests de monter en charge coté serveur, analyse de la complexité (regarder du coté des TODO dans le code). Utiliser eventuellement Tsung -* Profiling pour améliorer les performances (client et serveur) +* Profiling pour améliorer les performances (client et serveur) * Ne plus attacher chaque evenement sur chaque message mais de manière générale à l'ensemble des messages * traitementComplet() de euphorik.js est très très lent à executer -* Pouvoir récupérer son mdp (ou en générer unhttp://www.euphorik.ch/ autre) via son email. Marquer dans le profile que l'email sert à cela et n'est pas visible pas les autres personnes -* (Pouvoir inverser le chat) tester la faisabilité -* Réaliser un système de preproduction, étapes de preprod : - * Renommer euphorik_bd_update en euphorik_bd_admin et ajouter deux fonctions pour faire un backup et reprendre depuis ce backup - * Déplacer également les fonctions d'admin de euphorik_bd vers euphorik_bd_admin tel que "print_users" par exemple - * 1) Réalisation d'un backup de la BD dans BD/backups/preprod.bckup - * 2) Copie parfaite de l'environnement de prod vers /var/euphorik_preprod/ (sauf les mutables : BD) - * 3) Copie d'un yaws_conf_preprod - * 4) Lancer yaws (attention : port différent dans yaws_conf_preprod !) - * 5) Restoration des données preprod.bckup - * 5) Lancer le processus de mise en prod pour la preprod +* Pouvoir récupérer son mdp (ou en générer un http://www.euphorik.ch/ autre) via son email. Marquer dans le profile que l'email sert à cela et n'est pas visible pas les autres personnes + * L'utilisateur peut sur la page de login inscrire un email + * un id est généré et envoyé par email avec une adresse de type http://www.euphorik.ch?emailid= + * un tuple { } est inséré dans la table 'recup_id' + * Lorsque l'utilisateur se rend sur l'adresse l'id et la date sont vérifiés, si tout est ok le cookie "cookie" est définit pour l'utilisateur. L'utilisateur est alors loggé. +* (Pouvoir inverser le chat) tester la faisabilité +* Réaliser un système de preproduction, étapes de preprod : + * Renommer euphorik_bd_update en euphorik_bd_admin et ajouter deux fonctions pour faire un backup et reprendre depuis ce backup + * Déplacer également les fonctions d'admin de euphorik_bd vers euphorik_bd_admin tel que "print_users" par exemple + * 1) Réalisation d'un backup de la BD dans BD/backups/preprod.bckup + * 2) Copie parfaite de l'environnement de prod vers /var/euphorik_preprod/ (sauf les mutables : BD) + * 3) Copie d'un yaws_conf_preprod + * 4) Lancer yaws (attention : port différent dans yaws_conf_preprod !) + * 5) Restoration des données preprod.bckup + * 5) Lancer le processus de mise en prod pour la preprod * 6) Tester si tout va bien === v1.2 === * option dans le profile pour ouvrir les liens dans un nouveau tab @@ -81,13 +84,13 @@ * gestion des timezone (fuseaux horaire) : * L'utilisateur peut simplement définir une timezone dans son profil, les dates sont alors affichées en fonction de sa zone (en option) * Transfert des messages JSON (AJAX) en https et le noter dans la faq (même la mafia chinoise ne peut pas sniffer les messages). En fait il suffit (sauf erreur) de sécuriser euphorik : https://www.euphorik.ch - * voir : http://cert.startcom.org/ pour un certif gratuit ou du coté de cacert.org (linuxfr.org l'utilise) + * voir : http://cert.startcom.org/ pour un certif gratuit ou du coté de cacert.org (linuxfr.org l'utilise) * Mega stabilisation du code pour la cloture de la version 1 ! .. et en route pour la version 2 ! === v2.0 === * Création des channels, un file de discussion ainsi qu'un troll de la semaine par channel (est ce que les channels enfants possèdent aussi un troll de la semaine??) - * Un channel possède un nom, une langue, une description et une série de mots clefs (tags) - * Un channel peut être l'enfant d'un autre channel (et ceci de manière récursive). - * lorsque l'on se trouve sur un parent on voit récursivement les messages de tous les enfants + * Un channel possède un nom, une langue, une description et une série de mots clefs (tags) + * Un channel peut être l'enfant d'un autre channel (et ceci de manière récursive). + * lorsque l'on se trouve sur un parent on voit récursivement les messages de tous les enfants * S'il l'on répond à un message d'un channel enfant le message fait alors "partie" de ce channel enfant * Une page ressence tous les channels, il est possible de faire des recherches de channel par mot clef de la même manière que pour les conversations * N'importe qui peut créer un channel @@ -246,6 +249,8 @@ * Les messages auquels ont répond sont mis en évidence * lors de la mise à jour des messages la liste est interrogé pour savoir s'il faut le mettre en évidence [ok] Avoir une option dans le profile pour montrer son rang (ekMaster) de manière ostantatoire, discret ou caché +[ok] Pouvoir inverser le chat +[ok] supprimer le cookie si le client n'arrive pas à s'authentifier avec (réponse négative du serveur) === Bugs === 1 : Critique @@ -352,10 +357,11 @@ ok : Implémenté * La balise pour mettre des spoilers [2] Une option dans le profile pour se délogger automatiquement lorsque l'on quitte le site [3] Gestion de l'historique (calendrier) -[3] Afficher une page concernant la grammaire, ya un topic sur HFR -[3] Compatibilité avec wmcoinoin +[3] Afficher une page concernant la grammaire, ya un topic sur HFR +[3] Compatibilité avec wmcoinoin * http://moules.org/les_normes/le_backend (utilisé la DTD et non le schéma qui n'est pas correct) * http://pycoincoin.free.fr/wikini/wakka.php?wiki=PagePrincipale +[3] Recharger automatiquement la page lorsque les numéros de la version du protocole ne sont plus égaux (kiki) [3] Idée de bernie : * Pouvoir STFUER des personnes, lorsqu'elle envoie un message un autre truc à la con est écrit à la place * la phrase à la con est prise parmis une liste éditable depuis le panneau d'admin diff --git a/doc/protocole3.txt b/doc/protocole3.txt index dc3ff4b..977cfc3 100644 --- a/doc/protocole3.txt +++ b/doc/protocole3.txt @@ -90,6 +90,7 @@ ou "login" : "paul49", "email" : "paul@pierre.com", "css" : "css/3/euphorik.css", + "chat_order" : "chrono" | "reverse", "nick_format" : "nick" | "login" | "nick_login", "view_times" : true | false, "view_tooltips" : true | false, @@ -117,6 +118,7 @@ c -> s "nick" : "Paul", "email" : "paul@pierre.com", "css" : "css/3/euphorik.css", + "chat_order" : "chrono" | "reverse", "nick_format" : "nick" | "login" | "nick_login", "view_times" : true | false, "view_tooltips" : true | false, diff --git a/js/euphorik.js b/js/euphorik.js index 9bf96fb..b72f2d7 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -31,7 +31,7 @@ var conf = { versionProtocole : 3, // version du protcole nickDefaut : "", - nbMessageAffiche : 60, // (par page) + nbMessageAffiche : 40, // (par page) pseudoDefaut : "", tempsAffichageMessageDialogue : 4000, // en ms tempsKick : 15, // en minute @@ -379,8 +379,12 @@ Pages.prototype.afficherPage = function(nomPage, forcerChargement) if (typeof page == "string") $.ajax({async: false, url: "pages/" + page + ".html", success : function(page) { contenu += page }}) else + { contenu += this.pageCourante.contenu() - $("#page").html(contenu).removeClass().addClass(this.pageCourante.nom) + } + $("#page").html(contenu).removeClass().addClass(this.pageCourante.nom + + (this.pageCourante.classes != undefined ? " " + this.pageCourante.classes() : "") // l'objet peut fournire des classes css supplémentaires sous la forme d'un string + ) if (this.pageCourante.charger) this.pageCourante.charger() @@ -460,7 +464,7 @@ Formateur.prototype.traiterSmiles = function(M) { for (var sNom in this.smiles) { - ss = this.smiles[sNom] + var ss = this.smiles[sNom] for (var i = 0; i < ss.length; i++) M = M.replace(ss[i], "\""") } @@ -474,7 +478,7 @@ Formateur.prototype.remplacerBalisesHTML = function(M) Formateur.prototype.traiterURL = function(M, pseudo) { - thisFormateur = this + var thisFormateur = this var traitementUrl = function(url) { @@ -591,6 +595,7 @@ Client.prototype.resetDonneesPersonnelles = function() this.password = "" this.email = "" this.css = $("link#cssPrincipale").attr("href") + this.chatOrder = "reverse" this.nickFormat = "nick" this.viewTimes = true this.viewTooltips = true @@ -737,6 +742,7 @@ Client.prototype.getJSONProfile = function() "nick" : this.pseudo, "email" : this.email, "css" : this.css, + "chat_order" : this.chatOrder, "nick_format" : this.nickFormat, "view_times" : this.viewTimes, "view_tooltips" : this.viewTooltips, @@ -832,9 +838,12 @@ Client.prototype.enregistrement = function(login, password) } } +/** + * Connexion. Réalisé de manière synchrone. + */ Client.prototype.connexion = function(messageJson) { - thisClient = this + var thisClient = this jQuery.ajax( { async: false, @@ -885,6 +894,7 @@ Client.prototype.chargerDonnees = function(data) this.pseudo = data["nick"] this.email = data["email"] this.setCss(data["css"]) + this.chatOrder = data["chat_order"] this.nickFormat = data["nick_format"] this.viewTimes = data["view_times"] this.viewTooltips = data["view_tooltips"] @@ -919,7 +929,6 @@ Client.prototype.flush = function(async) var thisClient = this var ok = true - jQuery.ajax( { async: async, @@ -1129,7 +1138,7 @@ PageEvent.prototype.waitEvent = function(funSend, funsReceive) "page" : this.page } var poulpe = funSend() - for (v in poulpe) + for (var v in poulpe) dataToSend[v] = poulpe[v] this.attenteCourante = jQuery.ajax({ diff --git a/js/pageMinichat.js b/js/pageMinichat.js index 244467a..bd869f0 100755 --- a/js/pageMinichat.js +++ b/js/pageMinichat.js @@ -35,9 +35,7 @@ function PageMinichat(client, formateur, util) PageMinichat.prototype.contenu = function() { // le fait que tout soit collé est fait exprès, permet d'éviter d'avoir des espaces supplémentaires entre les spans' - return '\ -
Troll de la semaine :
\ -
\ + var formulaireXHTML = '\

\ \ \ @@ -46,8 +44,21 @@ PageMinichat.prototype.contenu = function() \ \

\ -
\ -
' +' + var trollXHTML = '
Troll de la semaine :
' + //var titreXHTML = '' + //var messagesXHTML = '' + var conversationXHTML = '
' + + if (this.client.chatOrder == "reverse") + return trollXHTML + formulaireXHTML + conversationXHTML + else + return trollXHTML + conversationXHTML + formulaireXHTML +} + +PageMinichat.prototype.classes = function() +{ + return this.client.chatOrder == "reverse" ? "orderReverse" : "orderChrono" } PageMinichat.prototype.charger = function() @@ -249,7 +260,8 @@ PageMinichat.prototype.envoyerMessage = function(pseudo, message) if (mess != undefined) mess.clientARepondu = true } - $("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu") + // TODO : ca sert à qque chose ? + //$("#conversations div#" + thisPageMinichat.conversations.messagesRepond[messId].getId()).addClass("repondu") } $("form input.message").val("") @@ -454,23 +466,31 @@ function Conversation(conversations, num) this.nbMessageMax = conf.nbMessageAffiche // Le nombre de message affiché par page - $("#conversations").append( - '
' + - '
' + - '
' + - '
' + - (num == 0 ? '' : '
') + - '<1>' + - '
' + + var messagesXHTML = '
' + var messageRacineXHTML = '
' + var reverse = this.client.chatOrder == "reverse" + + var XHTML = + '' + + (reverse ? messagesXHTML : "") + + '
' + + (reverse ? messageRacineXHTML : "") + + '' + + (reverse ? "" : messageRacineXHTML) + '
' + - '
' - ) + (reverse ? "" : messagesXHTML) + + '' + + $("#conversations tr").append(XHTML) - this.util.infoBulle("Aller à la première page", $("#conversations #" + this.getId() + " .numPage")) + this.util.infoBulle("Aller à la première page", $("#" + this.getId() + " .numPage")) if (num != 0) { - this.util.infoBulle("Créer un lien vers la conversation", $("#conversations #" + this.getId() + " .lien")) - this.util.infoBulle("Fermer la conversation", $("#conversations #" + this.getId() + " .fermer")) + this.util.infoBulle("Créer un lien vers la conversation", $("#" + this.getId() + " .lien")) + this.util.infoBulle("Fermer la conversation", $("#" + this.getId() + " .fermer")) } } @@ -496,7 +516,7 @@ Conversation.prototype.majRacine = function() this.messagesParId[this.racine.id] = this.racine var element = $(this.racine.XHTML(true, this.getId())) this.attacherEventsSurMessage(element) - $("#" + this.getId() + " .titre").prepend(element) + $("#" + this.getId() + " .titre .messageRacine").append(element) } } @@ -513,11 +533,11 @@ Conversation.prototype.colorerEntetes = function() for (var i = 0; i < this.messages.length; i++) { if (this.messages[i].appartientAuClient) - messagesProprietaire += ".messages #" + this.messages[i].getId(this.getId()) + "," + messagesProprietaire += "#" + this.messages[i].getId(this.getId()) + "," else if (this.messages[i].clientARepondu) - messagesRepondu += ".messages #" + this.messages[i].getId(this.getId()) + "," + messagesRepondu += "#" + this.messages[i].getId(this.getId()) + "," else if (this.messages[i].estUneReponse) - messagesReponse += ".messages #" + this.messages[i].getId(this.getId()) + "," + messagesReponse += "#" + this.messages[i].getId(this.getId()) + "," } $(messagesReponse).addClass("reponse") $(messagesRepondu).addClass("repondu") @@ -539,9 +559,9 @@ Conversation.prototype.decolorerEntetes = function() */ Conversation.prototype.setPage = function(pageCourante, dernierePage) { - $("#conversations #" + this.getId() + " .numPage").text(pageCourante) - $("#conversations #" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline") - $("#conversations #" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline") + $("#" + this.getId() + " .numPage").text(pageCourante) + $("#" + this.getId() + " .next").css("display", pageCourante == 1 ? "none" : "inline") + $("#" + this.getId() + " .prev").css("display", dernierePage ? "none" : "inline") } /** @@ -551,7 +571,7 @@ Conversation.prototype.eventLien = function(fun) { var thisConversation = this - $("#conversations #" + this.getId() + " .titre .lien").click( + $("#" + this.getId() + " .titre .lien").click( function() { fun(thisConversation.num) @@ -566,7 +586,7 @@ Conversation.prototype.eventFermer = function(fun) { var thisConversation = this - $("#conversations #" + this.getId() + " .titre .fermer").click( + $("#" + this.getId() + " .titre .fermer").click( function() { fun(thisConversation.num) @@ -583,13 +603,13 @@ Conversation.prototype.setFunPage = function(funNext, funPrev, funReset) { var thisConversation = this - $("#conversations #" + this.getId() + " .next").click( + $("#" + this.getId() + " .next").click( function() { funNext(thisConversation.num) } ) - $("#conversations #" + this.getId() + " .prev").click( + $("#" + this.getId() + " .prev").click( function() { funPrev(thisConversation.num) } ) - $("#conversations #" + this.getId() + " .numPage").click( + $("#" + this.getId() + " .numPage").click( function() { funReset(thisConversation.num) } ) } @@ -618,7 +638,7 @@ Conversation.prototype.viderMessages = function() this.messages = [] this.messagesParId = {} this.idDernierMessageAffiche = 0 - $("#conversations #" + this.getId() + " .message").remove() + $("#" + this.getId() + " .messages .message").remove() } Conversation.prototype.idMessageFromString = function(idString) @@ -634,10 +654,11 @@ Conversation.prototype.idMessageFromString = function(idString) Conversation.prototype.flush = function() { var thisConversation = this + var reverse = this.client.chatOrder == "reverse" // est-ce que le prochain message est pair ? (permet d'alterner le style des messages) var messagePair = (this.idDernierMessageAffiche == 0 ? true : - ($("#" + this.getId() + " .messages div:first").attr("class").search("messagePair") == -1) + ($("#" + this.getId() + " .messages div:" + (reverse ? "first" : "last")).attr("class").search("messagePair") == -1) ) // construction de l'XHTML des messages @@ -648,17 +669,25 @@ Conversation.prototype.flush = function() XHTML += this.messages[i].XHTML(messagePair, this.getId()) messagePair = !messagePair } - + var DOM = $(XHTML) - + // pour chaque nouveau message au niveau du document on crée ses événements DOM.each(function() { thisConversation.attacherEventsSurMessage(this) }) - DOM.prependTo("#" + this.getId() + " .messages") + if (reverse) + DOM.prependTo("#" + this.getId() + " .messages") + else + DOM.appendTo("#" + this.getId() + " .messages") // enlève les messages exedentaires - var nbMessagesAffiche = $("#" + this.getId() + " .message").size() + var nbMessagesAffiche = $("#" + this.getId() + " .messages .message").size() if (nbMessagesAffiche > this.nbMessageMax) - $("#conversations #" + this.getId() + " .messages .message").slice(this.nbMessageMax, nbMessagesAffiche).remove() + { + if (reverse) + $("#" + this.getId() + " .messages .message").slice(this.nbMessageMax, nbMessagesAffiche).remove() + else + $("#" + this.getId() + " .messages .message").slice(0, nbMessagesAffiche - this.nbMessageMax).remove() + } if (this.messages.length > 0) this.idDernierMessageAffiche = this.messages[this.messages.length-1].id @@ -793,7 +822,7 @@ Conversation.prototype.afficherConversation = function(id) var mess = message.getConversation(this) // FIXME : cet appel est très lent - $("#conversations #" + this.getId() + " .messages .message").each( + $("#" + this.getId() + " .messages .message").each( function() { var jq = $(this) @@ -827,7 +856,7 @@ Conversation.prototype.afficherConversation = function(id) */ Conversation.prototype.supprimer = function() { - $("#conversations #" + this.getId()).remove() + $("#" + this.getId()).remove() } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -883,7 +912,7 @@ Conversations.prototype.enleverMessagesRepond = function() // on réinitialise pour être sur que tout est bien enlevé this.messagesRepond = {} - $("#conversations div.message").removeClass("repondEnEvidence") + $("#conversations .message").removeClass("repondEnEvidence") $("form#posterMessage #repondA .messages").empty() } @@ -1142,11 +1171,13 @@ Conversations.prototype.supprimerConversation = function(num) */ Conversations.prototype.ajusterLargeurConversations = function() { + // TODO : trouver mieux ! var largeurPourcent = (100 / this.conversations.length) + // obsolète !? // le "- 0.01" evite que IE se chie dessus lamentablement et affiche les conversations les unes au dessus des autres - if($.browser["msie"]) - largeurPourcent -= 0.05 - $("#conversations .conversation").css("width", largeurPourcent + "%") + //if($.browser["msie"]) + // largeurPourcent -= 0.05 + $("#conversations td").css("width", largeurPourcent + "%") } /** diff --git a/js/pageProfile.js b/js/pageProfile.js index eaae93b..5f17b01 100755 --- a/js/pageProfile.js +++ b/js/pageProfile.js @@ -54,19 +54,27 @@ PageProfile.prototype.chargerProfile = function() $("form#profile input#viewTooltips").attr("checked", this.client.viewTooltips) $("form#profile input#viewTimes").attr("checked", this.client.viewTimes) - $("form#profile select#degreeOstentatoire option").removeAttr("selected") - $("form#profile select#degreeOstentatoire option[value=" + this.client.ostentatiousMaster + "]").attr("selected", "selected") + $("form#profile select#chatOrder option").removeAttr("selected") + $("form#profile select#chatOrder option[value=" + this.client.chatOrder + "]").attr("selected", "selected") $("form#profile select#affichagePseudo option").removeAttr("selected") $("form#profile select#affichagePseudo option[value=" + this.client.nickFormat + "]").attr("selected", "selected") + + if (this.client.ostentatiousMaster) + { + $("form#profile select#degreeOstentatoire option").removeAttr("selected") + $("form#profile select#degreeOstentatoire option[value=" + this.client.ostentatiousMaster + "]").attr("selected", "selected") + } $("form#profile button").click( function() { thisPage.client.pseudo = thisPage.formateur.filtrerInputPseudo($("form#profile input.pseudo").val()) thisPage.client.email = $("form#profile input.email").val() + thisPage.client.chatOrder = $("form#profile select#chatOrder option:selected").attr("value") thisPage.client.nickFormat = $("form#profile select#affichagePseudo option:selected").attr("value") - thisPage.client.ostentatiousMaster = $("form#profile select#degreeOstentatoire option:selected").attr("value") + if (thisPage.client.ekMaster) + thisPage.client.ostentatiousMaster = $("form#profile select#degreeOstentatoire option:selected").attr("value") thisPage.client.viewTooltips = $("form#profile input#viewTooltips").attr("checked") thisPage.client.viewTimes = $("form#profile input#viewTimes").attr("checked") @@ -135,6 +143,15 @@ return '\ e-mail\ \ \ + \ + Ordre des messages\ + \ + \ + \ + \ ' + (this.client.ekMaster ? 'Degrée d\'ostentation\ \ diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl index d84b0fb..25398ad 100755 --- a/modules/erl/euphorik_bd.erl +++ b/modules/erl/euphorik_bd.erl @@ -33,7 +33,7 @@ % users : nouveau_user/2, nouveau_user/3, - set_profile/11, + set_profile/12, update_date_derniere_connexion/1, update_ip/2, update_pseudo_user/2, @@ -195,7 +195,7 @@ nouveau_user(Login, Password, Cookie) -> % Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié. % Conversation est de type [{int(), bool()}] où l'entier est la racine, le booléen indique si la conversation est réduite ou non % Ostentatious_master peut valoir invisible, light ou heavy -set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times, View_tooltips, Conversations, Ostentatious_master) -> +set_profile(Cookie, Login, Password, Pseudo, Email, Css, Chat_order, Nick_format, View_times, View_tooltips, Conversations, Ostentatious_master) -> if Nick_format =:= nick; Nick_format =:= login; Nick_format =:= nick_login, Ostentatious_master =:= invisible; Ostentatious_master =:= light; Ostentatious_master =:= heavy -> resultat_transaction(mnesia:transaction( @@ -214,6 +214,7 @@ set_profile(Cookie, Login, Password, Pseudo, Email, Css, Nick_format, View_times pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end, email = if is_list(Email) -> Email; true -> User#user.email end, css = if is_list(Css) -> Css; true -> User#user.css end, + chat_order = Chat_order, nick_format = Nick_format, view_times = View_times, view_tooltips = View_tooltips, diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl index dbad874..550a4ec 100755 --- a/modules/erl/euphorik_protocole.erl +++ b/modules/erl/euphorik_protocole.erl @@ -118,6 +118,7 @@ profile( {nick, Pseudo}, {email, Email}, {css, Css}, + {chat_order, Chat_order_str}, {nick_format, Nick_format_str}, {view_times, View_times}, {view_tooltips, View_tooltips}, @@ -147,6 +148,7 @@ profile( Pseudo, Email, Css, + list_to_atom(Chat_order_str), list_to_atom(Nick_format_str), View_times, View_tooltips, @@ -672,6 +674,7 @@ json_reponse_login_ok(User) -> {login, User#user.login}, {email, User#user.email}, {css, User#user.css}, + {chat_order, atom_to_list(User#user.chat_order)}, {nick_format, atom_to_list(User#user.nick_format)}, {view_times, User#user.view_times}, {view_tooltips, User#user.view_tooltips}, diff --git a/modules/erl/euphorik_requests.erl b/modules/erl/euphorik_requests.erl index 616d0e7..efe2e06 100755 --- a/modules/erl/euphorik_requests.erl +++ b/modules/erl/euphorik_requests.erl @@ -40,6 +40,7 @@ out(A) -> inet:setopts(A#arg.clisock, [{active, true}, {keepalive, true}]), {value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)), Ret = traiter_donnees(Contenu, IP), + %io:format("~p~n", [Ret]), {content, "application/json", Ret}. diff --git a/modules/include/euphorik_bd.hrl b/modules/include/euphorik_bd.hrl index 1a12872..053c046 100755 --- a/modules/include/euphorik_bd.hrl +++ b/modules/include/euphorik_bd.hrl @@ -75,7 +75,7 @@ view_times = true, view_tooltips = true, ostentatious_master = light, % peut valoir invisible, light ou heavy. seulement pour ek_master - message_order = reverse, % can be normal or reverse + chat_order = reverse, % peut valoir chrono ou reverse indice_flood = 0, % integer() est incrémenté lorsque l'utilisateur envoie trop rapidement des messages. conversations = [], % [{integer(), bool}], la liste des messages correspondant au conversation {racine, reduite?} ek_master = false, diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index 1e0dcc1..c91a7ac 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -7,9 +7,9 @@ js/pageMinichat.js - 237 - 907 - 1156 + 245 + 921 + 1170 -- 2.43.0