diff options
-rw-r--r-- | hyperkitty/static/css/hyperkitty-common.css | 12 | ||||
-rw-r--r-- | hyperkitty/static/js/hyperkitty.js | 18 | ||||
-rw-r--r-- | hyperkitty/templates/messages/reply_form.html | 13 | ||||
-rw-r--r-- | hyperkitty/views/forms.py | 5 | ||||
-rw-r--r-- | hyperkitty/views/message.py | 19 |
5 files changed, 54 insertions, 13 deletions
diff --git a/hyperkitty/static/css/hyperkitty-common.css b/hyperkitty/static/css/hyperkitty-common.css index b385f1d..26b1153 100644 --- a/hyperkitty/static/css/hyperkitty-common.css +++ b/hyperkitty/static/css/hyperkitty-common.css @@ -47,7 +47,7 @@ /* Forms (replies, registration, ...) */ form .buttons .submit { /* leave some space before the cancel button/link */ - margin-right: 2em; + margin-right: 1em; } @@ -210,11 +210,21 @@ a.reply.disabled { padding-top: 1em; } .reply-form p.reply-tools { + margin-bottom: 0.7em; +} +.reply-form p.reply-tools label { + display: inline; font-size: 90%; + margin-left: 1.5em; +} +.reply-form p.reply-tools input { + margin-top: 0; + margin-right: 0.1em; } .reply-form p { margin: 0; } +.reply-form #id_subject, .reply-form textarea { width: 95%; } diff --git a/hyperkitty/static/js/hyperkitty.js b/hyperkitty/static/js/hyperkitty.js index 6aa318d..05be5bc 100644 --- a/hyperkitty/static/js/hyperkitty.js +++ b/hyperkitty/static/js/hyperkitty.js @@ -161,6 +161,8 @@ function setup_replies() { $(".reply-form button[type='submit']").click(function(e) { e.preventDefault(); var form = $(this).parents("form").first(); + // remove previous error messages + form.find("div.reply-result").remove(); var data = form_to_json(form); $.ajax({ type: "POST", @@ -180,7 +182,7 @@ function setup_replies() { $('<div class="reply-result"><div class="alert alert-error">' + '<button type="button" class="close" data-dismiss="alert">×</button> ' + jqXHR.responseText + '</div></div>') - .css("display", "none").insertBefore(form).slideDown(); + .css("display", "none").prependTo(form).slideDown(); } }); }); @@ -207,6 +209,20 @@ function setup_replies() { textarea.val(quoted + "\n" + textarea.val()); textarea.focus(); }); + function set_new_thread(checkbox) { + var this_form = checkbox.parents("form").first(); + var subj = this_form.find("input[name='subject']").parents("p").first(); + if (checkbox.is(":checked")) { + subj.slideDown("fast"); + subj.find("input").focus(); + } else { + subj.slideUp("fast"); + this_form.find("textarea").focus(); + } + } + $(".reply-form input[name='newthread']").change(function() { + set_new_thread($(this)); + }).change(); } diff --git a/hyperkitty/templates/messages/reply_form.html b/hyperkitty/templates/messages/reply_form.html index ce31031..b0a810d 100644 --- a/hyperkitty/templates/messages/reply_form.html +++ b/hyperkitty/templates/messages/reply_form.html @@ -2,11 +2,20 @@ <a class="reply{% if not user.is_authenticated %} disabled" title="You must be logged-in to reply.{% endif %}" href="#">Reply</a> <div class="reply-form dropdown"> - <p class="reply-tools">[<a href="#" class="quote">Quote</a>]</p> <form method="post" action="{% url 'message_reply' mlist_fqdn=mlist_fqdn message_id_hash=message_id_hash %}"> {% csrf_token %} - {{ reply_form.as_p }} + <p class="reply-tools"> + <a class="btn btn-mini quote" href="#">Quote</a> + <label>{{ reply_form.newthread }} Create a new thread</label> + </p> + {{ reply_form.non_field_errors }} + {% for field in reply_form %} + {% if field.html_name != "newthread" %} + <p>{{ field }} {{ field.errors}}</p> + {% endif %} + {% endfor %} + {# { reply_form.as_p } #} <p class="buttons"> <button type="submit" class="submit btn btn-primary">Send</button> or <a class="cancel" href="#">cancel</a> diff --git a/hyperkitty/views/forms.py b/hyperkitty/views/forms.py index 8cd3abd..9cacad8 100644 --- a/hyperkitty/views/forms.py +++ b/hyperkitty/views/forms.py @@ -114,7 +114,10 @@ class SearchForm(forms.Form): class ReplyForm(forms.Form): - message = forms.CharField(widget=forms.Textarea, label="") + newthread = forms.BooleanField(label="", required=False) + subject = forms.CharField(label="", required=False, + widget=forms.TextInput(attrs={ 'placeholder': 'New subject'})) + message = forms.CharField(label="", widget=forms.Textarea) class PostForm(forms.Form): subject = forms.CharField() diff --git a/hyperkitty/views/message.py b/hyperkitty/views/message.py index 0cc6134..bb6f364 100644 --- a/hyperkitty/views/message.py +++ b/hyperkitty/views/message.py @@ -157,14 +157,17 @@ def reply(request, mlist_fqdn, message_id_hash): content_type="text/plain", status=400) store = get_store(request) mlist = store.get_list(mlist_fqdn) - message = store.get_message_by_hash_from_list(mlist.name, message_id_hash) - subject = message.subject - if not message.subject.lower().startswith("re:"): - subject = "Re: %s" % subject - post_to_list(request, mlist, subject, form.cleaned_data["message"], { - "In-Reply-To": "<%s>" % message.message_id, - "References": "<%s>" % message.message_id, - }) + if form.cleaned_data["newthread"]: + subject = form.cleaned_data["subject"] + headers = {} + else: + message = store.get_message_by_hash_from_list(mlist.name, message_id_hash) + subject = message.subject + if not message.subject.lower().startswith("re:"): + subject = "Re: %s" % subject + headers = {"In-Reply-To": "<%s>" % message.message_id, + "References": "<%s>" % message.message_id, } + post_to_list(request, mlist, subject, form.cleaned_data["message"], headers) return HttpResponse("The reply has been sent successfully.", mimetype="text/plain") |