diff --git a/admin/views.py b/admin/views.py index 1cc0e59cd..13aa2655a 100644 --- a/admin/views.py +++ b/admin/views.py @@ -15,7 +15,7 @@ from modoboa import admin, userprefs from modoboa.admin.models import Domain, Mailbox, Alias from forms import MailboxForm, DomainForm, AliasForm, PermissionForm from modoboa.lib.authbackends import crypt_password -from modoboa.lib import _render, _ctx_ok, _ctx_ko +from modoboa.lib import _render, _ctx_ok, _ctx_ko, getctx from modoboa.lib import events, parameters from modoboa.lib.models import Parameter import string @@ -440,5 +440,5 @@ def saveparameters(request): continue app, name = pname.split('.') parameters.save_admin(app, name, v) - request.user.message_set.create(message=_("Configuration saved.")) - return HttpResponseRedirect(reverse(admin.views.viewparameters)) + ctx = getctx("ok") + return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") diff --git a/extensions/webmail/static/css/webmail.css b/extensions/webmail/static/css/webmail.css index 93d87f32d..2a9fea2e0 100644 --- a/extensions/webmail/static/css/webmail.css +++ b/extensions/webmail/static/css/webmail.css @@ -153,7 +153,6 @@ textarea { background-color: #eee; width: 80%; height: 30px; - font-size: medium; } textarea:hover { diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index 9b6714a6a..3ac3ee0ac 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -25,14 +25,6 @@ } $$("a[name=loadfolder]").addEvent("click", foldercallback); $$("a[name=compose]").addEvent("click", loadCompose); - $$("a[name=empty]").addEvent("click", empty); - } - - empty = function(event) { - event.stop(); - new Request.JSON({url : event.target.get("href"), onSuccess : function(resp) { - wm_updatelisting(resp); - }}).get(); } select = function(obj) { @@ -232,13 +224,25 @@ msgset.include(item.get("id")); }); {% url extensions.webmail.views.move as moveurl %} - new Request.JSON({url: "{{ moveurl }}", - onSuccess: get_callback("folder")} - ).get({msgset : msgset.join(), to : dest}); + simple_request("{{ moveurl }}", {msgset : msgset.join(), to : dest}); } }); }; + simple_request = function(url, params) { + infobox.show(gettext("Waiting..."), { + profile: "gray", + spinner: true + }); + new Request.JSON({url : url, + onSuccess : function(response) { + get_callback("folder")(response); + infobox.notice(gettext("Done")); + infobox.hide(1); + } + }).get(params); + } + buildmarkrequest = function(evt) { evt.stop(); if (!selectedRows.length) { @@ -248,16 +252,13 @@ selectedRows.each(function(item, index) { ids.include(item.get("id")); }); - new Request.JSON({url : evt.target.get("href"), - onSuccess : get_callback("folder")}).get({ids : ids.join()}); + simple_request(evt.target.get("href"), {ids : ids.join()}); } $$("a[name=mark-read]").addEvent("click", buildmarkrequest); $$("a[name=mark-unread]").addEvent("click", buildmarkrequest); $$("a[name=fdaction]").addEvent("click", function(evt) { - new Request.JSON({url : evt.target.get("href"), - onSuccess : get_callback("folder") - }).get(); + simple_request(evt.target.get("href"), {}); evt.stop(); }); diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index ddf411515..53a5718d4 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -83,15 +83,16 @@ def listing_menu(selection, folder, user): "label" : _("Compress folder"), "img" : "/static/pics/compress.png", "url" : "compact/%s/" % folder}, - {"name" : "fdaction", - "label" : _("Empty folder"), - "img" : "/static/pics/clear.png", - "url" : folder == parameters.get_user(user, "webmail", - "TRASH_FOLDER") \ - and reverse(webmail.views.empty, args=[folder]) or ""} ] } ] + if folder == parameters.get_user(user, "webmail", "TRASH_FOLDER"): + entries[2]["menu"] += [ + {"name" : "fdaction", + "label" : _("Empty folder"), + "img" : "/static/pics/clear.png", + "url" : reverse(webmail.views.empty, args=[folder])} + ] menu = render_to_string("common/menu.html", {"selection" : selection, "entries" : entries, "user" : user}) diff --git a/static/js/common.js b/static/js/common.js index 13d7fd7cd..6b804a362 100644 --- a/static/js/common.js +++ b/static/js/common.js @@ -33,7 +33,10 @@ check_anchor = function() { } else { query = current_anchor.serialized.substring(1); } - infobox.show(gettext("Loading..."), "gray"); + infobox.show(gettext("Loading..."), { + profile: "gray", + spinner: true + }); new Request.JSON({url: query, noCache : true, onSuccess: function(resp) { callback = ($defined(resp.callback)) ? resp.callback : "default"; callbacks[callback](resp); @@ -349,3 +352,18 @@ gethref = function(obj) { return url.replace(baseurl, ""); } + +saveparams = function(id, message) { + $$("input[name=update]").addEvent("click", function(evt) { + evt.stop(); + $(id).set("send", { + onSuccess: function(response) { + var decode = JSON.decode(response); + if (decode.status == "ok") { + infobox.notice(message); + infobox.hide(1); + } + } + }).send(); + }); +} \ No newline at end of file diff --git a/static/js/infobox.js b/static/js/infobox.js index b35054ec2..32ef01b2c 100644 --- a/static/js/infobox.js +++ b/static/js/infobox.js @@ -56,40 +56,48 @@ var InfoBox = new Class({ }, notice: function(message) { - this.setProfile("green"); - this.setMessage(message); + this.show(message, { + profile: "green" + }); }, error: function(message) { - this.setProfile("red"); - this.setMessage(message); + this.show(message, { + profile: "red" + }); }, warning: function(message) { - this.setProfile("yellow"); - this.setMessage(message); + this.show(message, { + profile: "yellow" + }); }, - show: function(message, prof, delay) { + show: function(message, arguments) { if ($defined(this.start)) { if ($time() - this.start > this.delay) { $clear(this.showtimer); delete(this.start); delete(this.delay); } else { - this.showtimer = this.show.delay(100, this, [message, prof]); + this.showtimer = this.show.delay(100, this, [message, arguments]); return; } } if ($defined(message)) { this.setMessage(message); } - if ($defined(prof)) { - this.setProfile(prof); + if ($defined(arguments.profile)) { + this.setProfile(arguments.profile); } - if ($defined(delay)) { + if ($defined(arguments.delay)) { this.start = $time(); - this.delay = delay * 1000; + this.delay = arguments.delay * 1000; + } + if ($defined(arguments.spinner) && arguments.spinner) { + this.spinner.setStyle("display", "block"); + } else { + this.spinner.setStyle("display", "none"); } this.box.setStyle("display", "block"); }, diff --git a/static/js/preferences.js b/static/js/preferences.js index c82a1a837..82456d64a 100644 --- a/static/js/preferences.js +++ b/static/js/preferences.js @@ -11,4 +11,5 @@ window.addEvent('domready', function() { } }, $('accordion')); + saveparams("uparams_form", gettext("Preferences saved")); }); diff --git a/static/js/settings.js b/static/js/settings.js index acdb6d31b..2822106fc 100644 --- a/static/js/settings.js +++ b/static/js/settings.js @@ -17,5 +17,5 @@ window.addEvent('domready', function() { toggler.setStyle('color', '#222'); } }, $('accordion')); - + saveparams("params_form", gettext("Parameters saved")); }); \ No newline at end of file diff --git a/templates/admin/parameters.html b/templates/admin/parameters.html index 5a14fff4f..c8b8fd2b4 100644 --- a/templates/admin/parameters.html +++ b/templates/admin/parameters.html @@ -5,7 +5,7 @@ {% endblock %} {% block setcontent %} {% url admin.views.saveparameters as action %} -
+ {% include "common/parameters.html" %}
{% endblock %} diff --git a/templates/userprefs/preferences.html b/templates/userprefs/preferences.html index 1f37b97da..d13da53a8 100644 --- a/templates/userprefs/preferences.html +++ b/templates/userprefs/preferences.html @@ -7,7 +7,8 @@ {% block middletitle %}{% trans "Preferences" %}{% endblock %} {% block menu %}{% uprefs_menu user %}{% endblock %} {% block content %} -
+ {% include "common/parameters.html" %}
{% endblock %} diff --git a/userprefs/views.py b/userprefs/views.py index 0ef6e99e6..22658e1a1 100644 --- a/userprefs/views.py +++ b/userprefs/views.py @@ -8,7 +8,7 @@ from django.contrib.auth.decorators \ import login_required from django.utils import simplejson from django.utils.translation import ugettext as _ -from modoboa.lib import _render, _ctx_ok, _ctx_ko, parameters +from modoboa.lib import _render, _ctx_ok, _ctx_ko, getctx, parameters from modoboa.lib.authbackends import crypt_password from forms import ChangePasswordForm from modoboa.admin.models import Mailbox @@ -77,7 +77,8 @@ def savepreferences(request): app, name = pname.split('.') parameters.save_user(request.user, app, name, v) - return HttpResponseRedirect(reverse(preferences)) + ctx = getctx("ok") + return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required def confirm(request):