summaryrefslogtreecommitdiffstats
path: root/hyperkitty
diff options
context:
space:
mode:
Diffstat (limited to 'hyperkitty')
-rw-r--r--hyperkitty/static/css/hyperkitty-common.css12
-rw-r--r--hyperkitty/static/js/hyperkitty.js18
-rw-r--r--hyperkitty/templates/messages/reply_form.html13
-rw-r--r--hyperkitty/views/forms.py5
-rw-r--r--hyperkitty/views/message.py19
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">&times;</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")