Browse Source

Start and reply to threads

Rafał Pitoń 10 years ago
parent
commit
3cb9e8d7cf

+ 29 - 12
misago/static/misago/css/misago/posting.less

@@ -23,6 +23,35 @@
     bottom: 0px;
     bottom: 0px;
   }
   }
 
 
+  .container {
+    position: relative;
+  }
+
+  .lefthand {
+    margin: 0px;
+    position: absolute;
+    left: @grid-gutter-width * -1;
+    width: @grid-gutter-width;
+
+    li {
+      text-align: center;
+    }
+  }
+
+  .thread-title {
+    background: @input-bg;
+    border: 2px solid @input-border;
+    border-radius: @border-radius-large;
+    margin-bottom: @line-height-computed / 2;
+
+    input, select {
+      border: none;
+      .box-shadow(none);
+
+      .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);
+    }
+  }
+
   .editor-preview {
   .editor-preview {
     border: 2px dashed @form-panel-border;
     border: 2px dashed @form-panel-border;
     border-radius: @border-radius-large;
     border-radius: @border-radius-large;
@@ -78,15 +107,3 @@
     }
     }
   }
   }
 }
 }
-
-
-.reply-to-thread {
-  .btn {
-    margin: 0px auto;
-    max-width: 300px;
-
-    img {
-      height: 30px;
-    }
-  }
-}

+ 17 - 2
misago/static/misago/js/misago-posting.js

