X-Git-Url: http://git.euphorik.ch/?p=euphorik.git;a=blobdiff_plain;f=js%2FpageAdmin.js;h=fc1d51a80ff060e8857df49d533d226f7ecf1d22;hp=75f55a8220af47e85823ebe1fe576a86981a4cbf;hb=c8744484cda0d18ec3c13f835785dddf14786743;hpb=6f1e9a972293544a6c92a99c9a04a509b2c7648a diff --git a/js/pageAdmin.js b/js/pageAdmin.js index 75f55a8..fc1d51a 100644 --- a/js/pageAdmin.js +++ b/js/pageAdmin.js @@ -1,70 +1,402 @@ // 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 . +// +// La page d'administation, ne peut être accédée que par les ekMaster (admins) -function PageAdmin(client, formateur, util) -{ - this.nom = "admin" +/*jslint laxbreak:true */ + + +euphorik.PageAdmin = function(client, formateur, util) { + this.nom = "admin"; + + this.client = client; + this.formateur = formateur; + this.util = util; + + this.comet = new Comet("admin", euphorik.conf.versionProtocole); - this.client = client - this.formateur = formateur - this.util = util -} - -PageAdmin.prototype.contenu = function() -{ - return '

Trolls

\ -

Nouveau troll\ - \ - \ -

' -} - -PageAdmin.prototype.charger = function() -{ - $("#page form#nouveauTroll").submit(function(){return false}) + // le timer qui rappelle periodiquement le rafraichissement des IP bannies + this.timeoutIDmajIPs = null; +}; + +/** + * Interface des pages. + */ +euphorik.PageAdmin.prototype.contenu = function() { + return '

Trolls

' + + '

Un troll est un sujet à débat, en général une question, affiché sur la page principale.

' + + '

Chaque semaine un troll est choisi au hasard parmis les trolls proposés et devient le troll de la semaine.

' + + '
' + + '

' + + ' ' + + ' ' + + '

' + + '
' + + '
' + + '

IPs bannies

' + + '
'; +}; + +/** + * Interface des pages. + */ +euphorik.PageAdmin.prototype.charger = function() { + $("#page form#nouveauTroll").submit(function(){ return false; }); - var thisPage = this + var thisPage = this; + + // la liste des trolls proposés par les ekMasters + this.trolls = new euphorik.Trolls(this.client, this.util, this.formateur); - this.trolls = new Trolls(this.util) - this.trolls.rafraichirTrolls() + this.waitEvent(); + + this.majIPs(); + + $("#page form#nouveauTroll input.troll").focus(); $("#page form#nouveauTroll button.return").click( - function() - { + function() { + thisPage.posterTroll(); } - ) -} + ); +}; -/////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Interface des pages. + */ +euphorik.PageAdmin.prototype.decharger = function() { + this.comet.stopAttenteCourante(); + + // supprime le rafraichissement période des ips + if (this.timeoutIDmajIPs) { + clearTimeout(this.timeoutIDmajIPs); + } +}; + +/** + * Post un troll, le contenu est lu à partir de "input.troll". + */ +euphorik.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; + } -function Trolls(util) -{ - this.util = util - this.dernierTroll = 0 - this.pageEvent = new PageEvent("admin", this.util) -} + var dataToSend = { + "header" : { "action" : "put_troll", "version" : euphorik.conf.versionProtocole }, + "cookie" : this.client.cookie, + "content" : content + }; -Trolls.prototype.rafraichirTrolls = function() -{ - var thisTrolls = this + jQuery.ajax({ + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(dataToSend), + success: + function(data){ + if (data.reply === "ok") { + $("#page form#nouveauTroll input.troll").val(""); + } else if (data.reply === "error") { + thisPageAdmin.util.messageDialogue(data.error_message); + } + } + }); +}; + +/** + * Met à jour la liste des IP bannies. + */ +euphorik.PageAdmin.prototype.majIPs = function() { + if (this.timeoutIDmajIPs) { + clearTimeout(this.timeoutIDmajIPs); + } + + var thisPageAdmin = this; + + var dataToSend = { + "header" : { "action" : "list_banned_ips", "version" : euphorik.conf.versionProtocole }, + "cookie" : this.client.cookie + }; + + jQuery.ajax({ + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(dataToSend), + success: + function(data) { + if (data.reply === "list_banned_ips") { + var XHTML = ""; + data.list.each(function(i, ip) { + XHTML += '
' + ip.ip + '|' + + '' + + ip.remaining_time + + '|'; + ip.users.each(function(j, user) { + XHTML += (j > 0 ? ", " : "") + + '' + thisPageAdmin.formateur.traitementComplet(user.nick) + '' + + (user.login === "" ? "" : ''); + }); + XHTML += 'débannir
'; + }); + + if (data.list.length === 0) { + XHTML += '

