From 217c4d7a0d5f9fee3a8ef0a05ab8506c7f39d5e5 Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Tue, 29 Jul 2008 20:54:33 +0000 Subject: [PATCH] ADD gestion du fragment de url, voir #2 --- index.yaws | 7 +++- js/conf.js | 2 +- js/euphorik.js | 9 ++--- js/fragment.js | 69 ++++++++++++++++++++++++++++++++ js/pageAbout.js | 40 +++++++++--------- js/pageMinichat/conversation.js | 7 ---- js/pageMinichat/conversations.js | 29 +++++++++++--- js/pageMinichat/pageMinichat.js | 25 +++++++++++- js/pageStatique.js | 33 +++++++++++++++ js/pages.js | 46 ++++++++++++++------- modules/erl/euphorik_common.erl | 58 ++++++++++++++------------- 11 files changed, 239 insertions(+), 86 deletions(-) create mode 100644 js/fragment.js create mode 100644 js/pageStatique.js diff --git a/index.yaws b/index.yaws index 1f76dfd..35180ba 100755 --- a/index.yaws +++ b/index.yaws @@ -28,10 +28,12 @@ - + + + - + @@ -39,6 +41,7 @@ + diff --git a/js/conf.js b/js/conf.js index 0010d2d..f69d281 100644 --- a/js/conf.js +++ b/js/conf.js @@ -22,7 +22,7 @@ euphorik.conf = { versionProtocole : 3, // version du protcole nickDefaut : "", - nbMessageAffiche : 40, // (par page) + nbMessageAffiche : 10, // (par page) pseudoDefaut : "", tempsAffichageMessageDialogue : 4000, // en ms tempsKick : 15, // en minute diff --git a/js/euphorik.js b/js/euphorik.js index 14528a2..5dff115 100755 --- a/js/euphorik.js +++ b/js/euphorik.js @@ -22,10 +22,11 @@ var euphorik = {} // le main $(document).ready( function() { + var fragment = new Fragment(); var formateur = new euphorik.Formateur(); var util = new euphorik.Util(formateur); var client = new euphorik.Client(util); - var pages = new euphorik.Pages(); + var pages = new euphorik.Pages(fragment); // connexion vers le serveur (utilise un cookie qui traine) client.connexionCookie(); @@ -56,15 +57,13 @@ $(document).ready( // TODO : simplifier et pouvoir créer des liens par exemple : Conditions d'utilisation $("#footer .conditions").click(function(){ pages.afficherPage("conditions_utilisation"); }); - pages.ajouterPage(new euphorik.PageMinichat(client, formateur, util)); + pages.ajouterPage(new euphorik.PageMinichat(client, formateur, util), true); pages.ajouterPage(new euphorik.PageAdmin(client, formateur, util)); pages.ajouterPage(new euphorik.PageProfile(client, formateur, util)); pages.ajouterPage(new euphorik.PageRegister(client, formateur, util)); pages.ajouterPage(new euphorik.PageAbout(client, formateur, util)); pages.ajouterPage("conditions_utilisation"); - pages.afficherPage("minichat"); - - window.location.hash = "pouet=2;truc=4;conv=[1,2,3]" + pages.afficherPage(); } ) diff --git a/js/fragment.js b/js/fragment.js new file mode 100644 index 0000000..835c05e --- /dev/null +++ b/js/fragment.js @@ -0,0 +1,69 @@ +// coding: utf-8 +// Copyright 2008 Grégory Burri +// +// This file is part of Euphorik. +// +// Euphorik is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Euphorik is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Euphorik. If not, see . + +/** + * + */ +Fragment = function() { + var thisFragment = this; + this.fragments = {}; + if (!window.location.hash) { + return; + } + try { + var fragmentsStr = window.location.hash.slice(1).split(";"); + fragmentsStr.each(function(i, tuple) { + tuple = tuple.split("="); + thisFragment.fragments[tuple[0]] = JSON.parse(tuple[1]); + }); + } catch(error) { + ;; console.log(error); + } +}; + +Fragment.prototype.setVal = function(name, val) { + this.fragments[name] = val; +} + +Fragment.prototype.getVal = function(name) { + return this.fragments[name]; +} + +Fragment.prototype.delVal = function(name) { + delete this.fragments[name]; +} + +Fragment.prototype.eraseAllVal = function() { + this.fragments = []; +} + +Fragment.prototype.each = function(fun) { + objectEach(this.fragments, function(name, val) { + fun(name, val); + }); +} + +Fragment.prototype.write = function() { + var fragmentsStr = ""; + var first = true; + objectEach(this.fragments, function(name, val) { + fragmentsStr += (first ? "" : ";") + name + "=" + JSON.stringify(val); + first = false; + }); + window.location.hash = fragmentsStr; +} diff --git a/js/pageAbout.js b/js/pageAbout.js index 362f857..d51557c 100644 --- a/js/pageAbout.js +++ b/js/pageAbout.js @@ -14,23 +14,23 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with Euphorik. If not, see . - -euphorik.PageAbout = function(client, formateur, util) { - this.nom = "about"; - - this.client = client; - this.formateur = formateur; - this.util = util; -}; - -euphorik.PageAbout.prototype.contenu = function() { - var contenu = ""; - $.ajax({async: false, url: "pages/about.html", success : function(page) { contenu += page; }}); - - var email = this.util.rot13("znvygb:tert.oheev@tznvy.pbz"); - return contenu.replace("{EMAIL}", "" + email + "").replace("{EMAIL_LIEN}", email); -}; - -euphorik.PageAbout.prototype.charger = function() { -}; +// along with Euphorik. If not, see . + +euphorik.PageAbout = function(client, formateur, util) { + this.nom = "about"; + + this.client = client; + this.formateur = formateur; + this.util = util; +}; + +euphorik.PageAbout.prototype.contenu = function() { + var contenu = ""; + $.ajax({async: false, url: "pages/about.html", success : function(page) { contenu += page; }}); + + var email = this.util.rot13("znvygb:tert.oheev@tznvy.pbz"); + return contenu.replace("{EMAIL}", "" + email + "").replace("{EMAIL_LIEN}", email); +}; + +euphorik.PageAbout.prototype.charger = function() { +}; diff --git a/js/pageMinichat/conversation.js b/js/pageMinichat/conversation.js index 238976b..6481014 100644 --- a/js/pageMinichat/conversation.js +++ b/js/pageMinichat/conversation.js @@ -73,13 +73,6 @@ euphorik.Conversation = function(conversations, num) { } }; -/** - * @racine un message représentant la racine de la conversation, vaut undefined pour la conversation générale - */ -euphorik.Conversation.prototype.setRacine = function(racineElement) { - this.racine = new euphorik.Message(this.client, this.formateur, racineElement); -}; - /** * Met à jour la racine, décide de l'afficher ou non. * On l'affiche uniquement si le message racine n'est pas déjà affiché sur la liste des messages. diff --git a/js/pageMinichat/conversations.js b/js/pageMinichat/conversations.js index b0eea99..ada8a24 100644 --- a/js/pageMinichat/conversations.js +++ b/js/pageMinichat/conversations.js @@ -21,10 +21,11 @@ /** * Représente l'ensemble des conversations affichés. */ -euphorik.Conversations = function(client, formateur, util) { +euphorik.Conversations = function(client, formateur, util, fragment) { this.client = client; this.formateur = formateur; this.util = util; + this.fragment = fragment; // un ensemble des messages (id) auquel l'utilisateur répond (vider après l'envoie du message courant) this.messagesRepond = {}; @@ -56,6 +57,18 @@ euphorik.Conversations.prototype.toggleMessageRepond = function(mess) { this.ajouterMessageRepond(mess); }; +/** + * Met à jour le fragment de l'url renseignant sur les conversations ouvertes. + */ +euphorik.Conversations.prototype.mettreAJourFragment = function() { + conv = []; + for(var i = 1; i < this.conversations.length; i++) { + conv.push(this.conversations[i].racine.id) + } + this.fragment.setVal("conv", conv); + this.fragment.write(); +} + /** * Enlève tous les messages auquel l'utilisateur souhaite répondre. */ @@ -207,10 +220,7 @@ euphorik.Conversations.prototype.ajouterMessages = function(elements, numConvers } for (var i = 0; i < elements.messages.length; i++) { - // si une nouvelle conversation a été créée alors on lui donne la racine - if (this.ajouterMessage(elements.messages[i], numConversation)) { - this.conversations[numConversation].setRacine(elements.first); - } + this.ajouterMessage(elements.messages[i], numConversation) } this.flush(numConversation); @@ -247,6 +257,7 @@ euphorik.Conversations.prototype.ajouterMessage = function(element, numConversat nouvelleConversation = true; this.nouvelleConversation( numConversation, + message, // si une nouvelle conversation a été créée alors on lui donne la racine qui correspond au premier message function(num) { // fermeture de la conversation thisConversations.supprimerConversation(num); }, @@ -263,12 +274,17 @@ euphorik.Conversations.prototype.ajouterMessage = function(element, numConversat return nouvelleConversation; }; -euphorik.Conversations.prototype.nouvelleConversation = function(num, funFermer, funLien) +euphorik.Conversations.prototype.nouvelleConversation = function(num, racine, funFermer, funLien) { var thisMessages = this; this.conversations[num] = new euphorik.Conversation(this, num); + if (racine) { + this.conversations[num].racine = racine; + this.mettreAJourFragment(); + } + if (funFermer) { this.conversations[num].eventFermer(funFermer); } @@ -316,6 +332,7 @@ euphorik.Conversations.prototype.supprimerConversation = function(num) { this.client.supprimerConversation(num - 1); this.rafraichirMessages(true); + this.mettreAJourFragment(); }; /** diff --git a/js/pageMinichat/pageMinichat.js b/js/pageMinichat/pageMinichat.js index 2f53eb0..792f64a 100755 --- a/js/pageMinichat/pageMinichat.js +++ b/js/pageMinichat/pageMinichat.js @@ -68,9 +68,11 @@ euphorik.PageMinichat.prototype.charger = function() { $("#posterMessage input.pseudo").val(this.client.pseudo); // cet appel ne doit pas être fait avant l'appel à 'charger' - this.conversations = new euphorik.Conversations(this.client, this.formateur, this.util); + this.conversations = new euphorik.Conversations(this.client, this.formateur, this.util, this.fragment); - this.conversations.rafraichirMessages(true); + this.chargerConversationsFragment(); + + this.conversations.rafraichirMessages(true); this.util.setCaretToEnd($("form#posterMessage input.message")[0]); @@ -194,12 +196,31 @@ euphorik.PageMinichat.prototype.charger = function() { ); }; +euphorik.PageMinichat.prototype.chargerConversationsFragment = function() { + var thisPageMinichat = this; + + // attention : "conv" doit être un tableau d'entier + try { + var conv = this.fragment.getVal("conv"); + if (conv) { + conv.each(function(i, racine) { + thisPageMinichat.client.ajouterConversation(racine) + }); + } + } catch(e) { + ;; console.log(e) + } +} + euphorik.PageMinichat.prototype.decharger = function() { this.conversations.comet.stopAttenteCourante(); $("body #smiles").remove(); + + this.fragment.delVal("conv") }; + euphorik.PageMinichat.prototype.getJSONMessage = function(pseudo, message) { var repondA = []; objectEach(this.conversations.messagesRepond, function(id) { diff --git a/js/pageStatique.js b/js/pageStatique.js new file mode 100644 index 0000000..f5a4c2c --- /dev/null +++ b/js/pageStatique.js @@ -0,0 +1,33 @@ +// coding: utf-8 +// Copyright 2008 Grégory Burri +// +// This file is part of Euphorik. +// +// Euphorik is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Euphorik is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Euphorik. If not, see . + +/** + * Correspond à une page html statique se nommant ".html" et se trouvant dans "/pages/". + */ +euphorik.PageStatique = function(nom) { + this.nom = nom; +}; + +euphorik.PageStatique.prototype.contenu = function() { + var contenu = ""; + $.ajax({async: false, url: "pages/" + this.nom + ".html", success : function(page) { contenu += page; }}); + return contenu; +}; + +euphorik.PageStatique.prototype.charger = function() { +}; diff --git a/js/pages.js b/js/pages.js index cd1ade6..df515e6 100644 --- a/js/pages.js +++ b/js/pages.js @@ -22,28 +22,46 @@ /** * Gestion des pages. */ -euphorik.Pages = function() { +euphorik.Pages = function(fragment) { + this.fragment = fragment; this.pageCourante = undefined; + this.pageDefaut = undefined; this.pages = {}; }; /** * Accepte soit un objet soit un string. * un string correspond au nom de la page, par exemple : "page" -> "page.html" + * @defaut si vrai alors la page est la page par défaut */ -euphorik.Pages.prototype.ajouterPage = function(page) { +euphorik.Pages.prototype.ajouterPage = function(page, defaut) { if (typeof page === "string") { - this.pages[page] = page; - } else { - page.pages = this; // la magie des langages dynamiques : le foutoire - this.pages[page.nom] = page; + page = new euphorik.PageStatique(page); + } + + page.pages = this; // la magie des langages dynamiques : le foutoire + page.fragment = this.fragment; + + this.pages[page.nom] = page; + + if (defaut) { + this.pageDefaut = page; } }; euphorik.Pages.prototype.afficherPage = function(nomPage, forcerChargement) { forcerChargement = forcerChargement || false; - + + // si le nom de la page n'est pas donné on le prend du fragment + if (!nomPage) { + nomPage = this.fragment.getVal("page"); + } + var page = this.pages[nomPage]; + if (!page) { + page = this.pageDefaut; + } + if (!page || (!forcerChargement && page === this.pageCourante)) { return; } @@ -53,16 +71,11 @@ euphorik.Pages.prototype.afficherPage = function(nomPage, forcerChargement) { } $("#menu li").removeClass("courante"); - $("#menu li." + nomPage).addClass("courante"); + $("#menu li." + page.nom).addClass("courante"); this.pageCourante = page; - var contenu = ""; - if (typeof page === "string") { - $.ajax({async: false, url: "pages/" + page + ".html", success : function(page) { contenu += page; }}); - } else { - contenu += this.pageCourante.contenu(); - } - + var contenu = this.pageCourante.contenu(); + $("#page").html(contenu).removeClass().addClass( this.pageCourante.nom + (this.pageCourante.classes ? " " + this.pageCourante.classes() : "") // l'objet peut fournire des classes css supplémentaires sous la forme d'un string @@ -71,4 +84,7 @@ euphorik.Pages.prototype.afficherPage = function(nomPage, forcerChargement) { if (this.pageCourante.charger) { this.pageCourante.charger(); } + + this.fragment.setVal("page", this.pageCourante.nom); + this.fragment.write(); }; diff --git a/modules/erl/euphorik_common.erl b/modules/erl/euphorik_common.erl index ff251d7..3806df3 100644 --- a/modules/erl/euphorik_common.erl +++ b/modules/erl/euphorik_common.erl @@ -18,36 +18,38 @@ % % Module avec plein de bordel utile à l'intérieur. % @author G.Burri - + -module(euphorik_common). --export([ - serialize_ip/1, - unserialize_ip/1, - ceiling/1 -]). - - -% Arrondi un float à l'entier supérieur. -% Bizarre, cette fonction n'existe pas dans la stdlib. -% Pas utilisé mais bon ca me fait de la peine de l'enlever. -ceiling(X) -> - T = trunc(X), - case (X - T) of - Neg when Neg < 0 -> T; - Pos when Pos > 0 -> T + 1; - _ -> T - end. - - -% Retourne la difference entre deux timestamp (erlang:now()) en miliseconde -delta_date_ms(D1, D2) -> - 1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000). - - -% Retourne la différence entre deux timestamp (erlang:now) en minutes -delta_date_minute(D1, D2) -> - trunc(delta_date_ms(D1, D2) / 1000 / 60). +-export([ + ceiling/1, + delta_date_ms/2, + delta_date_minute/2, + serialize_ip/1, + unserialize_ip/1 +]). + + +% Arrondi un float à l'entier supérieur. +% Bizarre, cette fonction n'existe pas dans la stdlib. +% Pas utilisé mais bon ca me fait de la peine de l'enlever. +ceiling(X) -> + T = trunc(X), + case (X - T) of + Neg when Neg < 0 -> T; + Pos when Pos > 0 -> T + 1; + _ -> T + end. + + +% Retourne la difference entre deux timestamp (erlang:now()) en miliseconde +delta_date_ms(D1, D2) -> + 1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000). + + +% Retourne la différence entre deux timestamp (erlang:now) en minutes +delta_date_minute(D1, D2) -> + trunc(delta_date_ms(D1, D2) / 1000 / 60). serialize_ip(undefined) -> -- 2.43.0