@@ -1,5 +1,6 @@
 // Controller for posting actions
 // Controller for posting actions
 $(function() {
 $(function() {
+
   MisagoPreview = function(_controller, options) {
   MisagoPreview = function(_controller, options) {
 
 
     this.$form = options.form;
     this.$form = options.form;
@@ -146,11 +147,17 @@ $(function() {
           var form_data = _this.$form.serialize() + '&submit=1';
           var form_data = _this.$form.serialize() + '&submit=1';
           $.post(options.api_url, form_data, function(data) {
           $.post(options.api_url, form_data, function(data) {
             _this.$ajax_loader.removeClass('in');
             _this.$ajax_loader.removeClass('in');
-            if (data.thread_url !== undefined) {
+            if (data.post_url !== undefined) {
               _this.posted = true;
               _this.posted = true;
               _this.$ajax_loader.hide();
               _this.$ajax_loader.hide();
               _this.$ajax_complete.addClass('in')
               _this.$ajax_complete.addClass('in')
-              window.location.replace(data.thread_url);
+
+              if (data.post_url.indexOf(window.location.pathname) != -1) {
+                window.location.href = data.post_url;
+                window.location.reload(true)
+              } else {
+                window.location.href = data.post_url;
+              }
             } else if (data.errors !== undefined) {
             } else if (data.errors !== undefined) {
               Misago.Alerts.error(data.errors[0]);
               Misago.Alerts.error(data.errors[0]);
             } else if (data.interrupt !== undefined) {
             } else if (data.interrupt !== undefined) {
@@ -216,6 +223,10 @@ $(function() {
           $('.main-footer').show();
           $('.main-footer').show();
         });
         });
 
 
+        if (this.on_cancel !== undefined) {
+          this.on_cancel();
+        }
+
         this._clear();
         this._clear();
       }
       }
 
 
@@ -223,9 +234,13 @@ $(function() {
 
 
     this.has_content = function() {
     this.has_content = function() {
 
 
+      if (_this.$form !== null) {
         var length = $.trim(_this.$form.find('input[name="title"]').val()).length;
         var length = $.trim(_this.$form.find('input[name="title"]').val()).length;
         length += $.trim(_this.$form.find('textarea').val()).length;
         length += $.trim(_this.$form.find('textarea').val()).length;
         return length > 0;
         return length > 0;
+      } else {
+        return false;
+      }
 
 
     }
     }
 
 

+ 11 - 1
misago/static/misago/js/misago-scrolling.js

@@ -1,5 +1,14 @@
-// Scrolling enhancement for overflow: scroll elements
+// Scrolling behaviour fixes
 $(function() {
 $(function() {
+
+  // we are meddling in window.location, which means we need js fix scrolls to fragments
+  if(window.location.hash) {
+      $(document.body).animate({
+        'scrollTop': $(window.location.hash).offset().top
+      }, 500);
+  }
+
+  // scrolling enhancement for overflow: scroll elements
   function handle_scroll($element, e) {
   function handle_scroll($element, e) {
     var scroll = $element.scrollTop();
     var scroll = $element.scrollTop();
 
 
@@ -26,4 +35,5 @@ $(function() {
   }
   }
 
 
   Misago.DOM.on_change(add_scroll_handlers);
   Misago.DOM.on_change(add_scroll_handlers);
+
 });
 });

+ 12 - 1
misago/static/misago/js/misago-yesnoswitch.js

@@ -4,6 +4,8 @@ function enableYesNoSwitch(selector) {
     var name = $control.find('input').first().attr('name');
     var name = $control.find('input').first().attr('name');
     var value = $control.find("input:checked").val() * 1;
     var value = $control.find("input:checked").val() * 1;
 
 
+    var is_labeled = !$control.hasClass('not-labeled');
+
     // hide original switch options
     // hide original switch options
     $control.find('ul, label').addClass('hidden-original-switch');
     $control.find('ul, label').addClass('hidden-original-switch');
 
 
@@ -11,7 +13,14 @@ function enableYesNoSwitch(selector) {
     var no_label = $.trim($control.find('label').last().text());
     var no_label = $.trim($control.find('label').last().text());
 
 
     var toggle_off = "fa fa-toggle-off fa-2x";
     var toggle_off = "fa fa-toggle-off fa-2x";
+    if ($control.data('toggle-off') !== undefined) {
+      toggle_off = $control.data('toggle-off');
+    }
+
     var toggle_on = "fa fa-toggle-on fa-2x";
     var toggle_on = "fa fa-toggle-on fa-2x";
+    if ($control.data('toggle-on') !== undefined) {
+      toggle_on = $control.data('toggle-on');
+    }
 
 
     // Render new switch
     // Render new switch
     var $new_switch = $('<label class="yes-no-switch"></label>');
     var $new_switch = $('<label class="yes-no-switch"></label>');
@@ -20,7 +29,9 @@ function enableYesNoSwitch(selector) {
 
 
     $control.prepend($new_switch);
     $control.prepend($new_switch);
     $new_switch.append($icon);
     $new_switch.append($icon);
-    $new_switch.append($label);
+    if (is_labeled) {
+      $new_switch.append($label);
+    }
 
 
     if (value) {
     if (value) {
       $new_switch.addClass('active');
       $new_switch.addClass('active');

+ 12 - 30
misago/templates/misago/posting/formset.html

@@ -6,37 +6,19 @@
       <div class="container">
       <div class="container">
         {% csrf_token %}
         {% csrf_token %}
 
 
-        {% comment "Disabled" %}
-        <div class="row">
-          {% if supporting_forms %}
-          <div class="col-md-9 form-main">
-          {% else %}
-          <div class="col-md-12 form-main">
-          {% endif %}
-        {% endcomment %}
-
-          <div class="form-main">
-            {% for form in main_forms %}
+        <ul class="list-unstyled lefthand">
+          {% for form in supporting_forms.lefthand %}
+          <li>
             {% include form.template %}
             {% include form.template %}
-            {% endfor %}
-          </div>
-
-          {% comment "Disabled" %}
-          {% if supporting_forms %}
-          <div class="col-md-3 form-side">
-
-            <h3>{% trans "Thread options:" %}</h3>
-
-            {% for form in supporting_forms %}
-            <div class="supporting-form">
-              {% include form.template %}
-            </div>
-            {% endfor %}
-
-          </div>
-          {% endif %}
-        </div><!-- /.row -->
-        {% endcomment %}
+          </li>
+          {% endfor %}
+        </ul>
+
+        <div class="form-main">
+          {% for form in main_forms %}
+          {% include form.template %}
+          {% endfor %}
+        </div>
 
 
       </div>
       </div>
 
 

+ 15 - 1
misago/templates/misago/posting/replyform.html

@@ -2,7 +2,21 @@
 {% include 'misago/form_errors.html' %}
 {% include 'misago/form_errors.html' %}
 
 
 {% if form.title %}
 {% if form.title %}
-<input class="textinput textInput form-control input-lg" id="{{ form.title.auto_id }}" name="title" type="text" {% if form.title.value %}value="{{ form.title.value }}"{% endif %} placeholder="{% trans "Thread title..." %}"/>
+<div class="thread-title">
+  <div class="row">
+    <div class="col-md-{{ supporting_forms.after_title|yesno:"9,12" }}">
+      <input class="textinput textInput form-control title-input" id="{{ form.title.auto_id }}" name="title" type="text" {% if form.title.value %}value="{{ form.title.value }}"{% endif %} placeholder="{% trans "Thread title..." %}"/>
+    </div>
+
+    {% if supporting_forms.after_title %}
+    <div class="col-md-3">
+      {% for form in supporting_forms.after_title %}
+        {% include form.template %}
+      {% endfor %}
+    </div>
+    {% endif %}
+  </div>
+</div>
 {% endif %}
 {% endif %}
 
 
 <div class="row">
 <div class="row">

+ 2 - 2
misago/templates/misago/posting/threadcloseform.html

@@ -1,4 +1,4 @@
-{% load misago_forms %}
-<div class="controls control-radioselect">
+{% load i18n misago_forms %}
+<div class="controls control-radioselect not-labeled tooltip-right" title="{% trans "Close thread" %}" data-toggle-on="fa fa-lock fa-lg" data-toggle-off="fa fa-unlock fa-lg">
   {% form_input form.is_closed %}
   {% form_input form.is_closed %}
 </div>
 </div>

+ 2 - 2
misago/templates/misago/posting/threadpinform.html

@@ -1,4 +1,4 @@
-{% load misago_forms %}
-<div class="controls control-radioselect">
+{% load i18n misago_forms %}
+<div class="controls control-radioselect not-labeled tooltip-right" title="{% trans "Pin thread" %}" data-toggle-on="fa fa-star fa-lg" data-toggle-off="fa fa-star-o fa-lg">
   {% form_input form.is_pinned %}
   {% form_input form.is_pinned %}
 </div>
 </div>

+ 5 - 5
misago/templates/misago/thread/replies.html

@@ -80,16 +80,16 @@
 
 
     </div>
     </div>
 
 
-    <div class="reply-to-thread">
+    <div class="reply-to-thread text-center">
 
 
       {% if thread_reply_message %}
       {% if thread_reply_message %}
-      <p class="text-center lead">
+      <p class="lead">
         <span class="fa fa-ban fa-fw fa-lg"></span>
         <span class="fa fa-ban fa-fw fa-lg"></span>
         {{ thread_reply_message }}
         {{ thread_reply_message }}
       </p>
       </p>
       {% else %}
       {% else %}
-      <button type="button" class="btn btn-success btn-block btn-lg">
-        <img class="img-rounded" src="{{ user|avatar:100 }}" alt="{% trans "Your avatar" %}">
+      <button type="button" class="btn btn-success btn-lg">
+        <span class="fa fa-plus-circle fa-fw fa-lg"></span>
         {% trans "Reply thread" %}
         {% trans "Reply thread" %}
       </button>
       </button>
       {% endif %}
       {% endif %}
@@ -120,7 +120,7 @@
             $('.reply-to-thread').hide();
             $('.reply-to-thread').hide();
           },
           },
           on_cancel: function() {
           on_cancel: function() {
-            $('.reply-to-thread').fadeIn();
+            $('.reply-to-thread').show();
           }
           }
         });
         });
       });
       });

+ 3 - 3
misago/threads/forms/posting.py

@@ -87,7 +87,7 @@ class ThreadForm(ReplyForm):
 
 
 class ThreadLabelFormBase(forms.Form):
 class ThreadLabelFormBase(forms.Form):
     is_supporting = True
     is_supporting = True
-    legend = _("Label")
+    location = 'after_title'
     template = "misago/posting/threadlabelform.html"
     template = "misago/posting/threadlabelform.html"
 
 
 
 
@@ -111,7 +111,7 @@ def ThreadLabelForm(*args, **kwargs):
 
 
 class ThreadPinForm(forms.Form):
 class ThreadPinForm(forms.Form):
     is_supporting = True
     is_supporting = True
-    legend = _("Pin thread")
+    location = 'lefthand'
     template = "misago/posting/threadpinform.html"
     template = "misago/posting/threadpinform.html"
 
 
     is_pinned = forms.YesNoSwitch(
     is_pinned = forms.YesNoSwitch(
@@ -122,7 +122,7 @@ class ThreadPinForm(forms.Form):
 
 
 class ThreadCloseForm(forms.Form):
 class ThreadCloseForm(forms.Form):
     is_supporting = True
     is_supporting = True
-    legend = _("Close thread")
+    location = 'lefthand'
     template = "misago/posting/threadcloseform.html"
     template = "misago/posting/threadcloseform.html"
 
 
     is_closed = forms.YesNoSwitch(
     is_closed = forms.YesNoSwitch(

+ 3 - 0
misago/threads/models/label.py

@@ -41,6 +41,9 @@ class Label(models.Model):
 
 
     objects = LabelManager()
     objects = LabelManager()
 
 
+    def __unicode__(self):
+        return self.name
+
     def save(self, *args, **kwargs):
     def save(self, *args, **kwargs):
         if self.pk:
         if self.pk:
             self.strip_inavailable_labels()
             self.strip_inavailable_labels()

+ 3 - 3
misago/threads/posting/__init__.py

@@ -106,11 +106,11 @@ class EditorFormset(object):
 
 
     def get_supporting_forms(self):
     def get_supporting_forms(self):
         """return list of supporting forms"""
         """return list of supporting forms"""
-        supporting_forms = []
+        supporting_forms = {}
         for form in self.get_forms_list():
         for form in self.get_forms_list():
             try:
             try:
-                if form.is_supporting and form.legend:
-                    supporting_forms.append(form)
+                if form.is_supporting:
+                    supporting_forms.setdefault(form.location, []).append(form)
             except AttributeError:
             except AttributeError:
                 pass
                 pass
         return supporting_forms
         return supporting_forms

+ 1 - 1
misago/threads/posting/threadclose.py

@@ -1,5 +1,5 @@
 from misago.threads.forms.posting import ThreadCloseForm
 from misago.threads.forms.posting import ThreadCloseForm
-from misago.threads.posting import PostingMiddleware
+from misago.threads.posting import PostingMiddleware, START
 
 
 
 
 class ThreadCloseFormMiddleware(PostingMiddleware):
 class ThreadCloseFormMiddleware(PostingMiddleware):

+ 2 - 2
misago/threads/posting/threadlabel.py

@@ -1,12 +1,12 @@
 from misago.threads.forms.posting import ThreadLabelForm
 from misago.threads.forms.posting import ThreadLabelForm
-from misago.threads.posting import PostingMiddleware
+from misago.threads.posting import PostingMiddleware, START
 
 
 
 
 class ThreadLabelFormMiddleware(PostingMiddleware):
 class ThreadLabelFormMiddleware(PostingMiddleware):
     def use_this_middleware(self):
     def use_this_middleware(self):
         if self.forum.acl['can_change_threads_labels'] and self.forum.labels:
         if self.forum.acl['can_change_threads_labels'] and self.forum.labels:
             self.thread_label_id = self.thread.label_id
             self.thread_label_id = self.thread.label_id
-            return True
+            return self.mode == START
         else:
         else:
             return False
             return False
 
 

+ 11 - 2
misago/threads/views/generic/posting.py

@@ -9,6 +9,7 @@ from django.views.generic import View
 from misago.core.exceptions import AjaxError
 from misago.core.exceptions import AjaxError
 from misago.forums.lists import get_forum_path
 from misago.forums.lists import get_forum_path
 
 
+from misago.threads import goto
 from misago.threads.posting import (PostingInterrupt, EditorFormset,
 from misago.threads.posting import (PostingInterrupt, EditorFormset,
                                     START, REPLY, EDIT)
                                     START, REPLY, EDIT)
 from misago.threads.models import Thread, Post, Label
 from misago.threads.models import Thread, Post, Label
@@ -103,9 +104,17 @@ class EditorView(ViewBase):
                 if formset.is_valid():
                 if formset.is_valid():
                     try:
                     try:
                         formset.save()
                         formset.save()
-                        messages.success(request, _("New thread was posted."))
+
+                        if mode == START:
+                            message = _("New thread was posted.")
+                        if mode == REPLY:
+                            message = _("Your reply was posted.")
+                        if mode == EDIT:
+                            message = _("Message was edited.")
+                        messages.success(request, message)
+
                         return JsonResponse({
                         return JsonResponse({
-                            'thread_url': thread.get_absolute_url()
+                            'post_url': goto.post(request.user, thread, post)
                         })
                         })
                     except PostingInterrupt as e:
                     except PostingInterrupt as e:
                         return JsonResponse({'interrupt': e.message})
                         return JsonResponse({'interrupt': e.message})