Browse Source

Admin sign out

Rafał Pitoń 11 years ago
parent
commit
7846354fbd

+ 5 - 2
misago/admin/auth.py

@@ -1,8 +1,8 @@
 from hashlib import md5
 from time import time
 from django.conf import settings
-from django.contrib import auth as dj_auth
-
+from django.contrib import auth as dj_auth, messages
+from django.utils.translation import ugettext as _
 
 KEY_TOKEN = 'misago_admin_session_token'
 KEY_UPDATED = 'misago_admin_session_updated'
@@ -27,6 +27,9 @@ def is_admin_session(request):
 
     updated = request.session.get(KEY_UPDATED, 0)
     if updated < time() - (settings.MISAGO_ADMIN_SESSION_EXPIRATION * 60):
+        if updated:
+            request.session.pop(KEY_UPDATED, None)
+            messages.info(request, _("Your admin session has expired."))
         return False
 
     return True

+ 1 - 0
misago/admin/urls.py

@@ -7,6 +7,7 @@ urlpatterns = patterns('misago.admin.views',
     # any request with path that falls below this one is assumed to be directed
     # at Misago Admin and will be checked by Misago Admin Middleware
     url(r'^$', 'index.admin_index', name='index'),
+    url(r'^logout/$', 'auth.logout', name='logout'),
     url(r'^settings/$', 'index.admin_index', name='settings'),
 )
 

+ 16 - 1
misago/admin/views/__init__.py

@@ -14,8 +14,23 @@ def get_admin_namespace(requested_namespace):
 def render(request, template, context=None):
     context = context or {}
 
+    navigation = site.visible_branches(request)
+    sections = navigation[0]
+
+    try:
+        actions = navigation[1]
+    except IndexError:
+        actions = []
+
+    try:
+        pages = navigation[2]
+    except IndexError:
+        pages = []
+
     context.update({
-            'navigation': site.visible_branches(request),
+            'sections': sections,
+            'actions': actions,
+            'pages': pages
         })
 
     return dj_render(request, template, context)

+ 12 - 0
misago/admin/views/auth.py

@@ -30,3 +30,15 @@ def login(request):
 
     return render(request, 'misago/admin/login.html',
                   {'form': form, 'target': target})
+
+
+@csrf_protect
+@never_cache
+def logout(request):
+    if request.method == 'POST':
+        auth.close_admin_session(request)
+        messages.info(request,
+                      _("Your admin session has been closed."))
+        return redirect('misago:index')
+    else:
+        return redirect('misago:admin:index')

+ 1 - 0
misago/static/misago/admin/css/misago/buttons.less

@@ -21,6 +21,7 @@
     background: darken(@btn-bg, 15%);
     border-color: darken(@btn-bg, 15%);
     box-shadow: none;
+    outline: none;
     position: relative;
     top: 2px;
 

+ 15 - 33
misago/static/misago/admin/css/misago/header.less

@@ -14,43 +14,25 @@
   h1 {
   	margin: 0px;
   	padding: 0px;
+  	overflow: auto;
 
   	font-size: @font-size-large * 1.5;
-  }
-}
 
+  	.main, .sub {
+  		float: left;
+  	}
 
-// Actions
-//
-//##
-.page-header {
-  &>.container {
-    .page-actions {
-      float: right;
-      margin-top: (@line-height-computed * @headings-line-height) * -1 - (@line-height-computed * 1.5) + @padding-base-vertical - 1;
-
-      .dropdown-menu {
-        left: auto;
-        right: 0px;
-
-        &:after {
-          left: auto;
-          right: 12px;
-        }
-      }
-    }
-  }
-}
+  	.main {
+  		a {
+  			color: @text-color;
+  		}
+  	}
 