Aucune IP bannie

'; + } + + $("#ips").html(XHTML); + + $(".ban").each(function() { + var ip = $(".ip", this).html(); + $(".deban", this).click( + function() { + thisPageAdmin.util.messageDialogue("Êtes-vous sur de vouloir débannir l'IP ''" + ip + "'' ?", euphorik.Util.messageType.question, + {"Oui" : function() { + thisPageAdmin.deban(ip); + }, + "Non" : function(){} + } + ); + } + ); + }); + } else if (data.reply === "error") { + thisPageAdmin.util.messageDialogue(data.error_message); + } + + // rafraichissement toutes les minutes (je sais c'est mal) + // le problème est le rafraichissement des temps restant de bannissement qui doit être fait du coté client + thisPageAdmin.timeoutIDmajIPs = setTimeout(function(){ thisPageAdmin.majIPs(); }, 60 * 1000); + } + }); +}; + +/** + * Débannie une ip donnée. + */ +euphorik.PageAdmin.prototype.deban = function(ip) { + var thisPageAdmin = this; + + var dataToSend = { + "header" : { "action" : "unban", "version" : euphorik.conf.versionProtocole }, + "cookie" : this.client.cookie, + "ip" : ip + }; + + jQuery.ajax({ + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(dataToSend), + success: + function(data){ + if(data.reply === "error") { + thisPageAdmin.util.messageDialogue(data.error_message); + } + } + }); +}; + +/** + * Attente d'événement de la part du serveur. + */ +euphorik.PageAdmin.prototype.waitEvent = function() { + var thisPageAdmin = this; - this.pageEvent.waitEvent( - function() { return { "last_troll" : thisTrolls.dernierTroll }}, - function(data) + this.comet.waitEvent( + function() { return { "last_troll" : thisPageAdmin.trolls.dernierTroll }; }, { - 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 += '

' + data["trolls"][i]["content"] + '

