| 1 | {% extends "admin/base.html" %}
|
|---|
| 2 |
|
|---|
| 3 | {% comment %}
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 | This file contains a handful of unrelated admin customizations that
|
|---|
| 7 | mostly get applied globally to different parts of the admin.
|
|---|
| 8 |
|
|---|
| 9 | In the ``extrahead`` block:
|
|---|
| 10 |
|
|---|
| 11 | * CSS for the login form
|
|---|
| 12 | * Javascript for the login form to add the ``interface`` radio buttons
|
|---|
| 13 | * Global CSS fixes (when logged in)
|
|---|
| 14 | * Javascript for injecting Mezzanine's menu into the top of every page
|
|---|
| 15 | * Javascript for fixing inlines to work with Mezzanine's dynamic inlines
|
|---|
| 16 |
|
|---|
| 17 | In the ``footer`` block:
|
|---|
| 18 |
|
|---|
| 19 | * HTML for the ``interface`` radio buttons in the login form
|
|---|
| 20 | * HTML for Mezzanine's menu
|
|---|
| 21 |
|
|---|
| 22 |
|
|---|
| 23 | {% endcomment %}
|
|---|
| 24 |
|
|---|
| 25 | {% load mezzanine_tags i18n %}
|
|---|
| 26 |
|
|---|
| 27 | {% block title %}{{ title }} | Mezzanine{% endblock %}
|
|---|
| 28 | {% block branding %}<h1 id="site-name">Mezzanine</h1>{% endblock %}
|
|---|
| 29 | {% block nav-global %}{% endblock %}
|
|---|
| 30 |
|
|---|
| 31 | {% block extrahead %}
|
|---|
| 32 | <script type="text/javascript">
|
|---|
| 33 |
|
|---|
| 34 | if (typeof $ == 'undefined') {
|
|---|
| 35 | document.write('<scr' +
|
|---|
| 36 | 'ipt src="{{ settings.CONTENT_MEDIA_URL }}js/jquery-1.4.4.min.js"></scr' +
|
|---|
| 37 | 'ipt>');
|
|---|
| 38 | }
|
|---|
| 39 |
|
|---|
| 40 | $.ajaxSetup({
|
|---|
| 41 | beforeSend: function(xhr, settings) {
|
|---|
| 42 | xhr.setRequestHeader('X-CSRFToken', '{{ csrf_token }}');
|
|---|
| 43 | }
|
|---|
| 44 | });
|
|---|
| 45 |
|
|---|
| 46 | window.__admin_keywords_submit_url = '{% try_url "admin_keywords_submit" %}';
|
|---|
| 47 | window.__grappelli_installed = {{ settings.GRAPPELLI_INSTALLED|lower }};
|
|---|
| 48 |
|
|---|
| 49 | </script>
|
|---|
| 50 |
|
|---|
| 51 | {% if not request.user.is_authenticated %}
|
|---|
| 52 | <style type="text/css">
|
|---|
| 53 | #extra-login-fields .required {margin-top:1px;}
|
|---|
| 54 | input.interface {margin:0 0 0 0px; vertical-align:middle;}
|
|---|
| 55 | label.interface {display:inline !important; float:none !important;
|
|---|
| 56 | vertical-align:middle; cursor:pointer;}
|
|---|
| 57 | #forgot-password {margin-top:30px; text-align:center;}
|
|---|
| 58 | .submit-row input {margin-left:8px;}
|
|---|
| 59 | </style>
|
|---|
| 60 | <script type="text/javascript">
|
|---|
| 61 |
|
|---|
| 62 | $(function() {
|
|---|
| 63 | // We "inject" the extra login fields here rather than defining them in the
|
|---|
| 64 | // login.html template, since we don't want to override the login.html
|
|---|
| 65 | // template as it's very different between Grappelli and the regular admin.
|
|---|
| 66 | if ($('#id_password').length == 1) {
|
|---|
| 67 | $('#forgot-password').insertAfter($('.submit-row')).show();
|
|---|
| 68 | $('#extra-login-fields').insertAfter($('#id_password').parent()).show();
|
|---|
| 69 | }
|
|---|
| 70 | // Fix the ``Home`` breadcrumb link non logged-in views.
|
|---|
| 71 | var home = $('.breadcrumbs a:first');
|
|---|
| 72 | if (home.length == 1) {
|
|---|
| 73 | home.attr('href', '{% try_url "admin:index" %}');
|
|---|
| 74 | }
|
|---|
| 75 | // Fix the submit margin on the new password form.
|
|---|
| 76 | if ($('#id_new_password1').length == 1) {
|
|---|
| 77 | $('input:submit').css({marginTop: '20px'});
|
|---|
| 78 | }
|
|---|
| 79 | });
|
|---|
| 80 |
|
|---|
| 81 | </script>
|
|---|
| 82 | {% endif %}
|
|---|
| 83 |
|
|---|
| 84 | {% if request.user.is_authenticated and not is_popup and not request.GET.pop %}
|
|---|
| 85 | <style type="text/css">
|
|---|
| 86 |
|
|---|
| 87 | .add-row {display:none;}
|
|---|
| 88 | .breadcrumbs {display:none; height:30px; margin:0; padding:0;
|
|---|
| 89 | background:#e6e6e6 !important;}
|
|---|
| 90 | .dropdown-menu {left:0; padding:0;}
|
|---|
| 91 | .dropdown-menu ul {display:inline; padding:0; margin:0;}
|
|---|
| 92 | .dropdown-menu li {float:left; width:auto; padding:11px 15px;
|
|---|
| 93 | cursor:pointer; height:30px;
|
|---|
| 94 | font-size:15px; font-weight:bold; list-style-type:none;}
|
|---|
| 95 | .cloned li {display:block; font-size:13px; font-weight:normal;
|
|---|
| 96 | padding:15px 20px 15px 20px !important; border-top:1px solid #eee;}
|
|---|
| 97 | .cloned .first {border-top:0px !important;}
|
|---|
| 98 | .dropdown-menu li ul {display:none; float:left;}
|
|---|
| 99 | .cloned {background:#e6e6e6; border-radius:0 0 5px 5px;
|
|---|
| 100 | border-bottom:1px solid #ccc; padding:0;}
|
|---|
| 101 | #bookmarks {display:none;}
|
|---|
| 102 | .messagelist {margin-top:14px; z-index:0 !important;}
|
|---|
| 103 |
|
|---|
| 104 | {# These are set in PageAdmin's view methods #}
|
|---|
| 105 | {% if hide_delete_link %}.deletelink {display:none !important;}{% endif %}
|
|---|
| 106 | {% if hide_slug_field %}.slug {display:none !important;}{% endif %}
|
|---|
| 107 |
|
|---|
| 108 | {% if singleton %}
|
|---|
| 109 | .submit-row * {display:none !important;}
|
|---|
| 110 | .submit-row .default {display:inline !important;}
|
|---|
| 111 | {% endif %}
|
|---|
| 112 |
|
|---|
| 113 | /* make save/delete buttons always available at bottom of screen. */
|
|---|
| 114 | .change-form div.submit-row {
|
|---|
| 115 | position: fixed; left: 0; bottom: 0; right: 0;
|
|---|
| 116 | margin: 0; padding: 10px 15px;
|
|---|
| 117 | background: #e6e6e6; border-top: 1px solid #ccc;
|
|---|
| 118 | text-align: right;
|
|---|
| 119 | }
|
|---|
| 120 |
|
|---|
| 121 | /* Fix for IE7 layout issue */
|
|---|
| 122 | #content { margin-left: 0; margin-right: 0; padding: 0 15px; }
|
|---|
| 123 |
|
|---|
| 124 | </style>
|
|---|
| 125 |
|
|---|
| 126 | <script type="text/javascript">
|
|---|
| 127 | // Global flag used for checking whether to hide the visible menu after a small
|
|---|
| 128 | // timeout has passed when mousing out from a menu.
|
|---|
| 129 | var onMenu;
|
|---|
| 130 |
|
|---|
| 131 | $(function() {
|
|---|
| 132 |
|
|---|
| 133 | // Empty out the breadcrumbs div and position the menu over it.
|
|---|
| 134 | var breadcrumb = $('.breadcrumbs');
|
|---|
| 135 | $('.breadcrumbs').html(' ').show();
|
|---|
| 136 | $('body').append($('.dropdown-menu'));
|
|---|
| 137 | // The top value here previously used breadcrumb.offset().top but breaks
|
|---|
| 138 | // when scrolling and reloading in Firefox, so to resolve this it's
|
|---|
| 139 | // hard-coded for now. Reported in github issue #11
|
|---|
| 140 | var menuCss;
|
|---|
| 141 | if (window.__grappelli_installed) {
|
|---|
| 142 | menuCss = {top: 30, position: 'fixed'};
|
|---|
| 143 | } else {
|
|---|
| 144 | menuCss = {top: 37, position: 'absolute'};
|
|---|
| 145 | }
|
|---|
| 146 | $('.dropdown-menu').css(menuCss).show();
|
|---|
| 147 |
|
|---|
| 148 | $('.dropdown-menu a').mouseover(function() {
|
|---|
| 149 | var parent = $(this).parent();
|
|---|
| 150 | var menu = parent.find('.dropdown-menu-menu').clone();
|
|---|
| 151 | // If we're over a primary menu link, clone the child menu and show it.
|
|---|
| 152 | if (menu.length == 1) {
|
|---|
| 153 | onMenu = true;
|
|---|
| 154 | $('.cloned').remove();
|
|---|
| 155 | $('body').append(menu);
|
|---|
| 156 | // Position the child menu under its parent.
|
|---|
| 157 | var pos = {
|
|---|
| 158 | top: breadcrumb.offset().top + breadcrumb.height(),
|
|---|
| 159 | left: parent.offset().left,
|
|---|
| 160 | position: 'absolute'
|
|---|
| 161 | }
|
|---|
| 162 | menu.css(pos).addClass('cloned').show();
|
|---|
| 163 | // Ensure the menu stays visible when we mouse onto another item in it.
|
|---|
| 164 | menu.mouseover(function() {
|
|---|
| 165 | onMenu = true;
|
|---|
| 166 | });
|
|---|
| 167 | // Trigger the parent mouseout if we mouseout of the menu.
|
|---|
| 168 | menu.mouseout(function() {
|
|---|
| 169 | $('.dropdown-menu a').mouseout();
|
|---|
| 170 | });
|
|---|
| 171 | }
|
|---|
| 172 | });
|
|---|
| 173 |
|
|---|
| 174 | // Set a timeout to hide visible menus on mouseout of primary menu item.
|
|---|
| 175 | $('.dropdown-menu a').mouseout(function() {
|
|---|
| 176 | var parent = $(this).parent();
|
|---|
| 177 | if (parent.find('.dropdown-menu-menu').length == 1) {
|
|---|
| 178 | onMenu = false;
|
|---|
| 179 | window.setTimeout(function() {
|
|---|
| 180 | if (!onMenu) {
|
|---|
| 181 | $('.cloned').remove();
|
|---|
| 182 | }
|
|---|
| 183 | }, 1000);
|
|---|
| 184 | }
|
|---|
| 185 | })
|
|---|
| 186 |
|
|---|
| 187 | // Provides link back to homepage.
|
|---|
| 188 | $('#user-tools li:last').before('<li><a href="/">{% trans "View Site" %}</a></li>');
|
|---|
| 189 |
|
|---|
| 190 | });
|
|---|
| 191 |
|
|---|
| 192 | // Remove extraneous ``template`` forms from inline formsets since
|
|---|
| 193 | // Mezzanine has its own method of dynamic inlines.
|
|---|
| 194 | $(function() {
|
|---|
| 195 | var removeRows = {};
|
|---|
| 196 | $.each($('*[name*=__prefix__]'), function(i, e) {
|
|---|
| 197 | var row = $(e).parent().parent();
|
|---|
| 198 | if (!row.attr('id')) {
|
|---|
| 199 | row.attr('id', 'remove__prefix__' + i);
|
|---|
| 200 | }
|
|---|
| 201 | removeRows[row.attr('id')] = true;
|
|---|
| 202 | });
|
|---|
| 203 | for (var rowID in removeRows) {
|
|---|
| 204 | $('#' + rowID).remove();
|
|---|
| 205 | }
|
|---|
| 206 | });
|
|---|
| 207 |
|
|---|
| 208 | </script>
|
|---|
| 209 | {% endif %}
|
|---|
| 210 |
|
|---|
| 211 | {% endblock %}
|
|---|
| 212 |
|
|---|
| 213 | {% block footer %}{{ block.super }}
|
|---|
| 214 | {% if not request.user.is_authenticated %}
|
|---|
| 215 | <p id="forgot-password" style="display:none;">
|
|---|
| 216 | <a href="{% try_url "password_reset" %}">{% trans "Forgot password?" %}</a>
|
|---|
| 217 | </p>
|
|---|
| 218 | <div class="form-row" id="extra-login-fields" style="display:none;">
|
|---|
| 219 |
|
|---|
| 220 | <label class="required">{% trans "Interface:" %}</label>
|
|---|
| 221 |
|
|---|
| 222 | <input class="interface" type="radio" name="mezzanine_login_interface" id="interface_admin"
|
|---|
| 223 | value="admin"{% ifnotequal request.REQUEST.mezzanine_login_interface "site" %} checked{% endifnotequal %} />
|
|---|
| 224 | <label class="interface" for="interface_admin">{% trans "Admin" %}</label>
|
|---|
| 225 |
|
|---|
| 226 | <input class="interface" type="radio" name="mezzanine_login_interface" id="interface_site"
|
|---|
| 227 | value="site"{% ifequal request.REQUEST.mezzanine_login_interface "site" %} checked{% endifequal %} />
|
|---|
| 228 | <label class="interface" for="interface_site">{% trans "Site" %}</label>
|
|---|
| 229 |
|
|---|
| 230 | </div>
|
|---|
| 231 | {% endif %}
|
|---|
| 232 | {% if request.user.is_authenticated %}
|
|---|
| 233 | {% admin_dropdown_menu %}
|
|---|
| 234 | {% endif %}
|
|---|
| 235 | {% endblock %}
|
|---|