-/* Small displays */
-@media (max-width: @screen-sm-min) {
-  .page-header {
-    &>.container {
-      .page-actions {
-        clear: both;
-        float: none;
-        margin-top: @line-height-computed;
-      }
-    }
+  	.sub {
+  		margin-left: @line-height-computed / 2;
+
+  		color: lighten(@text-color, 25%);
+  	}
   }
 }
+

+ 8 - 34
misago/static/misago/admin/css/misago/login.less

@@ -3,31 +3,15 @@
 // --------------------------------------------------
 
 .login-form {
-  display: table;
-  width: 100%;
-  height: 100%;
-  min-height: 100%;
-
-  .site-wrapper-inner {
-    display: table-cell;
-    vertical-align: top;
-  }
-
-  .cover-container {
-    margin-right: auto;
-    margin-left: auto;
-  }
-
-  .inner {
-    padding: 30px;
-  }
+  padding: @line-height-computed;
 
   .form-admin-logo {
+    margin-bottom: @line-height-computed;
+
     text-align: center;
 
     img {
-      max-width: 90%;
-      margin-bottom: @line-height-computed;
+      width: 60%;
     }
   }
 
@@ -53,21 +37,11 @@
 /* Big displays */
 @media (min-width: 768px) {
   .login-form {
-    .site-wrapper-inner {
-      vertical-align: middle;
-
-      .cover-container {
-        width: 100%;
-
-        .inner {
-          max-width: 420px;
-          margin: 0px auto;
+    max-width: 420px;
+    margin: (@line-height-computed * 1.5) auto;
 
-          .form-panel {
-            margin: 0px;
-          }
-        }
-      }
+    .form-panel {
+      margin: 0px;
     }
   }
 }

+ 27 - 0
misago/static/misago/admin/css/misago/logout.less

@@ -0,0 +1,27 @@
+//
+// Admin Logout Modal
+// --------------------------------------------------
+
+#logout-modal {
+  .modal-body {
+    padding-top: @line-height-computed;
+    padding-bottom: @line-height-computed;
+
+    .btn {
+      padding: @line-height-computed (@line-height-computed / 3);
+
+      span {
+        display: block;
+        margin-bottom: @line-height-computed / 2;
+
+        font-size: @font-size-large * 2.6;
+      }
+
+      font-size: @font-size-large;
+    }
+  }
+
+  .modal-footer {
+    margin-top: 0px;
+  }
+}

+ 1 - 0
misago/static/misago/admin/css/misago/misago.less

@@ -17,3 +17,4 @@ html, body {
 @import "errorpages.less";
 @import "forms.less";
 @import "login.less";
+@import "logout.less";

+ 26 - 5
misago/static/misago/admin/css/misago/navbar.less

@@ -1,5 +1,5 @@
 //
-// Forum Navbar
+// Admin Navbar
 // --------------------------------------------------
 
 .navbars-container {
@@ -11,14 +11,34 @@
 
     .navbar-brand {
       background: url('../img/mred.png');
-      background-color: #fff;
       background-size: cover;
       background-repeat: no-repeat;
-      border-radius: 3px;
+      border-radius: 4px;
       width: @navbar-height - 12;
       height: @navbar-height - 12;
       margin-top: 6px;
     }
+
+    .fa, .glyphicon {
+      position: relative;
+      bottom: (@font-size-base - @font-size-large) / 2;
+
+      font-size: @font-size-large;
+    }
+
+    .user-nav {
+      .navbar-text {
+        color: darken(#fff, 10%);
+      }
+
+      img {
+        border-radius: @border-radius-base;
+        height: 26px;
+        margin: -6px 0px;
+        position: relative;
+        bottom: 1px;
+      }
+    }
   }
 }
 
@@ -27,8 +47,9 @@
 @media (min-width: @screen-sm-min) {
   .navbars-container {
     .navbar-brand {
-      margin-left: @line-height-computed / 2;
-      margin-right: @line-height-computed / 2;
+      position: relative;
+      left: @line-height-computed;
+      margin-right: @line-height-computed * 1.5;
     }
 
     /* Bolden active links */

+ 57 - 47
misago/static/misago/admin/css/style.css

@@ -5904,6 +5904,7 @@ body {
   background: #c7c7c7;
   border-color: #c7c7c7;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #5e5e5e;
@@ -5931,6 +5932,7 @@ body {
   background: #1d6fa5;
   border-color: #1d6fa5;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -5958,6 +5960,7 @@ body {
   background: #28a1c5;
   border-color: #28a1c5;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -5985,6 +5988,7 @@ body {
   background: #208e4e;
   border-color: #208e4e;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -6012,6 +6016,7 @@ body {
   background: #df8a13;
   border-color: #df8a13;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -6039,6 +6044,7 @@ body {
   background: #bf2718;
   border-color: #bf2718;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -6164,14 +6170,29 @@ body {
 }
 .navbars-container .navbar .navbar-brand {
   background: url('../img/mred.png');
-  background-color: #fff;
   background-size: cover;
   background-repeat: no-repeat;
-  border-radius: 3px;
+  border-radius: 4px;
   width: 38px;
   height: 38px;
   margin-top: 6px;
 }
+.navbars-container .navbar .fa,
+.navbars-container .navbar .glyphicon {
+  position: relative;
+  bottom: -2px;
+  font-size: 18px;
+}
+.navbars-container .navbar .user-nav .navbar-text {
+  color: #e6e6e6;
+}
+.navbars-container .navbar .user-nav img {
+  border-radius: 4px;
+  height: 26px;
+  margin: -6px 0px;
+  position: relative;
+  bottom: 1px;
+}
 /* Big displays */
 @media (min-width: 768px) {
   .navbars-container {
@@ -6179,8 +6200,9 @@ body {
     /* Put fancy blue bar under active link */
   }
   .navbars-container .navbar-brand {
-    margin-left: 10px;
-    margin-right: 10px;
+    position: relative;
+    left: 20px;
+    margin-right: 30px;
   }
   .navbars-container .navbar li.active a {
     font-weight: bold;
@@ -6208,27 +6230,19 @@ body {
 .page-header h1 {
   margin: 0px;
   padding: 0px;
+  overflow: auto;
   font-size: 27px;
 }
-.page-header > .container .page-actions {
-  float: right;
-  margin-top: -47px;
-}
-.page-header > .container .page-actions .dropdown-menu {
-  left: auto;
-  right: 0px;
+.page-header h1 .main,
+.page-header h1 .sub {
+  float: left;
 }
-.page-header > .container .page-actions .dropdown-menu:after {
-  left: auto;
-  right: 12px;
+.page-header h1 .main a {
+  color: #444444;
 }
-/* Small displays */
-@media (max-width: 768px) {
-  .page-header > .container .page-actions {
-    clear: both;
-    float: none;
-    margin-top: 20px;
-  }
+.page-header h1 .sub {
+  margin-left: 10px;
+  color: #848484;
 }
 .main-footer {
   margin-top: 30px;
@@ -6417,28 +6431,14 @@ body {
   }
 }
 .login-form {
-  display: table;
-  width: 100%;
-  height: 100%;
-  min-height: 100%;
-}
-.login-form .site-wrapper-inner {
-  display: table-cell;
-  vertical-align: top;
-}
-.login-form .cover-container {
-  margin-right: auto;
-  margin-left: auto;
-}
-.login-form .inner {
-  padding: 30px;
+  padding: 20px;
 }
 .login-form .form-admin-logo {
+  margin-bottom: 20px;
   text-align: center;
 }
 .login-form .form-admin-logo img {
-  max-width: 90%;
-  margin-bottom: 20px;
+  width: 60%;
 }
 .login-form .form-panel {
   background: #f7f7f7;
@@ -6456,17 +6456,27 @@ body {
 }
 /* Big displays */
 @media (min-width: 768px) {
-  .login-form .site-wrapper-inner {
-    vertical-align: middle;
-  }
-  .login-form .site-wrapper-inner .cover-container {
-    width: 100%;
-  }
-  .login-form .site-wrapper-inner .cover-container .inner {
+  .login-form {
     max-width: 420px;
-    margin: 0px auto;
+    margin: 30px auto;
   }
-  .login-form .site-wrapper-inner .cover-container .inner .form-panel {
+  .login-form .form-panel {
     margin: 0px;
   }
 }
+#logout-modal .modal-body {
+  padding-top: 20px;
+  padding-bottom: 20px;
+}
+#logout-modal .modal-body .btn {
+  padding: 20px 6.66666667px;
+  font-size: 18px;
+}
+#logout-modal .modal-body .btn span {
+  display: block;
+  margin-bottom: 10px;
+  font-size: 46.8px;
+}
+#logout-modal .modal-footer {
+  margin-top: 0px;
+}

+ 1 - 0
misago/static/misago/css/misago/buttons.less

@@ -21,6 +21,7 @@
     background: darken(@btn-bg, 15%);
     border-color: darken(@btn-bg, 15%);
     box-shadow: none;
+    outline: none;
     position: relative;
     top: 2px;
 

+ 3 - 0
misago/templates/misago/admin/base.html

@@ -3,6 +3,7 @@
 
 
 {% block body %}
+{% include "misago/admin/navbar.html" %}
 <h1>Nodes:</h1>
 {% for level in navigation %}
 <hr>
@@ -22,6 +23,8 @@
 
 {% block content %}{% endblock %}
 
+{% include "misago/admin/logout.html" %}
+
 {# We include JavaScript at the end of page body so it loads faster #}
 {% compressed_js 'misago' %}
 {% block extra_scripts %}{% endblock %}

+ 2 - 0
misago/templates/misago/admin/base_thin.html

@@ -20,6 +20,8 @@
   </head>
   <body>
 
+    {% include "misago/admin/messages.html" %}
+
     {% block body %}{% endblock %}
 
   </body>

+ 43 - 56
misago/templates/misago/admin/login.html

@@ -6,71 +6,58 @@
 
 
 {% block body %}
-<div class="login-form site-wrapper">
-  <div class="site-wrapper-inner">
-    <div class="cover-container">
-      <div class="inner cover">
+<div class="login-form">
 
-        {% if target == "misago" %}
-        <div class="form-admin-logo">
-          <img src="{% static 'misago/admin/img/misago.png' %}" alt="Misago">
-        </div>
-        {% elif target == "django" %}
-        <div class="form-admin-logo">
-          <img src="{% static 'misago/admin/img/django.png' %}" alt="Django">
-        </div>
-        {% endif  %}
-
-        <div class="form-panel">
-          <form method="POST" role="form">
-            {% csrf_token %}
-
-            <div class="form-header">
-              <h1>{% trans "Administration" %}</h1>
-            </div>
-
-            <div class="form-body no-fieldsets">
+  {% if target == "misago" %}
+  <div class="form-admin-logo">
+    <img src="{% static 'misago/admin/img/misago.png' %}" alt="Misago">
+  </div>
+  {% elif target == "django" %}
+  <div class="form-admin-logo">
+    <img src="{% static 'misago/admin/img/django.png' %}" alt="Django">
+  </div>
+  {% endif  %}
 
-              {% for error in form.non_field_errors %}
-              <div class="misago-alerts">
-                <p class="alert alert-danger lead">
-                  {{ error }}
-                  <br>{% trans "Please try again." %}
-                </p>
-              </div>
-              {% endfor %}
+  <div class="form-panel">
+    <form method="POST" role="form">
+      {% csrf_token %}
 
-              <div class="form-group">
-                <div class="control-input">
-                  <input type="text" name="username" class="form-control input-lg" placeholder="{% trans "Username or e-mail" %}" {% if form.username.value %}value="{{ form.username.value }}"{% endif %}>
-                </div>
-              </div>
-              <div class="form-group">
-                <div class="control-input">
-                  <input type="password" name="password" class="form-control input-lg" placeholder="{% trans "Password" %}">
-                </div>
-              </div>
-              <div class="form-group">
-                <div class="control-input">
-                  <button class="btn btn-primary btn-block btn-lg">{% trans "Sign in" %}</button>
-                </div>
-              </div>
+      <div class="form-header">
+        <h1>{% trans "Administration" %}</h1>
+      </div>
 
-            </div>
+      <div class="form-body no-fieldsets">
 
+        {% for error in form.non_field_errors %}
+        <div class="misago-alerts">
+          <p class="alert alert-danger lead">
+            {{ error }}
+            <br>{% trans "Please try again." %}
+          </p>
+        </div>
+        {% endfor %}
 
-          </form>
+        <div class="form-group">
+          <div class="control-input">
+            <input type="text" name="username" class="form-control input-lg" placeholder="{% trans "Username or e-mail" %}" {% if form.username.value %}value="{{ form.username.value }}"{% endif %}>
+          </div>
+        </div>
+        <div class="form-group">
+          <div class="control-input">
+            <input type="password" name="password" class="form-control input-lg" placeholder="{% trans "Password" %}">
+          </div>
+        </div>
+        <div class="form-group">
+          <div class="control-input">
+            <button class="btn btn-primary btn-block btn-lg">{% trans "Sign in" %}</button>
+          </div>
         </div>
 
       </div>
-    </div>
-  </div>
-</div>
 
 
-{% if namespace == "misago:admin" %}
-{% trans "Misago Admin" %}
-{% else %}
-{% trans "Django Admin" %}
-{% endif %}
+    </form>
+  </div>
+
+</div>
 {% endblock body %}

+ 43 - 0
misago/templates/misago/admin/logout.html

@@ -0,0 +1,43 @@
+{% load i18n %}
+<!-- Log out modal -->
+<div class="modal fade" id="logout-modal" tabindex="-1" role="dialog" aria-labelledby="logoutModalLabel" aria-hidden="true">
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+        <h4 class="modal-title" id="logoutModalLabel">{% trans "Log out?" %}</h4>
+      </div>
+      <div class="modal-body">
+
+        <div class="row">
+          <div class="col-md-6">
+
+            <form action="{% url 'misago:admin:logout' %}" method="post">
+              {% csrf_token %}
+              <button type="submit" class="btn btn-primary btn-block">
+                <span class="fa fa-lock"></span>
+                {% trans "Log out from admin" %}
+              </button>
+            </form>
+
+          </div>
+          <div class="col-md-6">
+
+            <form action="{% url 'misago:logout' %}" method="post">
+              {% csrf_token %}
+              <button type="submit" class="btn btn-danger btn-block">
+                <span class="fa fa-power-off"></span>
+                {% trans "Log out completely" %}
+              </button>
+            </form>
+
+          </div>
+        </div>
+
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-default btn-lg btn-block" data-dismiss="modal">{% trans "Cancel" %}</button>
+      </div>
+    </div>
+  </div>
+</div>

+ 25 - 0
misago/templates/misago/admin/messages.html

@@ -0,0 +1,25 @@
+{% load i18n %}
+{% if messages %}
+<div class="misago-alerts alerts-fixed">
+  {% for message in messages %}
+  <div>
+    {% if 'info' in message.tags %}
+    <p class="alert alert-info">
+      <span class="alert-icon fa fa-check-circle"></span>
+    {% elif 'success' in message.tags %}
+    <p class="alert alert-success">
+      <span class="alert-icon fa fa-question-circle"></span>
+    {% elif 'warning' in message.tags %}
+    <p class="alert alert-warning">
+      <span class="alert-icon fa fa-exclamation-triangle"></span>
+    {% elif 'error' in message.tags %}
+    <p class="alert alert-danger">
+      <span class="alert-icon fa fa-times-circle"></span>
+    {% endif %}
+      {{ message }}
+      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">{% trans "Ok!" %}</button>
+    </p>
+  </div>
+  {% endfor %}
+</div>
+{% endif %}

+ 49 - 0
misago/templates/misago/admin/navbar.html

@@ -0,0 +1,49 @@
+{% load i18n misago_avatars %}
+<div class="navbars-container">
+  <div class="navbar navbar-default navbar-static-top" role="navigation">
+    <div class="container">
+      <a class="navbar-brand" href="{% url 'misago:index' %}"></a>
+      <ul class="nav navbar-nav">
+        {% for node in sections %}
+        <li{% if node.is_active %} class="active"{% endif %}>
+          <a href="{{ node.link }}">
+            <span class="{{ node.icon }}"></span>
+            {{ node.name }}
+          </a>
+        </li>
+        {% endfor %}
+      </ul>
+      <div class="user-nav pull-right">
+        <p class="navbar-text">
+          <img src="{{ user|avatar:30 }}" alt="{% trans "Your avatar" %}">
+          {{ user.username }}
+        </p>
+        <ul class="nav navbar-nav">
+          <li>
+          </li>
+          <li>
+            <a href="#" data-toggle="modal" data-target="#logout-modal">
+              <span class="fa fa-power-off"></span>
+            </a>
+          </li>
+        </ul>
+      </div>
+    </div>
+  </div>
+  {% if actions %}
+  <div class="navbar navbar-inverse navbar-static-top" role="navigation">
+    <div class="container">
+      <ul class="nav navbar-nav">
+        {% for node in actions %}
+        <li{% if node.is_active %} class="active"{% endif %}>
+          <a href="{{ node.link }}">
+            <span class="{{ node.icon }}"></span>
+            {{ node.name }}
+          </a>
+        </li>
+        {% endfor %}
+      </ul>
+    </div>
+  </div>
+  {% endif %}
+</div>

+ 42 - 1
uiframework/admin/layout.html

@@ -64,7 +64,7 @@
               <li>
               </li>
               <li>
-                <a href="#">
+                <a href="#" data-toggle="modal" data-target="#logout-modal">
                   <span class="fa fa-power-off"></span>
                 </a>
               </li>
@@ -123,6 +123,47 @@
 
     </div><!-- /.container -->
 
+    <!-- Log out modal -->
+    <div class="modal fade" id="logout-modal" tabindex="-1" role="dialog" aria-labelledby="logoutModalLabel" aria-hidden="true">
+      <div class="modal-dialog">
+        <div class="modal-content">
+          <div class="modal-header">
+            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+            <h4 class="modal-title" id="logoutModalLabel">Log out?</h4>
+          </div>
+          <div class="modal-body">
+
+            <div class="row">
+              <div class="col-md-6">
+
+                <form>
+                  <button type="submit" class="btn btn-primary btn-block">
+                    <span class="fa fa-lock"></span>
+                    Log out from admin
+                  </button>
+                </form>
+
+              </div>
+              <div class="col-md-6">
+
+                <form>
+                  <button type="submit" class="btn btn-danger btn-block">
+                    <span class="fa fa-power-off"></span>
+                    Log out completely
+                  </button>
+                </form>
+
+              </div>
+            </div>
+
+          </div>
+          <div class="modal-footer">
+            <button type="button" class="btn btn-default btn-lg btn-block" data-dismiss="modal">Cancel</button>
+          </div>
+        </div>
+      </div>
+    </div>
+
     <!-- Bootstrap core JavaScript
     ================================================== -->
     <!-- Placed at the end of the document so the pages load faster -->

+ 35 - 41
uiframework/admin/signin.html

@@ -24,54 +24,48 @@
 
   <body>
 
-    <div class="login-form site-wrapper">
-      <div class="site-wrapper-inner">
-        <div class="cover-container">
-          <div class="inner cover">
+    <div class="login-form">
 
-            <div class="form-admin-logo">
-              <img src="../misago/admin/img/misago.png" alt="">
+      <div class="form-admin-logo">
+        <img src="../misago/admin/img/misago.png" alt="">
+      </div>
+
+      <div class="form-panel">
+        <form method="POST" role="form">
+
+          <div class="form-header">
+            <h1>Administration</h1>
+          </div>
+
+          <div class="form-body no-fieldsets">
+
+            <div class="misago-alerts">
+              <p class="alert alert-danger lead">
+                Lorem ipsum dolor met.
+              </p>
             </div>
 
-            <div class="form-panel">
-              <form method="POST" role="form">
-
-                <div class="form-header">
-                  <h1>Administration</h1>
-                </div>
-
-                <div class="form-body no-fieldsets">
-
-                  <div class="misago-alerts">
-                    <p class="alert alert-danger lead">
-                      Lorem ipsum dolor met.
-                    </p>
-                  </div>
-
-                  <div class="form-group">
-                    <div class="control-input">
-                      <input type="text" name="username" class="form-control input-lg" placeholder="Username or e-mail">
-                    </div>
-                  </div>
-                  <div class="form-group">
-                    <div class="control-input">
-                      <input type="password" name="password" class="form-control input-lg" placeholder="Password">
-                    </div>
-                  </div>
-                  <div class="form-group">
-                    <div class="control-input">
-                      <button class="btn btn-primary btn-block btn-lg">Sign in</button>
-                    </div>
-                  </div>
-
-                </div>
-
-              </form>
+            <div class="form-group">
+              <div class="control-input">
+                <input type="text" name="username" class="form-control input-lg" placeholder="Username or e-mail">
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="control-input">
+                <input type="password" name="password" class="form-control input-lg" placeholder="Password">
+              </div>
+            </div>
+            <div class="form-group">
+              <div class="control-input">
+                <button class="btn btn-primary btn-block btn-lg">Sign in</button>
+              </div>
             </div>
 
           </div>
-        </div>
+
+        </form>
       </div>
+
     </div>
 
     <!-- Bootstrap core JavaScript

+ 1 - 0
uiframework/misago/admin/css/misago/buttons.less

@@ -21,6 +21,7 @@
     background: darken(@btn-bg, 15%);
     border-color: darken(@btn-bg, 15%);
     box-shadow: none;
+    outline: none;
     position: relative;
     top: 2px;
 

+ 8 - 34
uiframework/misago/admin/css/misago/login.less

@@ -3,31 +3,15 @@
 // --------------------------------------------------
 
 .login-form {
-  display: table;
-  width: 100%;
-  height: 100%;
-  min-height: 100%;
-
-  .site-wrapper-inner {
-    display: table-cell;
-    vertical-align: top;
-  }
-
-  .cover-container {
-    margin-right: auto;
-    margin-left: auto;
-  }
-
-  .inner {
-    padding: 30px;
-  }
+  padding: @line-height-computed;
 
   .form-admin-logo {
+    margin-bottom: @line-height-computed;
+
     text-align: center;
 
     img {
-      max-width: 90%;
-      margin-bottom: @line-height-computed;
+      width: 60%;
     }
   }
 
@@ -53,21 +37,11 @@
 /* Big displays */
 @media (min-width: 768px) {
   .login-form {
-    .site-wrapper-inner {
-      vertical-align: middle;
-
-      .cover-container {
-        width: 100%;
-
-        .inner {
-          max-width: 420px;
-          margin: 0px auto;
+    max-width: 420px;
+    margin: (@line-height-computed * 1.5) auto;
 
-          .form-panel {
-            margin: 0px;
-          }
-        }
-      }
+    .form-panel {
+      margin: 0px;
     }
   }
 }

+ 27 - 0
uiframework/misago/admin/css/misago/logout.less

@@ -0,0 +1,27 @@
+//
+// Admin Logout Modal
+// --------------------------------------------------
+
+#logout-modal {
+  .modal-body {
+    padding-top: @line-height-computed;
+    padding-bottom: @line-height-computed;
+
+    .btn {
+      padding: @line-height-computed (@line-height-computed / 3);
+
+      span {
+        display: block;
+        margin-bottom: @line-height-computed / 2;
+
+        font-size: @font-size-large * 2.6;
+      }
+
+      font-size: @font-size-large;
+    }
+  }
+
+  .modal-footer {
+    margin-top: 0px;
+  }
+}

+ 1 - 0
uiframework/misago/admin/css/misago/misago.less

@@ -17,3 +17,4 @@ html, body {
 @import "errorpages.less";
 @import "forms.less";
 @import "login.less";
+@import "logout.less";

+ 28 - 26
uiframework/misago/admin/css/style.css

@@ -5904,6 +5904,7 @@ body {
   background: #c7c7c7;
   border-color: #c7c7c7;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #5e5e5e;
@@ -5931,6 +5932,7 @@ body {
   background: #1d6fa5;
   border-color: #1d6fa5;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -5958,6 +5960,7 @@ body {
   background: #28a1c5;
   border-color: #28a1c5;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -5985,6 +5988,7 @@ body {
   background: #208e4e;
   border-color: #208e4e;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -6012,6 +6016,7 @@ body {
   background: #df8a13;
   border-color: #df8a13;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -6039,6 +6044,7 @@ body {
   background: #bf2718;
   border-color: #bf2718;
   box-shadow: none;
+  outline: none;
   position: relative;
   top: 2px;
   color: #e6e6e6;
@@ -6425,28 +6431,14 @@ body {
   }
 }
 .login-form {
-  display: table;
-  width: 100%;
-  height: 100%;
-  min-height: 100%;
-}
-.login-form .site-wrapper-inner {
-  display: table-cell;
-  vertical-align: top;
-}
-.login-form .cover-container {
-  margin-right: auto;
-  margin-left: auto;
-}
-.login-form .inner {
-  padding: 30px;
+  padding: 20px;
 }
 .login-form .form-admin-logo {
+  margin-bottom: 20px;
   text-align: center;
 }
 .login-form .form-admin-logo img {
-  max-width: 90%;
-  margin-bottom: 20px;
+  width: 60%;
 }
 .login-form .form-panel {
   background: #f7f7f7;
@@ -6464,17 +6456,27 @@ body {
 }
 /* Big displays */
 @media (min-width: 768px) {
-  .login-form .site-wrapper-inner {
-    vertical-align: middle;
-  }
-  .login-form .site-wrapper-inner .cover-container {
-    width: 100%;
-  }
-  .login-form .site-wrapper-inner .cover-container .inner {
+  .login-form {
     max-width: 420px;
-    margin: 0px auto;
+    margin: 30px auto;
   }
-  .login-form .site-wrapper-inner .cover-container .inner .form-panel {
+  .login-form .form-panel {
     margin: 0px;
   }
 }
+#logout-modal .modal-body {
+  padding-top: 20px;
+  padding-bottom: 20px;
+}
+#logout-modal .modal-body .btn {
+  padding: 20px 6.66666667px;
+  font-size: 18px;
+}
+#logout-modal .modal-body .btn span {
+  display: block;
+  margin-bottom: 10px;
+  font-size: 46.8px;
+}
+#logout-modal .modal-footer {
+  margin-top: 0px;
+}

+ 1 - 0
uiframework/misago/css/misago/buttons.less

@@ -21,6 +21,7 @@
     background: darken(@btn-bg, 15%);
     border-color: darken(@btn-bg, 15%);
     box-shadow: none;
+    outline: none;
     position: relative;
     top: 2px;