' + "troll_added" : function(data){ thisPageAdmin.trolls.ajouterTrollEvent(data); }, + "troll_modified" : function(data){ thisPageAdmin.trolls.modifierTrollEvent(data); }, + "troll_deleted" : function(data){ thisPageAdmin.trolls.supprimerTrollEvent(data); }, + "banned_ips_refresh" : function(data){ thisPageAdmin.majIPs(); }, + "error" : + function(data) { + thisTrolls.util.messageDialogue(data.error_message); + } + } + ); +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Représente un troll, pas grand chose finalement. + */ +euphorik.Troll = function(content, author) { + this.content = content; + this.author = author; +}; + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +euphorik.Trolls = function(client, util, formateur) { + this.client = client; + this.util = util; + this.formateur = formateur; + this.dernierTroll = 0; + + this.trolls = {}; +}; + +euphorik.Trolls.prototype.ajouterTrollEvent = function(data) { + var thisTrolls = this; + + var XHTML = ""; + data.trolls.each(function(i, trollData) { + var troll = new euphorik.Troll(trollData.content, trollData.author); + var trollId = trollData.troll_id; + thisTrolls.trolls[trollId] = troll; + + XHTML += + '
' + + '' + thisTrolls.formateur.traitementComplet(troll.content, troll.author) + '' + + ' - ' + thisTrolls.formateur.traitementComplet(troll.author) + '' + + (trollData.author_id === thisTrolls.client.id ? 'éditerSupprimer' : '') + + '
'; + }); + $("#trolls").append(XHTML); + $("#trolls .troll").filter(function() { return parseInt($(this).attr("id").substr(5), 10) > thisTrolls.dernierTroll; }).each( + function() { + var troll = this; + var id = parseInt($(this).attr("id").substr(5), 10); + + $("a[@rel*=lightbox]", this).lightBox(); + + $(this).keypress( + function(e) { + if (e.which === 13) { // return + $(".modifier", this).click(); } - $("#trolls").append(XHTML) - break - case "troll_modified" : - $("#trolls #troll"+data["troll_id"]).html(data["content"]) - break - } + } + ); + + $(".delTroll", this).click( + function() { + thisTrolls.util.messageDialogue( + "Êtes-vous sur de vouloir supprimer le troll \"" + thisTrolls.trolls[id].content + "\" ?", + euphorik.Util.messageType.question, + { + "oui" : function() { + thisTrolls.supprimer(id); + }, + "non" : function(){} + } + ); + } + ); + + $(".editTroll", this).click( + function() { + $("span", troll).css("display", "none"); + $(troll).append( + '

modifierannuler

' + ); + $("form input.content").focus(); + + var virerLeFormulaire = function() { + $('form', troll).remove(); + $('span', troll).css("display", "inline"); + }; + $("span.modifier", troll).click( + function() { + var content = $("form input.content", troll).val(); + virerLeFormulaire(); + thisTrolls.modifier(id, content); + } + ); + $("span.annuler", troll).click( virerLeFormulaire ); + $("form", troll).submit(function(){ return false; }); + } + ); } - ) -} \ No newline at end of file + ); + + if (data.trolls.length > 0) { + thisTrolls.dernierTroll = data.trolls[data.trolls.length - 1].troll_id; + } +}; + +euphorik.Trolls.prototype.modifierTrollEvent = function(data) { + var thisTrolls = this; + $("#trolls #troll" + data.troll_id + " .content").html(thisTrolls.formateur.traitementComplet(data.content, thisTrolls.trolls[data.troll_id].author)); + $("#trolls #troll" + data.troll_id + " a[@rel*=lightbox]").lightBox(); + thisTrolls.trolls[data.troll_id].content = data.content; +}; + +euphorik.Trolls.prototype.supprimerTrollEvent = function(data) { + $("#trolls #troll" + data.troll_id).remove(); +}; + +euphorik.Trolls.prototype.modifier = function(id, content) { + var thisTrolls = this; + + var dataToSend = { + "header" : { "action" : "mod_troll", "version" : euphorik.conf.versionProtocole }, + "cookie" : this.client.cookie, + "troll_id" : id, + "content" : content + }; + + jQuery.ajax({ + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(dataToSend), + success: + function(data) { + if (data.reply === "error") { + thisTrolls.util.messageDialogue(data.error_message); + } + } + }); +}; + +/** + * Supprime un troll en fonction de son id. + */ +euphorik.Trolls.prototype.supprimer = function(id) { + var thisTrolls = this; + + var dataToSend = { + "header" : { "action" : "del_troll", "version" : euphorik.conf.versionProtocole }, + "cookie" : this.client.cookie, + "troll_id" : id + }; + + jQuery.ajax({ + type: "POST", + url: "request", + dataType: "json", + data: this.util.jsonVersAction(dataToSend), + success: + function(data) { + if (data.reply === "error") { + thisTrolls.util.messageDialogue(data.error_message); + } + } + }); +};