diff --git a/.hgignore b/.hgignore index 9fd5fab25..06861c4f7 100644 --- a/.hgignore +++ b/.hgignore @@ -1,3 +1,4 @@ .*~$ ^[^\.]+\.pyc static/tmp +static/ckeditor diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index b5a2d33ce..eae4295b9 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -13,12 +13,14 @@ from mailng.lib import tables, imap_utf7, parameters class WMtable(tables.Table): + tableid = "emails" idkey = "imapid" - selection = tables.SelectionColumn("selection", first=True) - subject = tables.Column("subject", label=_("Subject")) - from_ = tables.Column("from", label=_("From")) - date = tables.Column("date", label=_("Date")) - flags = tables.ImgColumn("flags") + selection = tables.SelectionColumn("selection", width="20px", first=True) + _1_flags = tables.ImgColumn("flags", width="40px") + _2_subject = tables.Column("subject", width="50%", label=_("Subject")) + _3_from_ = tables.Column("from", width="20%", label=_("From")) + _4_date = tables.Column("date", width="20%", label=_("Date")) + def parse(self, header, value): try: diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index a3e7b18e6..c02b0c938 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import time +import sys from django.http import HttpResponse from django.template.loader import render_to_string from django.utils import simplejson @@ -33,41 +34,46 @@ def menu(**kwargs): return [] return [ {"name" : _("Webmail"), - "url" : reverse(folder), + "url" : reverse(index), "img" : "/static/pics/webmail.png"} ] def userlogin(**kwargs): kwargs["request"].session["password"] = kwargs["password"] -def folder_ajax(request, name, pageid, menu=False): +def getctx(status, **kwargs): + callername = sys._getframe(1).f_code.co_name + ctx = {"status" : status, "callback" : callername} + for kw, v in kwargs.iteritems(): + ctx[kw] = v + return ctx + +@login_required +def folder(request, name, updatenav=True): + if not name: + name = "INBOX" + if updatenav: + pageid = request.GET.has_key("page") and int(request.GET["page"]) or 1 + request.session["folder"] = name + request.session["page"] = pageid lst = ImapListing(request.user.username, request.session["password"], - reverse(folder, args=[name]), folder=name) - page = lst.paginator.getpage(pageid) + name, folder=name) + page = lst.paginator.getpage(request.session["page"]) if page: content = lst.fetch(request, page.id_start, page.id_stop) navbar = lst.render_navbar(page) else: content = "Empty folder" navbar = "" - ctx = {"status" : "ok", "listing" : content, "navbar" : navbar} - if menu or "menu" in request.GET.keys(): - from templatetags.webextras import listing_menu - ctx["menu"] = listing_menu("", request.user.get_all_permissions()) + ctx = getctx("ok", listing=content, navbar=navbar, + menu=listing_menu("", request.user.get_all_permissions())) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required -def folder(request, name=None): - if not name: - name = "INBOX" - pageid = request.GET.has_key("page") and int(request.GET["page"]) or 1 - request.session["folder"] = name - request.session["page"] = pageid - if "mode" in request.GET.keys() and request.GET["mode"] == "ajax": - return folder_ajax(request, name, pageid) +def index(request): lst = ImapListing(request.user.username, request.session["password"], - reverse(folder, args=[name]), folder=name) - return lst.render(request, pageid=int(pageid)) + "INBOX", folder="INBOX") + return lst.render(request, empty=True) def fetchmail(request, folder, mail_id, all=False): global mbc @@ -84,14 +90,14 @@ def viewmail(request, folder, mail_id=None): header = fetchmail(request, folder, mail_id) if header: from templatetags.webextras import viewm_menu - menu = viewm_menu("", request.session["folder"], mail_id, - request.session["page"], + pageid = request.session.has_key("page") and request.session["page"] or "1" + menu = viewm_menu("", folder, mail_id, pageid, request.user.get_all_permissions()) folder, imapid = header["imapid"].split("/") mailcontent = render_to_string("webmail/viewmail.html", { "header" : header, "folder" : folder, "imapid" : imapid }) - ctx = {"status" : "ok", "menu" : menu, "listing" : mailcontent} + ctx = getctx("ok", menu=menu, listing=mailcontent) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required @@ -122,8 +128,7 @@ def compose(request): s = smtplib.SMTP(parameters.get("webmail", "SMTP_SERVER")) s.sendmail(msg['From'], [msg['To']], msg.as_string()) s.quit() - return folder_ajax(request, request.session["folder"], - request.session["page"], True) + return folder(request, request.session["folder"], False) form = ComposeMailForm() form.fields["from_"].initial = request.user.username @@ -132,5 +137,5 @@ def compose(request): content = render_to_string("webmail/compose.html", { "form" : form }) - ctx = {"status" : "ok", "menu" : menu, "listing" : content} + ctx = getctx("ok", menu=menu, listing=content) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index 0a9c16af8..d44d1aca1 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -44,9 +44,16 @@ margin-right: 2px; border: 0; } + +tr.table-tr-selected { + background: red; +} {% endblock %} {% block js %} updatelisting = function(resp, overflow) { + if (!$defined(overflow)) { + overflow = "auto"; + } if ($defined(resp.menu)) { $("menubar").set("html", resp.menu); } @@ -60,46 +67,68 @@ } {% url extensions.webmail.main.folder as view_url %} - loadMail = function(event) { + viewmail = function(event) { event.stop(); if (event.target.parentNode.id) { - var url = "{{ view_url }}" + event.target.parentNode.id; + var url = event.target.parentNode.id + "/"; event.target.parentNode.setStyle("background", "#ffffcc"); - new Request.JSON({url: url, onSuccess: function(resp) { - updatelisting(resp, "hidden"); - $$("a[name=back]").addEvent("click", loadFolder); - setDivHeight("mailcontent", $("table-container").getSize().y, 0); - }}).get(); + location.hash = url; } } + register_callback("viewmail", function(resp) { + updatelisting(resp, "hidden"); + $$("a[name=back]").addEvent("click", loadFolder); + setDivHeight("mailcontent", $("table-container").getSize().y, 0); + }); loadCompose = function(event) { event.stop(); - new Request.JSON({url: event.target, onSuccess: function(resp) { - updatelisting(resp, "hidden"); - $$("a[name=back]").addEvent("click", loadFolder); - $$("a[name=sendmail]").addEvent("click", function(evt) { - evt.stop(); - $("composemail").set("send", { - onSuccess: function(res) { - updatelisting(JSON.decode(res)); - $$("tr").addEvent("click", loadMail); - } - }); - $("composemail").send(); - }); - setDivHeight("id_body", $("mailheader").getSize().y + 20, 0); - }}).get(); + location.hash = "compose/"; } + register_callback("compose", function(resp) { + updatelisting(resp, "hidden"); + $$("a[name=back]").addEvent("click", loadFolder); + $$("a[name=sendmail]").addEvent("click", function(evt) { + evt.stop(); + $("composemail").set("send", { + onSuccess: function(res) { + updatelisting(JSON.decode(res)); + $$("tr").addEvent("click", viewmail); + } + }); + $("composemail").send(); + }); + setDivHeight("id_body", $("mailheader").getSize().y + 20, 0); + }); loadFolder = function(event, obj) { - obj = typeof(obj) != "undefined" ? obj : event.target; + if (!$defined(obj)) { + obj = event.target; + } event.stop(); - new Request.JSON({url: obj.get("href"), onSuccess: function(resp) { - updatelisting(resp, "auto"); - $$("tr").addEvent("click", loadMail); - }}).get({"mode" : "ajax"}); + location.hash = obj.get("href"); } + register_callback("folder", function(resp) { + updatelisting(resp, "auto"); + var tbl = new HtmlTable($("emails"), { + selectable: true + }); + var drag_group = new Drag.Group({ + }); + tbl.addEvent("rowFocus", function(obj) { + var clone = obj.clone() + .setStyles(obj.getCoordinates()) + .setStyles({"opacity": 0.7, "position": "absolute"}) + .inject(document.body); + drag_group.add(clone, { + onComplete: function(item) { + item.dispose(); + delete(item); + } + }); + }); + $$("tr").addEvent("dblclick", viewmail); + }); navbarcallback = function(event) { loadFolder(event, event.target.getParent()); @@ -117,9 +146,9 @@ loadFolder(event, event.target); } + ajaxListener(updatelisting); $$("a[name=loadfolder]").addEvent("click", foldercallback); $("navbar").getChildren("a").addEvent("click", navbarcallback); - $$("tr").addEvent("click", loadMail); $$("a[name=compose]").addEvent("click", loadCompose); {% endblock %} {% block middletitle %}{% trans "Webmail" %}{% endblock %} @@ -133,7 +162,7 @@