Rafał Pitoń 10 лет назад
Родитель
Сommit
3cb9e8d7cf

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

@@ -23,6 +23,35 @@
     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 {
     border: 2px dashed @form-panel-border;
     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
 $(function() {
+
   MisagoPreview = function(_controller, options) {
 
     this.$form = options.form;
@@ -146,11 +147,17 @@ $(function() {
           var form_data = _this.$form.serialize() + '&submit=1';
           $.post(options.api_url, form_data, function(data) {
             _this.$ajax_loader.removeClass('in');
-            if (data.thread_url !== undefined) {
+            if (data.post_url !== undefined) {
               _this.posted = true;
               _this.$ajax_loader.hide();
               _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) {
               Misago.Alerts.error(data.errors[0]);
             } else if (data.interrupt !== undefined) {
@@ -216,6 +223,10 @@ $(function() {
           $('.main-footer').show();
         });
 
+        if (this.on_cancel !== undefined) {
+          this.on_cancel();
+        }
+
         this._clear();
       }
 
@@ -223,9 +234,13 @@ $(function() {
 
     this.has_content = function() {
 
+      if (_this.$form !== null) {
         var length = $.trim(_this.$form.find('input[name="title"]').val()).length;
         length += $.trim(_this.$form.find('textarea').val()).length;
         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() {
+
+  // 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) {
     var scroll = $element.scrollTop();
 
@@ -26,4 +35,5 @@ $(function() {
   }
 
   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 value = $control.find("input:checked").val() * 1;
 
+    var is_labeled = !$control.hasClass('not-labeled');
+
     // hide original switch options
     $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 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";
+    if ($control.data('toggle-on') !== undefined) {
+      toggle_on = $control.data('toggle-on');
+    }
 
     // Render new switch
     var $new_switch = $('<label class="yes-no-switch"></label>');
@@ -20,7 +29,9 @@ function enableYesNoSwitch(selector) {
 
     $control.prepend($new_switch);
     $new_switch.append($icon);
-    $new_switch.append($label);
+    if (is_labeled) {
+      $new_switch.append($label);
+    }
 
     if (value) {
       $new_switch.addClass('active');

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

@@ -6,37 +6,19 @@
       <div class="container">
         {% 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 %}
-            {% 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>
 

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

@@ -2,7 +2,21 @@
 {% include 'misago/form_errors.html' %}
 
 {% 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 %}
 
 <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 %}
 </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 %}
 </div>

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

@@ -80,16 +80,16 @@
 
     </div>
 
-    <div class="reply-to-thread">
+    <div class="reply-to-thread text-center">
 
       {% if thread_reply_message %}
-      <p class="text-center lead">
+      <p class="lead">
         <span class="fa fa-ban fa-fw fa-lg"></span>
         {{ thread_reply_message }}
       </p>
       {% 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" %}
       </button>
       {% endif %}
@@ -120,7 +120,7 @@
             $('.reply-to-thread').hide();
           },
           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):
     is_supporting = True
-    legend = _("Label")
+    location = 'after_title'
     template = "misago/posting/threadlabelform.html"
 
 
@@ -111,7 +111,7 @@ def ThreadLabelForm(*args, **kwargs):
 
 class ThreadPinForm(forms.Form):
     is_supporting = True
-    legend = _("Pin thread")
+    location = 'lefthand'
     template = "misago/posting/threadpinform.html"
 
     is_pinned = forms.YesNoSwitch(
@@ -122,7 +122,7 @@ class ThreadPinForm(forms.Form):
 
 class ThreadCloseForm(forms.Form):
     is_supporting = True
-    legend = _("Close thread")
+    location = 'lefthand'
     template = "misago/posting/threadcloseform.html"
 
     is_closed = forms.YesNoSwitch(

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

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

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

@@ -106,11 +106,11 @@ class EditorFormset(object):
 
     def get_supporting_forms(self):
         """return list of supporting forms"""
-        supporting_forms = []
+        supporting_forms = {}
         for form in self.get_forms_list():
             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:
                 pass
         return supporting_forms

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

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

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

@@ -1,12 +1,12 @@
 from misago.threads.forms.posting import ThreadLabelForm
-from misago.threads.posting import PostingMiddleware
+from misago.threads.posting import PostingMiddleware, START
 
 
 class ThreadLabelFormMiddleware(PostingMiddleware):
     def use_this_middleware(self):
         if self.forum.acl['can_change_threads_labels'] and self.forum.labels:
             self.thread_label_id = self.thread.label_id
-            return True
+            return self.mode == START
         else:
             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.forums.lists import get_forum_path
 
+from misago.threads import goto
 from misago.threads.posting import (PostingInterrupt, EditorFormset,
                                     START, REPLY, EDIT)
 from misago.threads.models import Thread, Post, Label
@@ -103,9 +104,17 @@ class EditorView(ViewBase):
                 if formset.is_valid():
                     try:
                         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({
-                            'thread_url': thread.get_absolute_url()
+                            'post_url': goto.post(request.user, thread, post)
                         })
                     except PostingInterrupt as e:
                         return JsonResponse({'interrupt': e.message})