Bläddra i källkod

Merge branch 'dev'

Denis K 9 år sedan
förälder
incheckning
3c2a54bccf
68 ändrade filer med 4402 tillägg och 1253 borttagningar
  1. 14 0
      CHANGELOG.rst
  2. 1 1
      docs/autocomplete.rst
  3. 42 0
      docs/config_file.rst
  4. 2 2
      jet/dashboard/dashboard.py
  5. 2 0
      jet/dashboard/models.py
  6. 6 3
      jet/dashboard/utils.py
  7. BIN
      jet/locale/en/LC_MESSAGES/django.mo
  8. 272 264
      jet/locale/en/LC_MESSAGES/django.po
  9. BIN
      jet/locale/ru/LC_MESSAGES/django.mo
  10. 283 277
      jet/locale/ru/LC_MESSAGES/django.po
  11. 0 0
      jet/management/__init__.py
  12. 0 0
      jet/management/commands/__init__.py
  13. 39 0
      jet/management/commands/jet_custom_apps_example.py
  14. 0 8
      jet/ordered_set.py
  15. 4 0
      jet/settings.py
  16. 0 0
      jet/static/admin/css/changelists.css
  17. 0 1
      jet/static/admin/js/SelectFilter2.min.js
  18. 0 1
      jet/static/admin/js/admin/DateTimeShortcuts.min.js
  19. 169 0
      jet/static/admin/js/admin/RelatedObjectLookups.js
  20. 0 0
      jet/static/admin/js/inlines.min.js
  21. 0 1
      jet/static/admin/js/related-widget-wrapper.min.js
  22. 7 1
      jet/static/jet/css/_base.scss
  23. 25 13
      jet/static/jet/css/_changeform.scss
  24. 13 0
      jet/static/jet/css/_content.scss
  25. 7 0
      jet/static/jet/css/_helpers.scss
  26. 71 0
      jet/static/jet/css/_relatedpopup.scss
  27. 26 3
      jet/static/jet/css/_sidebar.scss
  28. 2 0
      jet/static/jet/css/_top.scss
  29. 54 49
      jet/static/jet/css/icons/style.css
  30. 499 89
      jet/static/jet/css/themes/default/base.css
  31. 0 0
      jet/static/jet/css/themes/default/base.css.map
  32. 0 0
      jet/static/jet/css/themes/default/jquery-ui.theme.css.map
  33. 0 0
      jet/static/jet/css/themes/default/select2.theme.css.map
  34. 499 89
      jet/static/jet/css/themes/green/base.css
  35. 0 0
      jet/static/jet/css/themes/green/base.css.map
  36. 0 0
      jet/static/jet/css/themes/green/jquery-ui.theme.css.map
  37. 0 0
      jet/static/jet/css/themes/green/select2.theme.css.map
  38. 499 89
      jet/static/jet/css/themes/light-blue/base.css
  39. 0 0
      jet/static/jet/css/themes/light-blue/base.css.map
  40. 0 0
      jet/static/jet/css/themes/light-blue/jquery-ui.theme.css.map
  41. 0 0
      jet/static/jet/css/themes/light-blue/select2.theme.css.map
  42. 499 89
      jet/static/jet/css/themes/light-gray/base.css
  43. 0 0
      jet/static/jet/css/themes/light-gray/base.css.map
  44. 0 0
      jet/static/jet/css/themes/light-gray/jquery-ui.theme.css.map
  45. 0 0
      jet/static/jet/css/themes/light-gray/select2.theme.css.map
  46. 499 89
      jet/static/jet/css/themes/light-green/base.css
  47. 0 0
      jet/static/jet/css/themes/light-green/base.css.map
  48. 0 0
      jet/static/jet/css/themes/light-green/jquery-ui.theme.css.map
  49. 0 0
      jet/static/jet/css/themes/light-green/select2.theme.css.map
  50. 499 89
      jet/static/jet/css/themes/light-violet/base.css
  51. 0 0
      jet/static/jet/css/themes/light-violet/base.css.map
  52. 0 0
      jet/static/jet/css/themes/light-violet/jquery-ui.theme.css.map
  53. 0 0
      jet/static/jet/css/themes/light-violet/select2.theme.css.map
  54. 40 1
      jet/static/jet/js/main.js
  55. 0 0
      jet/static/jet/js/main.min.js
  56. 82 55
      jet/templates/admin/base.html
  57. 2 4
      jet/templates/admin/change_form.html
  58. 1 4
      jet/templates/admin/change_list.html
  59. 1 1
      jet/templates/admin/includes/fieldset.html
  60. 3 5
      jet/templates/admin/popup_response.html
  61. 3 4
      jet/templates/registration/password_change_form.html
  62. 45 2
      jet/templatetags/jet_tags.py
  63. 68 0
      jet/tests/test_ordered_set.py
  64. 0 2
      jet/tests/test_tags.py
  65. 49 1
      jet/tests/test_utils.py
  66. 0 5
      jet/tests/test_views.py
  67. 1 1
      jet/urls.py
  68. 74 10
      jet/utils.py

+ 14 - 0
CHANGELOG.rst

@@ -1,6 +1,20 @@
 Changelog
 =========
 
+0.1.4
+-----
+* [Feature] Side bar compact mode (lists all models without opening second menu)
+* [Feature] Custom side bar menu applications and models content and ordering
+* [Feature] Related objects actions in nice-looking popup instead of new window
+* [Feature] Add changelist row selection on row background click
+* [Fix] Better 3rd party applications template compatibility
+* [Fix] JET and Django js translation conflicts
+* [Fix] Hide empty model form labels
+* [Fix] Wrong positioning for 0 column
+* [Fix] Issue-21: Init label wrapped checkboxes
+* [Improvement] Add top bar arrow transition
+
+
 0.1.3
 -----
 * [Feature] Add theme choosing ability

+ 1 - 1
docs/autocomplete.rst

@@ -5,7 +5,7 @@ Autocomplete
 By default Django JET renders all possible choices for select inputs. This behavior may be unwanted if number of
 available options is rather big. In this case Django JET allows you to load these options dynamically through AJAX.
 
-In order to achieve this functionality all you have to do is :
+In order to achieve this functionality all you have to do is:
 
 * Specify which model fields should be searchable by AJAX queries. Add this static method to all models which you want to be searchable with AJAX:
 

+ 42 - 0
docs/config_file.rst

@@ -77,6 +77,48 @@ You can use **/jet/static/jet/css/themes/light-violet/** folder as an example (a
 _variables.scss contains **all** customizable variables. You'll have to compile all .scss files in theme directory
 to start using your own theme.
 
+CUSTOM MENU
+-----------
+
+By default JET displays all applications and it models in the side menu in the alphabetical order.
+To display applications and models you want or to change their order you can use ``JET_SIDE_MENU_CUSTOM_APPS`` setting.
+
+.. code:: python
+
+    JET_SIDE_MENU_CUSTOM_APPS = [
+        ('core', [ # Each list element is a tuple with application name (app_label) and list of models
+            'User',
+            'MenuItem',
+            'Block',
+        ]),
+        ('shops', [
+            'Shop',
+            'City',
+            'MetroStation',
+        ]),
+        ('feedback', [
+            'Feedback',
+        ]),
+    ]
+
+If want to show all application's models use ``__all__`` keyword.
+
+.. code:: python
+
+    JET_SIDE_MENU_CUSTOM_APPS = [
+        ('core', ['__all__']),
+        ...
+    ]
+
+.. note::
+
+    You can use ``jet_custom_apps_example`` management command to generate example ``JET_SIDE_MENU_CUSTOM_APPS``
+    setting which includes all your applications and models. You can use it this way:
+
+    .. code:: python
+
+        python manage.py jet_custom_apps_example
+
 
 JET_INDEX_DASHBOARD
 -------------------

+ 2 - 2
jet/dashboard/dashboard.py

@@ -106,8 +106,8 @@ class Dashboard(object):
         i = 0
 
         for module in self.children:
-            column = module.column if module.column else i % self.columns
-            order = module.order if module.order else int(i / self.columns)
+            column = module.column if module.column is not None else i % self.columns
+            order = module.order if module.order is not None else int(i / self.columns)
 
             module_models.append(UserDashboardModule.objects.create(
                 title=module.title,

+ 2 - 0
jet/dashboard/models.py

@@ -35,6 +35,8 @@ class UserDashboardModule(models.Model):
             return module
         except AttributeError:
             return None
+        except ImportError:
+            return None
 
     def pop_settings(self, pop_settings):
         settings = json.loads(self.settings)

+ 6 - 3
jet/dashboard/utils.py

@@ -11,7 +11,10 @@ def get_current_dashboard(location):
         raise ValueError('Unknown dashboard location: %s' % location)
 
     module, cls = path.rsplit('.', 1)
-    module = import_module(module)
-    index_dashboard_cls = getattr(module, cls)
 
-    return index_dashboard_cls
+    try:
+        module = import_module(module)
+        index_dashboard_cls = getattr(module, cls)
+        return index_dashboard_cls
+    except ImportError:
+        return None

BIN
jet/locale/en/LC_MESSAGES/django.mo


+ 272 - 264
jet/locale/en/LC_MESSAGES/django.po

@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-09-11 12:45+0000\n"
+"POT-Creation-Date: 2015-12-28 13:32+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,233 +15,374 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: dashboard/dashboard.py:159
+#: models.py:9 dashboard/modules.py:138 templates/admin/base.html:281
+msgid "URL"
+msgstr ""
+
+#: models.py:10
+msgid "title"
+msgstr ""
+
+#: models.py:11 models.py:26 dashboard/models.py:14
+msgid "user"
+msgstr ""
+
+#: models.py:12 models.py:27
+msgid "date created"
+msgstr ""
+
+#: models.py:15
+msgid "bookmark"
+msgstr ""
+
+#: models.py:16 templates/admin/base.html:294
+msgid "bookmarks"
+msgstr ""
+
+#: models.py:25 dashboard/models.py:13
+msgid "application name"
+msgstr ""
+
+#: models.py:30
+msgid "pinned application"
+msgstr ""
+
+#: models.py:31
+msgid "pinned applications"
+msgstr ""
+
+#: dashboard/dashboard.py:207
 msgid "Quick links"
 msgstr ""
 
-#: dashboard/dashboard.py:165
+#: dashboard/dashboard.py:213
 msgid "Return to site"
 msgstr ""
 
-#: dashboard/dashboard.py:166 templates/admin/base.html:80
+#: dashboard/dashboard.py:214 templates/admin/base.html:102
 msgid "Change password"
 msgstr ""
 
-#: dashboard/dashboard.py:168 templates/admin/base.html:84
+#: dashboard/dashboard.py:216 templates/admin/base.html:106
 msgid "Log out"
 msgstr ""
 
-#: dashboard/dashboard.py:176 dashboard/modules.py:160
-#: templates/admin/base.html:160 templates/admin/index.html:14
+#: dashboard/dashboard.py:224 dashboard/modules.py:268
+#: templates/admin/base.html:205 templates/admin/index.html:14
 msgid "Applications"
 msgstr ""
 
-#: dashboard/dashboard.py:184
+#: dashboard/dashboard.py:232
 msgid "Administration"
 msgstr ""
 
-#: dashboard/dashboard.py:192 dashboard/modules.py:242
+#: dashboard/dashboard.py:240 dashboard/modules.py:413
 #: templates/admin/index.html:68
 msgid "Recent Actions"
 msgstr ""
 
-#: dashboard/dashboard.py:200
+#: dashboard/dashboard.py:248
 msgid "Latest Django News"
 msgstr ""
 
-#: dashboard/dashboard.py:209
+#: dashboard/dashboard.py:257
 msgid "Support"
 msgstr ""
 
-#: dashboard/dashboard.py:212
+#: dashboard/dashboard.py:260
 msgid "Django documentation"
 msgstr ""
 
-#: dashboard/dashboard.py:217
+#: dashboard/dashboard.py:265
 msgid "Django \"django-users\" mailing list"
 msgstr ""
 
-#: dashboard/dashboard.py:222
+#: dashboard/dashboard.py:270
 msgid "Django irc channel"
 msgstr ""
 
-#: dashboard/dashboard.py:237
+#: dashboard/dashboard.py:285
 msgid "Application models"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:143
-#: dashboard/dashboard_modules/yandex_metrika.py:101
-msgid "Revoke access"
+#: dashboard/models.py:11 dashboard/modules.py:139
+#: templates/admin/base.html:279
+msgid "Title"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:148
-#: dashboard/dashboard_modules/yandex_metrika.py:106
-msgid "Grant access"
+#: dashboard/models.py:12
+msgid "module"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:161
-#: dashboard/dashboard_modules/yandex_metrika.py:116
-msgid "Access"
+#: dashboard/models.py:15
+msgid "column"
+msgstr ""
+
+#: dashboard/models.py:16
+msgid "order"
+msgstr ""
+
+#: dashboard/models.py:17
+msgid "settings"
+msgstr ""
+
+#: dashboard/models.py:18
+msgid "children"
+msgstr ""
+
+#: dashboard/models.py:19
+msgid "collapsed"
+msgstr ""
+
+#: dashboard/models.py:22
+msgid "user dashboard module"
+msgstr ""
+
+#: dashboard/models.py:23
+msgid "user dashboard modules"
+msgstr ""
+
+#: dashboard/modules.py:140
+msgid "External link"
+msgstr ""
+
+#: dashboard/modules.py:144
+msgid "Layout"
+msgstr ""
+
+#: dashboard/modules.py:144
+msgid "Stacked"
+msgstr ""
+
+#: dashboard/modules.py:144
+msgid "Inline"
+msgstr ""
+
+#: dashboard/modules.py:190 dashboard/modules.py:214
+msgid "Links"
+msgstr ""
+
+#: dashboard/modules.py:213
+msgid "Link"
+msgstr ""
+
+#: dashboard/modules.py:340
+msgid "Models"
+msgstr ""
+
+#: dashboard/modules.py:383 dashboard/modules.py:490
+msgid "Items limit"
+msgstr ""
+
+#: dashboard/modules.py:491
+msgid "Feed URL"
+msgstr ""
+
+#: dashboard/modules.py:522
+msgid "RSS Feed"
+msgstr ""
+
+#: dashboard/modules.py:568
+msgid "You must install the FeedParser python module"
+msgstr ""
+
+#: dashboard/modules.py:573
+msgid "You must provide a valid feed URL"
+msgstr ""
+
+#: dashboard/views.py:17
+msgid "Widget was successfully updated"
+msgstr ""
+
+#: dashboard/views.py:85 dashboard/templates/jet.dashboard/module.html:19
+#: dashboard/templates/jet.dashboard/modules/app_list.html:24
+#: dashboard/templates/jet.dashboard/modules/model_list.html:14
+#: templates/admin/index.html:40 templates/admin/edit_inline/stacked.html:44
+#: templates/admin/edit_inline/tabular.html:39
+msgid "Change"
+msgstr ""
+
+#: dashboard/views.py:89 dashboard/views.py:90
+msgid "Items"
+msgstr ""
+
+#: dashboard/views.py:152
+msgid "Widget has been successfully added"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:144
+#: dashboard/dashboard_modules/yandex_metrika.py:102
+msgid "Revoke access"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:149
+#: dashboard/dashboard_modules/yandex_metrika.py:107
+msgid "Grant access"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:162
 #: dashboard/dashboard_modules/yandex_metrika.py:117
-msgid "Counter"
+msgid "Access"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:163
 #: dashboard/dashboard_modules/yandex_metrika.py:118
-msgid "Statistics period"
+msgid "Counter"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:164
 #: dashboard/dashboard_modules/yandex_metrika.py:119
-msgid "Today"
+msgid "Statistics period"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:165
 #: dashboard/dashboard_modules/yandex_metrika.py:120
-msgid "Last week"
+msgid "Today"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:166
 #: dashboard/dashboard_modules/yandex_metrika.py:121
-msgid "Last month"
+msgid "Last week"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:167
 #: dashboard/dashboard_modules/yandex_metrika.py:122
-msgid "Last quarter"
+msgid "Last month"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:168
 #: dashboard/dashboard_modules/yandex_metrika.py:123
+msgid "Last quarter"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:169
+#: dashboard/dashboard_modules/yandex_metrika.py:124
 msgid "Last year"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:178
-#: dashboard/dashboard_modules/yandex_metrika.py:133
+#: dashboard/dashboard_modules/google_analytics.py:179
+#: dashboard/dashboard_modules/yandex_metrika.py:134
 msgid "none"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:181
-#: dashboard/dashboard_modules/yandex_metrika.py:136
+#: dashboard/dashboard_modules/google_analytics.py:182
+#: dashboard/dashboard_modules/yandex_metrika.py:137
 msgid "grant access first"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:181
-#: dashboard/dashboard_modules/yandex_metrika.py:136
+#: dashboard/dashboard_modules/google_analytics.py:182
+#: dashboard/dashboard_modules/yandex_metrika.py:137
 msgid "counters loading failed"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:186
-#: dashboard/dashboard_modules/yandex_metrika.py:141
+#: dashboard/dashboard_modules/google_analytics.py:187
+#: dashboard/dashboard_modules/yandex_metrika.py:142
 msgid "Show"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:187
+#: dashboard/dashboard_modules/google_analytics.py:188
 #: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:15
 msgid "Users"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:188
+#: dashboard/dashboard_modules/google_analytics.py:189
 #: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:16
 msgid "Sessions"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:189
-#: dashboard/dashboard_modules/yandex_metrika.py:144
+#: dashboard/dashboard_modules/google_analytics.py:190
+#: dashboard/dashboard_modules/yandex_metrika.py:145
 #: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:17
 #: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:17
 msgid "Views"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:191
-#: dashboard/dashboard_modules/google_analytics.py:199
-#: dashboard/dashboard_modules/yandex_metrika.py:146
-#: dashboard/dashboard_modules/yandex_metrika.py:154
-msgid "Group"
-msgstr ""
-
 #: dashboard/dashboard_modules/google_analytics.py:192
 #: dashboard/dashboard_modules/google_analytics.py:200
 #: dashboard/dashboard_modules/yandex_metrika.py:147
 #: dashboard/dashboard_modules/yandex_metrika.py:155
-msgid "By day"
+msgid "Group"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:193
 #: dashboard/dashboard_modules/google_analytics.py:201
 #: dashboard/dashboard_modules/yandex_metrika.py:148
 #: dashboard/dashboard_modules/yandex_metrika.py:156
-msgid "By week"
+msgid "By day"
 msgstr ""
 
 #: dashboard/dashboard_modules/google_analytics.py:194
 #: dashboard/dashboard_modules/google_analytics.py:202
 #: dashboard/dashboard_modules/yandex_metrika.py:149
 #: dashboard/dashboard_modules/yandex_metrika.py:157
+msgid "By week"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:195
+#: dashboard/dashboard_modules/google_analytics.py:203
+#: dashboard/dashboard_modules/yandex_metrika.py:150
+#: dashboard/dashboard_modules/yandex_metrika.py:158
 msgid "By month"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:275
+#: dashboard/dashboard_modules/google_analytics.py:276
 #, python-format
 msgid ""
 "Please <a href=\"%s\">attach Google account and choose Google Analytics "
 "counter</a> to start using widget"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:278
+#: dashboard/dashboard_modules/google_analytics.py:279
 #, python-format
 msgid ""
 "Please <a href=\"%s\">select Google Analytics counter</a> to start using "
 "widget"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:297
+#: dashboard/dashboard_modules/google_analytics.py:298
 #: dashboard/dashboard_modules/google_analytics_views.py:42
-#: dashboard/dashboard_modules/yandex_metrika.py:234
+#: dashboard/dashboard_modules/yandex_metrika.py:235
 #: dashboard/dashboard_modules/yandex_metrika_views.py:37
 msgid "API request failed."
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:299
-#: dashboard/dashboard_modules/yandex_metrika.py:236
+#: dashboard/dashboard_modules/google_analytics.py:300
+#: dashboard/dashboard_modules/yandex_metrika.py:237
 #, python-format
 msgid " Try to <a href=\"%s\">revoke and grant access</a> again"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:304
+#: dashboard/dashboard_modules/google_analytics.py:310
 msgid "Google Analytics visitors totals"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:316
+#: dashboard/dashboard_modules/google_analytics.py:325
 msgid "users"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:317
+#: dashboard/dashboard_modules/google_analytics.py:326
 msgid "sessions"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:318
-#: dashboard/dashboard_modules/yandex_metrika.py:257
+#: dashboard/dashboard_modules/google_analytics.py:327
+#: dashboard/dashboard_modules/yandex_metrika.py:266
 msgid "views"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:320
-#: dashboard/dashboard_modules/google_analytics.py:365
-#: dashboard/dashboard_modules/google_analytics.py:404
-#: dashboard/dashboard_modules/yandex_metrika.py:259
-#: dashboard/dashboard_modules/yandex_metrika.py:298
-#: dashboard/dashboard_modules/yandex_metrika.py:331
+#: dashboard/dashboard_modules/google_analytics.py:329
+#: dashboard/dashboard_modules/google_analytics.py:387
+#: dashboard/dashboard_modules/google_analytics.py:437
+#: dashboard/dashboard_modules/yandex_metrika.py:268
+#: dashboard/dashboard_modules/yandex_metrika.py:320
+#: dashboard/dashboard_modules/yandex_metrika.py:364
 msgid "Bad server response"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:324
+#: dashboard/dashboard_modules/google_analytics.py:339
 msgid "Google Analytics visitors chart"
 msgstr ""
 
-#: dashboard/dashboard_modules/google_analytics.py:369
+#: dashboard/dashboard_modules/google_analytics.py:397
 msgid "Google Analytics period visitors"
 msgstr ""
 
@@ -257,149 +398,52 @@ msgstr ""
 msgid "Bad arguments"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:142
+#: dashboard/dashboard_modules/yandex_metrika.py:143
 #: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:15
 msgid "Visitors"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:143
+#: dashboard/dashboard_modules/yandex_metrika.py:144
 #: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:16
 msgid "Visits"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:217
+#: dashboard/dashboard_modules/yandex_metrika.py:218
 #, python-format
 msgid ""
 "Please <a href=\"%s\">attach Yandex account and choose Yandex Metrika "
 "counter</a> to start using widget"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:220
+#: dashboard/dashboard_modules/yandex_metrika.py:221
 #, python-format
 msgid ""
 "Please <a href=\"%s\">select Yandex Metrika counter</a> to start using widget"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:243
+#: dashboard/dashboard_modules/yandex_metrika.py:249
 msgid "Yandex Metrika visitors totals"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:255
+#: dashboard/dashboard_modules/yandex_metrika.py:264
 msgid "visitors"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:256
+#: dashboard/dashboard_modules/yandex_metrika.py:265
 msgid "visits"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:263
+#: dashboard/dashboard_modules/yandex_metrika.py:278
 msgid "Yandex Metrika visitors chart"
 msgstr ""
 
-#: dashboard/dashboard_modules/yandex_metrika.py:302
+#: dashboard/dashboard_modules/yandex_metrika.py:330
 msgid "Yandex Metrika period visitors"
 msgstr ""
 
-#: dashboard/models.py:11 dashboard/modules.py:116
-#: templates/admin/base.html:192
-msgid "Title"
-msgstr ""
-
-#: dashboard/models.py:12
-msgid "module"
-msgstr ""
-
-#: dashboard/models.py:13 models.py:28
-msgid "application name"
-msgstr ""
-
-#: dashboard/models.py:14 models.py:14 models.py:29
-msgid "user"
-msgstr ""
-
-#: dashboard/models.py:15
-msgid "column"
-msgstr ""
-
-#: dashboard/models.py:16
-msgid "order"
-msgstr ""
-
-#: dashboard/models.py:17
-msgid "settings"
-msgstr ""
-
-#: dashboard/models.py:18
-msgid "children"
-msgstr ""
-
-#: dashboard/models.py:19
-msgid "collapsed"
-msgstr ""
-
-#: dashboard/models.py:22
-msgid "user dashboard module"
-msgstr ""
-
-#: dashboard/models.py:23
-msgid "user dashboard modules"
-msgstr ""
-
-#: dashboard/modules.py:115 models.py:12 templates/admin/base.html:194
-msgid "URL"
-msgstr ""
-
-#: dashboard/modules.py:117
-msgid "External link"
-msgstr ""
-
-#: dashboard/modules.py:121
-msgid "Layout"
-msgstr ""
-
-#: dashboard/modules.py:121
-msgid "Stacked"
-msgstr ""
-
-#: dashboard/modules.py:121
-msgid "Inline"
-msgstr ""
-
-#: dashboard/modules.py:125 dashboard/modules.py:131
-msgid "Links"
-msgstr ""
-
-#: dashboard/modules.py:130
-msgid "Link"
-msgstr ""
-
-#: dashboard/modules.py:201
-msgid "Models"
-msgstr ""
-
-#: dashboard/modules.py:238 dashboard/modules.py:309
-msgid "Items limit"
-msgstr ""
-
-#: dashboard/modules.py:310
-msgid "Feed URL"
-msgstr ""
-
-#: dashboard/modules.py:314
-msgid "RSS Feed"
-msgstr ""
-
-#: dashboard/modules.py:356
-msgid "You must install the FeedParser python module"
-msgstr ""
-
-#: dashboard/modules.py:361
-msgid "You must provide a valid feed URL"
-msgstr ""
-
 #: dashboard/templates/admin/app_index.html:32
 #: dashboard/templates/jet.dashboard/update_module.html:14
-#: templates/admin/base.html:95 templates/admin/base.html.py:144
+#: templates/admin/base.html:117 templates/admin/base.html.py:173
 #: templates/admin/change_form.html:17 templates/admin/change_list.html:33
 #: templates/admin/delete_confirmation.html:8
 #: templates/admin/delete_selected_confirmation.html:8
@@ -446,14 +490,6 @@ msgstr ""
 msgid "Are you sure want to reset widgets?"
 msgstr ""
 
-#: dashboard/templates/jet.dashboard/module.html:19
-#: dashboard/templates/jet.dashboard/modules/app_list.html:24
-#: dashboard/templates/jet.dashboard/modules/model_list.html:14
-#: dashboard/views.py:86 templates/admin/edit_inline/stacked.html:44
-#: templates/admin/edit_inline/tabular.html:39 templates/admin/index.html:40
-msgid "Change"
-msgstr ""
-
 #: dashboard/templates/jet.dashboard/module.html:22
 #: templates/admin/delete_confirmation.html:12
 #: templates/admin/related_widget_wrapper.html:24
@@ -461,55 +497,22 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: dashboard/templates/jet.dashboard/modules/app_list.html:7
-#: dashboard/templates/jet.dashboard/modules/app_list.html:10
-#: templates/admin/index.html:23 templates/admin/index.html.py:26
-#, python-format
-msgid "Models in the %(name)s application"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/modules/feed.html:13
-#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:34
-#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_chart.html:30
-#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_totals.html:23
-#: dashboard/templates/jet.dashboard/modules/link_list.html:26
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:34
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_chart.html:30
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_totals.html:23
-msgid "Nothing to show"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:14
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:14
-msgid "Date"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/modules/recent_actions.html:6
-#: templates/admin/index.html:75
-msgid "None available"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/modules/recent_actions.html:29
-#: templates/admin/index.html:98
-msgid "Unknown content"
-msgstr ""
-
 #: dashboard/templates/jet.dashboard/update_module.html:35
 #: templates/admin/change_form.html:62
 msgid "General"
 msgstr ""
 
 #: dashboard/templates/jet.dashboard/update_module.html:56
-#: templates/admin/change_list.html:61
+#: templates/admin/change_list.html:61 templates/admin/login.html:27
 #: templates/admin/edit_inline/stacked.html:8
 #: templates/admin/edit_inline/tabular.html:10
-#: templates/admin/includes/fieldset.html:9 templates/admin/login.html:27
+#: templates/admin/includes/fieldset.html:9
 #: templates/registration/password_change_form.html:21
 msgid "Please correct the errors below."
 msgstr ""
 
 #: dashboard/templates/jet.dashboard/update_module.html:126
-#: templates/admin/base.html:214 templates/admin/base.html.py:221
+#: templates/admin/base.html:301 templates/admin/base.html.py:308
 #: templates/admin/edit_inline/stacked.html:21
 #: templates/admin/edit_inline/stacked.html:75
 #: templates/admin/edit_inline/tabular.html:100
@@ -528,40 +531,37 @@ msgstr ""
 msgid "Save"
 msgstr ""
 
-#: dashboard/views.py:18
-msgid "Widget was successfully updated"
-msgstr ""
-
-#: dashboard/views.py:90 dashboard/views.py:91
-msgid "Items"
-msgstr ""
-
-#: dashboard/views.py:153
-msgid "Widget has been successfully added"
-msgstr ""
-
-#: models.py:13
-msgid "title"
-msgstr ""
-
-#: models.py:15 models.py:30
-msgid "date created"
+#: dashboard/templates/jet.dashboard/modules/app_list.html:7
+#: dashboard/templates/jet.dashboard/modules/app_list.html:10
+#: templates/admin/index.html:23 templates/admin/index.html.py:26
+#, python-format
+msgid "Models in the %(name)s application"
 msgstr ""
 
-#: models.py:18
-msgid "bookmark"
+#: dashboard/templates/jet.dashboard/modules/feed.html:13
+#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:34
+#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_chart.html:30
+#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_totals.html:23
+#: dashboard/templates/jet.dashboard/modules/link_list.html:26
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:34
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_chart.html:30
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_totals.html:23
+msgid "Nothing to show"
 msgstr ""
 
-#: models.py:19 templates/admin/base.html:207
-msgid "bookmarks"
+#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:14
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:14
+msgid "Date"
 msgstr ""
 
-#: models.py:33
-msgid "pinned application"
+#: dashboard/templates/jet.dashboard/modules/recent_actions.html:6
+#: templates/admin/index.html:75
+msgid "None available"
 msgstr ""
 
-#: models.py:34
-msgid "pinned applications"
+#: dashboard/templates/jet.dashboard/modules/recent_actions.html:29
+#: templates/admin/index.html:98
+msgid "Unknown content"
 msgstr ""
 
 #: templates/admin/actions.html:8
@@ -585,27 +585,35 @@ msgstr ""
 msgid "Clear selection"
 msgstr ""
 
-#: templates/admin/base.html:149
+#: templates/admin/base.html:80
+msgid "current theme"
+msgstr ""
+
+#: templates/admin/base.html:159
+msgid "back"
+msgstr ""
+
+#: templates/admin/base.html:180
 msgid "View site"
 msgstr ""
 
-#: templates/admin/base.html:189 templates/admin/base.html.py:206
+#: templates/admin/base.html:188
+msgid "Documentation"
+msgstr ""
+
+#: templates/admin/base.html:276 templates/admin/base.html.py:293
 msgid "Add bookmark"
 msgstr ""
 
-#: templates/admin/base.html:202
+#: templates/admin/base.html:289
 msgid "Delete bookmark"
 msgstr ""
 
-#: templates/admin/base.html:203
+#: templates/admin/base.html:290
 msgid "Are you sure want to delete this bookmark?"
 msgstr ""
 
-#: templates/admin/base.html:229
-msgid "Documentation"
-msgstr ""
-
-#: templates/admin/base.html:252
+#: templates/admin/base.html:333
 msgid "Application page"
 msgstr ""
 
@@ -713,19 +721,11 @@ msgid ""
 "following objects and their related items will be deleted:"
 msgstr ""
 
-#: templates/admin/edit_inline/tabular.html:25
-msgid "Delete?"
-msgstr ""
-
 #: templates/admin/filter.html:6
 #, python-format
 msgid "%(filter_title)s"
 msgstr ""
 
-#: templates/admin/includes/object_delete_summary.html:2
-msgid "Summary"
-msgstr ""
-
 #: templates/admin/index.html:56
 msgid "You don't have permission to edit anything."
 msgstr ""
@@ -807,6 +807,14 @@ msgstr ""
 msgid "Save and continue editing"
 msgstr ""
 
+#: templates/admin/edit_inline/tabular.html:25
+msgid "Delete?"
+msgstr ""
+
+#: templates/admin/includes/object_delete_summary.html:2
+msgid "Summary"
+msgstr ""
+
 #: templates/registration/logged_out.html:9
 msgid "Thanks for spending some quality time with the Web site today."
 msgstr ""

BIN
jet/locale/ru/LC_MESSAGES/django.mo


+ 283 - 277
jet/locale/ru/LC_MESSAGES/django.po

@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-09-11 12:45+0000\n"
+"POT-Creation-Date: 2015-12-28 13:32+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,176 +17,317 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: dashboard/dashboard.py:159
+#: models.py:9 dashboard/modules.py:138 templates/admin/base.html:281
+msgid "URL"
+msgstr "URL"
+
+#: models.py:10
+msgid "title"
+msgstr ""
+
+#: models.py:11 models.py:26 dashboard/models.py:14
+msgid "user"
+msgstr ""
+
+#: models.py:12 models.py:27
+msgid "date created"
+msgstr ""
+
+#: models.py:15
+msgid "bookmark"
+msgstr ""
+
+#: models.py:16 templates/admin/base.html:294
+msgid "bookmarks"
+msgstr "закладки"
+
+#: models.py:25 dashboard/models.py:13
+msgid "application name"
+msgstr ""
+
+#: models.py:30
+msgid "pinned application"
+msgstr ""
+
+#: models.py:31
+msgid "pinned applications"
+msgstr ""
+
+#: dashboard/dashboard.py:207
 msgid "Quick links"
 msgstr "Быстрые ссылки"
 
-#: dashboard/dashboard.py:165
+#: dashboard/dashboard.py:213
 msgid "Return to site"
 msgstr "Вернуться на сайт"
 
-#: dashboard/dashboard.py:166 templates/admin/base.html:80
+#: dashboard/dashboard.py:214 templates/admin/base.html:102
 msgid "Change password"
 msgstr ""
 
-#: dashboard/dashboard.py:168 templates/admin/base.html:84
+#: dashboard/dashboard.py:216 templates/admin/base.html:106
 msgid "Log out"
 msgstr ""
 
-#: dashboard/dashboard.py:176 dashboard/modules.py:160
-#: templates/admin/base.html:160 templates/admin/index.html:14
+#: dashboard/dashboard.py:224 dashboard/modules.py:268
+#: templates/admin/base.html:205 templates/admin/index.html:14
 msgid "Applications"
 msgstr "Приложения"
 
-#: dashboard/dashboard.py:184
+#: dashboard/dashboard.py:232
 msgid "Administration"
 msgstr "Администрирование"
 
-#: dashboard/dashboard.py:192 dashboard/modules.py:242
+#: dashboard/dashboard.py:240 dashboard/modules.py:413
 #: templates/admin/index.html:68
 msgid "Recent Actions"
 msgstr "Последние действия"
 
-#: dashboard/dashboard.py:200
+#: dashboard/dashboard.py:248
 msgid "Latest Django News"
 msgstr "Новости от Django"
 
-#: dashboard/dashboard.py:209
+#: dashboard/dashboard.py:257
 msgid "Support"
 msgstr "Поддержка"
 
-#: dashboard/dashboard.py:212
+#: dashboard/dashboard.py:260
 msgid "Django documentation"
 msgstr "Документация по Django"
 
-#: dashboard/dashboard.py:217
+#: dashboard/dashboard.py:265
 msgid "Django \"django-users\" mailing list"
 msgstr "Гугл-группа \"django-users\""
 
-#: dashboard/dashboard.py:222
+#: dashboard/dashboard.py:270
 msgid "Django irc channel"
 msgstr "IRC канал Django"
 
-#: dashboard/dashboard.py:237
+#: dashboard/dashboard.py:285
 msgid "Application models"
 msgstr "Модели приложения"
 
-#: dashboard/dashboard_modules/google_analytics.py:143
-#: dashboard/dashboard_modules/yandex_metrika.py:101
+#: dashboard/models.py:11 dashboard/modules.py:139
+#: templates/admin/base.html:279
+msgid "Title"
+msgstr "Название"
+
+#: dashboard/models.py:12
+msgid "module"
+msgstr ""
+
+#: dashboard/models.py:15
+msgid "column"
+msgstr ""
+
+#: dashboard/models.py:16
+msgid "order"
+msgstr ""
+
+#: dashboard/models.py:17
+msgid "settings"
+msgstr ""
+
+#: dashboard/models.py:18
+msgid "children"
+msgstr ""
+
+#: dashboard/models.py:19
+msgid "collapsed"
+msgstr ""
+
+#: dashboard/models.py:22
+msgid "user dashboard module"
+msgstr ""
+
+#: dashboard/models.py:23
+msgid "user dashboard modules"
+msgstr ""
+
+#: dashboard/modules.py:140
+msgid "External link"
+msgstr "Внешняя ссылка"
+
+#: dashboard/modules.py:144
+msgid "Layout"
+msgstr "Отображение"
+
+#: dashboard/modules.py:144
+msgid "Stacked"
+msgstr "Списком"
+
+#: dashboard/modules.py:144
+msgid "Inline"
+msgstr "В строчку"
+
+#: dashboard/modules.py:190 dashboard/modules.py:214
+msgid "Links"
+msgstr "Ссылки"
+
+#: dashboard/modules.py:213
+msgid "Link"
+msgstr "Ссылка"
+
+#: dashboard/modules.py:340
+msgid "Models"
+msgstr "Модели"
+
+#: dashboard/modules.py:383 dashboard/modules.py:490
+msgid "Items limit"
+msgstr "Количество элементов"
+
+#: dashboard/modules.py:491
+msgid "Feed URL"
+msgstr "URL потока"
+
+#: dashboard/modules.py:522
+msgid "RSS Feed"
+msgstr "RSS поток"
+
+#: dashboard/modules.py:568
+msgid "You must install the FeedParser python module"
+msgstr "Необходимо установить python модуль FeedParser"
+
+#: dashboard/modules.py:573
+msgid "You must provide a valid feed URL"
+msgstr "Необходимо указать корректный URL потока"
+
+#: dashboard/views.py:17
+msgid "Widget was successfully updated"
+msgstr "Виджет успешно изменен"
+
+#: dashboard/views.py:85 dashboard/templates/jet.dashboard/module.html:19
+#: dashboard/templates/jet.dashboard/modules/app_list.html:24
+#: dashboard/templates/jet.dashboard/modules/model_list.html:14
+#: templates/admin/index.html:40 templates/admin/edit_inline/stacked.html:44
+#: templates/admin/edit_inline/tabular.html:39
+msgid "Change"
+msgstr ""
+
+#: dashboard/views.py:89 dashboard/views.py:90
+msgid "Items"
+msgstr "Элементы"
+
+#: dashboard/views.py:152
+msgid "Widget has been successfully added"
+msgstr "Виджет успешно добавлен"
+
+#: dashboard/dashboard_modules/google_analytics.py:144
+#: dashboard/dashboard_modules/yandex_metrika.py:102
 msgid "Revoke access"
 msgstr "Убрать доступ"
 
-#: dashboard/dashboard_modules/google_analytics.py:148
-#: dashboard/dashboard_modules/yandex_metrika.py:106
+#: dashboard/dashboard_modules/google_analytics.py:149
+#: dashboard/dashboard_modules/yandex_metrika.py:107
 msgid "Grant access"
 msgstr "Предоставить доступ"
 
-#: dashboard/dashboard_modules/google_analytics.py:161
-#: dashboard/dashboard_modules/yandex_metrika.py:116
+#: dashboard/dashboard_modules/google_analytics.py:162
+#: dashboard/dashboard_modules/yandex_metrika.py:117
 msgid "Access"
 msgstr "Доступ"
 
-#: dashboard/dashboard_modules/google_analytics.py:162
-#: dashboard/dashboard_modules/yandex_metrika.py:117
+#: dashboard/dashboard_modules/google_analytics.py:163
+#: dashboard/dashboard_modules/yandex_metrika.py:118
 msgid "Counter"
 msgstr "Счетчик"
 
-#: dashboard/dashboard_modules/google_analytics.py:163
-#: dashboard/dashboard_modules/yandex_metrika.py:118
+#: dashboard/dashboard_modules/google_analytics.py:164
+#: dashboard/dashboard_modules/yandex_metrika.py:119
 msgid "Statistics period"
 msgstr "Статистика за период"
 
-#: dashboard/dashboard_modules/google_analytics.py:164
-#: dashboard/dashboard_modules/yandex_metrika.py:119
+#: dashboard/dashboard_modules/google_analytics.py:165
+#: dashboard/dashboard_modules/yandex_metrika.py:120
 msgid "Today"
 msgstr "Сегодня"
 
-#: dashboard/dashboard_modules/google_analytics.py:165
-#: dashboard/dashboard_modules/yandex_metrika.py:120
+#: dashboard/dashboard_modules/google_analytics.py:166
+#: dashboard/dashboard_modules/yandex_metrika.py:121
 msgid "Last week"
 msgstr "Последняя неделя"
 
-#: dashboard/dashboard_modules/google_analytics.py:166
-#: dashboard/dashboard_modules/yandex_metrika.py:121
+#: dashboard/dashboard_modules/google_analytics.py:167
+#: dashboard/dashboard_modules/yandex_metrika.py:122
 msgid "Last month"
 msgstr "Последний месяц"
 
-#: dashboard/dashboard_modules/google_analytics.py:167
-#: dashboard/dashboard_modules/yandex_metrika.py:122
+#: dashboard/dashboard_modules/google_analytics.py:168
+#: dashboard/dashboard_modules/yandex_metrika.py:123
 msgid "Last quarter"
 msgstr "Последний квартал"
 
-#: dashboard/dashboard_modules/google_analytics.py:168
-#: dashboard/dashboard_modules/yandex_metrika.py:123
+#: dashboard/dashboard_modules/google_analytics.py:169
+#: dashboard/dashboard_modules/yandex_metrika.py:124
 msgid "Last year"
 msgstr "Последний год"
 
-#: dashboard/dashboard_modules/google_analytics.py:178
-#: dashboard/dashboard_modules/yandex_metrika.py:133
+#: dashboard/dashboard_modules/google_analytics.py:179
+#: dashboard/dashboard_modules/yandex_metrika.py:134
 msgid "none"
 msgstr "не указано"
 
-#: dashboard/dashboard_modules/google_analytics.py:181
-#: dashboard/dashboard_modules/yandex_metrika.py:136
+#: dashboard/dashboard_modules/google_analytics.py:182
+#: dashboard/dashboard_modules/yandex_metrika.py:137
 msgid "grant access first"
 msgstr "сначала предоставьте доступ"
 
-#: dashboard/dashboard_modules/google_analytics.py:181
-#: dashboard/dashboard_modules/yandex_metrika.py:136
+#: dashboard/dashboard_modules/google_analytics.py:182
+#: dashboard/dashboard_modules/yandex_metrika.py:137
 msgid "counters loading failed"
 msgstr "не удалось загрузить счетчики"
 
-#: dashboard/dashboard_modules/google_analytics.py:186
-#: dashboard/dashboard_modules/yandex_metrika.py:141
+#: dashboard/dashboard_modules/google_analytics.py:187
+#: dashboard/dashboard_modules/yandex_metrika.py:142
 msgid "Show"
 msgstr "Показывать"
 
-#: dashboard/dashboard_modules/google_analytics.py:187
+#: dashboard/dashboard_modules/google_analytics.py:188
 #: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:15
 msgid "Users"
 msgstr "Пользователи"
 
-#: dashboard/dashboard_modules/google_analytics.py:188
+#: dashboard/dashboard_modules/google_analytics.py:189
 #: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:16
 msgid "Sessions"
 msgstr "Сессии"
 
-#: dashboard/dashboard_modules/google_analytics.py:189
-#: dashboard/dashboard_modules/yandex_metrika.py:144
+#: dashboard/dashboard_modules/google_analytics.py:190
+#: dashboard/dashboard_modules/yandex_metrika.py:145
 #: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:17
 #: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:17
 msgid "Views"
 msgstr "Просмотры"
 
-#: dashboard/dashboard_modules/google_analytics.py:191
-#: dashboard/dashboard_modules/google_analytics.py:199
-#: dashboard/dashboard_modules/yandex_metrika.py:146
-#: dashboard/dashboard_modules/yandex_metrika.py:154
-msgid "Group"
-msgstr "Группировать"
-
 #: dashboard/dashboard_modules/google_analytics.py:192
 #: dashboard/dashboard_modules/google_analytics.py:200
 #: dashboard/dashboard_modules/yandex_metrika.py:147
 #: dashboard/dashboard_modules/yandex_metrika.py:155
-msgid "By day"
-msgstr "По дням"
+msgid "Group"
+msgstr "Группировать"
 
 #: dashboard/dashboard_modules/google_analytics.py:193
 #: dashboard/dashboard_modules/google_analytics.py:201
 #: dashboard/dashboard_modules/yandex_metrika.py:148
 #: dashboard/dashboard_modules/yandex_metrika.py:156
-msgid "By week"
-msgstr "По неделям"
+msgid "By day"
+msgstr "По дням"
 
 #: dashboard/dashboard_modules/google_analytics.py:194
 #: dashboard/dashboard_modules/google_analytics.py:202
 #: dashboard/dashboard_modules/yandex_metrika.py:149
 #: dashboard/dashboard_modules/yandex_metrika.py:157
+msgid "By week"
+msgstr "По неделям"
+
+#: dashboard/dashboard_modules/google_analytics.py:195
+#: dashboard/dashboard_modules/google_analytics.py:203
+#: dashboard/dashboard_modules/yandex_metrika.py:150
+#: dashboard/dashboard_modules/yandex_metrika.py:158
 msgid "By month"
 msgstr "По месяцам"
 
-#: dashboard/dashboard_modules/google_analytics.py:275
+#: dashboard/dashboard_modules/google_analytics.py:276
 #, python-format
 msgid ""
 "Please <a href=\"%s\">attach Google account and choose Google Analytics "
@@ -195,7 +336,7 @@ msgstr ""
 "Пожалуйста <a href=\"%s\">прикрепите аккаунт Google и выберите счетчик "
 "Google Analytics</a> для виджета"
 
-#: dashboard/dashboard_modules/google_analytics.py:278
+#: dashboard/dashboard_modules/google_analytics.py:279
 #, python-format
 msgid ""
 "Please <a href=\"%s\">select Google Analytics counter</a> to start using "
@@ -203,50 +344,50 @@ msgid ""
 msgstr ""
 "Пожалуйста <a href=\"%s\">выберите счетчик Google Analytics</a> для виджета"
 
-#: dashboard/dashboard_modules/google_analytics.py:297
+#: dashboard/dashboard_modules/google_analytics.py:298
 #: dashboard/dashboard_modules/google_analytics_views.py:42
-#: dashboard/dashboard_modules/yandex_metrika.py:234
+#: dashboard/dashboard_modules/yandex_metrika.py:235
 #: dashboard/dashboard_modules/yandex_metrika_views.py:37
 msgid "API request failed."
 msgstr "Ошибка запроса к API."
 
-#: dashboard/dashboard_modules/google_analytics.py:299
-#: dashboard/dashboard_modules/yandex_metrika.py:236
+#: dashboard/dashboard_modules/google_analytics.py:300
+#: dashboard/dashboard_modules/yandex_metrika.py:237
 #, python-format
 msgid " Try to <a href=\"%s\">revoke and grant access</a> again"
 msgstr " Попробуйте <a href=\"%s\">убрать и предоставить доступ</a> заново"
 
-#: dashboard/dashboard_modules/google_analytics.py:304
+#: dashboard/dashboard_modules/google_analytics.py:310
 msgid "Google Analytics visitors totals"
 msgstr "Данные о посещениях Google Analytics"
 
-#: dashboard/dashboard_modules/google_analytics.py:316
+#: dashboard/dashboard_modules/google_analytics.py:325
 msgid "users"
 msgstr "пользователи"
 
-#: dashboard/dashboard_modules/google_analytics.py:317
+#: dashboard/dashboard_modules/google_analytics.py:326
 msgid "sessions"
 msgstr "сессии"
 
-#: dashboard/dashboard_modules/google_analytics.py:318
-#: dashboard/dashboard_modules/yandex_metrika.py:257
+#: dashboard/dashboard_modules/google_analytics.py:327
+#: dashboard/dashboard_modules/yandex_metrika.py:266
 msgid "views"
 msgstr "просмотры"
 
-#: dashboard/dashboard_modules/google_analytics.py:320
-#: dashboard/dashboard_modules/google_analytics.py:365
-#: dashboard/dashboard_modules/google_analytics.py:404
-#: dashboard/dashboard_modules/yandex_metrika.py:259
-#: dashboard/dashboard_modules/yandex_metrika.py:298
-#: dashboard/dashboard_modules/yandex_metrika.py:331
+#: dashboard/dashboard_modules/google_analytics.py:329
+#: dashboard/dashboard_modules/google_analytics.py:387
+#: dashboard/dashboard_modules/google_analytics.py:437
+#: dashboard/dashboard_modules/yandex_metrika.py:268
+#: dashboard/dashboard_modules/yandex_metrika.py:320
+#: dashboard/dashboard_modules/yandex_metrika.py:364
 msgid "Bad server response"
 msgstr "Некорректный ответ сервера"
 
-#: dashboard/dashboard_modules/google_analytics.py:324
+#: dashboard/dashboard_modules/google_analytics.py:339
 msgid "Google Analytics visitors chart"
 msgstr "График посещений Google Analytics"
 
-#: dashboard/dashboard_modules/google_analytics.py:369
+#: dashboard/dashboard_modules/google_analytics.py:397
 msgid "Google Analytics period visitors"
 msgstr "Посещения Google Analytics за период"
 
@@ -262,17 +403,17 @@ msgstr "Модуль не найден"
 msgid "Bad arguments"
 msgstr "Некорректные аргументы"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:142
+#: dashboard/dashboard_modules/yandex_metrika.py:143
 #: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:15
 msgid "Visitors"
 msgstr "Посетители"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:143
+#: dashboard/dashboard_modules/yandex_metrika.py:144
 #: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:16
 msgid "Visits"
 msgstr "Визиты"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:217
+#: dashboard/dashboard_modules/yandex_metrika.py:218
 #, python-format
 msgid ""
 "Please <a href=\"%s\">attach Yandex account and choose Yandex Metrika "
@@ -281,133 +422,36 @@ msgstr ""
 "Пожалуйста <a href=\"%s\">прикрепите аккаунт Яндекс и выберите счетчик "
 "Яндекс Метрики</a> для виджета"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:220
+#: dashboard/dashboard_modules/yandex_metrika.py:221
 #, python-format
 msgid ""
 "Please <a href=\"%s\">select Yandex Metrika counter</a> to start using widget"
 msgstr ""
 "Пожалуйста <a href=\"%s\">выберите счетчик Яндекс Метрики</a> для виджета"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:243
+#: dashboard/dashboard_modules/yandex_metrika.py:249
 msgid "Yandex Metrika visitors totals"
 msgstr "Данные о посещениях Яндекс Метрики"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:255
+#: dashboard/dashboard_modules/yandex_metrika.py:264
 msgid "visitors"
 msgstr "посетители"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:256
+#: dashboard/dashboard_modules/yandex_metrika.py:265
 msgid "visits"
 msgstr "визиты"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:263
+#: dashboard/dashboard_modules/yandex_metrika.py:278
 msgid "Yandex Metrika visitors chart"
 msgstr "График посещений Яндекс Метрики"
 
-#: dashboard/dashboard_modules/yandex_metrika.py:302
+#: dashboard/dashboard_modules/yandex_metrika.py:330
 msgid "Yandex Metrika period visitors"
 msgstr "Посещения Яндекс Метрики за период"
 
-#: dashboard/models.py:11 dashboard/modules.py:116
-#: templates/admin/base.html:192
-msgid "Title"
-msgstr "Название"
-
-#: dashboard/models.py:12
-msgid "module"
-msgstr ""
-
-#: dashboard/models.py:13 models.py:28
-msgid "application name"
-msgstr ""
-
-#: dashboard/models.py:14 models.py:14 models.py:29
-msgid "user"
-msgstr ""
-
-#: dashboard/models.py:15
-msgid "column"
-msgstr ""
-
-#: dashboard/models.py:16
-msgid "order"
-msgstr ""
-
-#: dashboard/models.py:17
-msgid "settings"
-msgstr ""
-
-#: dashboard/models.py:18
-msgid "children"
-msgstr ""
-
-#: dashboard/models.py:19
-msgid "collapsed"
-msgstr ""
-
-#: dashboard/models.py:22
-msgid "user dashboard module"
-msgstr ""
-
-#: dashboard/models.py:23
-msgid "user dashboard modules"
-msgstr ""
-
-#: dashboard/modules.py:115 models.py:12 templates/admin/base.html:194
-msgid "URL"
-msgstr "URL"
-
-#: dashboard/modules.py:117
-msgid "External link"
-msgstr "Внешняя ссылка"
-
-#: dashboard/modules.py:121
-msgid "Layout"
-msgstr "Отображение"
-
-#: dashboard/modules.py:121
-msgid "Stacked"
-msgstr "Списком"
-
-#: dashboard/modules.py:121
-msgid "Inline"
-msgstr "В строчку"
-
-#: dashboard/modules.py:125 dashboard/modules.py:131
-msgid "Links"
-msgstr "Ссылки"
-
-#: dashboard/modules.py:130
-msgid "Link"
-msgstr "Ссылка"
-
-#: dashboard/modules.py:201
-msgid "Models"
-msgstr "Модели"
-
-#: dashboard/modules.py:238 dashboard/modules.py:309
-msgid "Items limit"
-msgstr "Количество элементов"
-
-#: dashboard/modules.py:310
-msgid "Feed URL"
-msgstr "URL потока"
-
-#: dashboard/modules.py:314
-msgid "RSS Feed"
-msgstr "RSS поток"
-
-#: dashboard/modules.py:356
-msgid "You must install the FeedParser python module"
-msgstr "Необходимо установить python модуль FeedParser"
-
-#: dashboard/modules.py:361
-msgid "You must provide a valid feed URL"
-msgstr "Необходимо указать корректный URL потока"
-
 #: dashboard/templates/admin/app_index.html:32
 #: dashboard/templates/jet.dashboard/update_module.html:14
-#: templates/admin/base.html:95 templates/admin/base.html.py:144
+#: templates/admin/base.html:117 templates/admin/base.html.py:173
 #: templates/admin/change_form.html:17 templates/admin/change_list.html:33
 #: templates/admin/delete_confirmation.html:8
 #: templates/admin/delete_selected_confirmation.html:8
@@ -454,14 +498,6 @@ msgstr "Сбросить виджеты"
 msgid "Are you sure want to reset widgets?"
 msgstr "Вы точно хотите сбросить виджеты?"
 
-#: dashboard/templates/jet.dashboard/module.html:19
-#: dashboard/templates/jet.dashboard/modules/app_list.html:24
-#: dashboard/templates/jet.dashboard/modules/model_list.html:14
-#: dashboard/views.py:86 templates/admin/edit_inline/stacked.html:44
-#: templates/admin/edit_inline/tabular.html:39 templates/admin/index.html:40
-msgid "Change"
-msgstr ""
-
 #: dashboard/templates/jet.dashboard/module.html:22
 #: templates/admin/delete_confirmation.html:12
 #: templates/admin/related_widget_wrapper.html:24
@@ -469,55 +505,22 @@ msgstr ""
 msgid "Delete"
 msgstr ""
 
-#: dashboard/templates/jet.dashboard/modules/app_list.html:7
-#: dashboard/templates/jet.dashboard/modules/app_list.html:10
-#: templates/admin/index.html:23 templates/admin/index.html.py:26
-#, python-format
-msgid "Models in the %(name)s application"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/modules/feed.html:13
-#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:34
-#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_chart.html:30
-#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_totals.html:23
-#: dashboard/templates/jet.dashboard/modules/link_list.html:26
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:34
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_chart.html:30
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_totals.html:23
-msgid "Nothing to show"
-msgstr "Содержимое отсутствует"
-
-#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:14
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:14
-msgid "Date"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/modules/recent_actions.html:6
-#: templates/admin/index.html:75
-msgid "None available"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/modules/recent_actions.html:29
-#: templates/admin/index.html:98
-msgid "Unknown content"
-msgstr ""
-
 #: dashboard/templates/jet.dashboard/update_module.html:35
 #: templates/admin/change_form.html:62
 msgid "General"
 msgstr "Общее"
 
 #: dashboard/templates/jet.dashboard/update_module.html:56
-#: templates/admin/change_list.html:61
+#: templates/admin/change_list.html:61 templates/admin/login.html:27
 #: templates/admin/edit_inline/stacked.html:8
 #: templates/admin/edit_inline/tabular.html:10
-#: templates/admin/includes/fieldset.html:9 templates/admin/login.html:27
+#: templates/admin/includes/fieldset.html:9
 #: templates/registration/password_change_form.html:21
 msgid "Please correct the errors below."
 msgstr ""
 
 #: dashboard/templates/jet.dashboard/update_module.html:126
-#: templates/admin/base.html:214 templates/admin/base.html.py:221
+#: templates/admin/base.html:301 templates/admin/base.html.py:308
 #: templates/admin/edit_inline/stacked.html:21
 #: templates/admin/edit_inline/stacked.html:75
 #: templates/admin/edit_inline/tabular.html:100
@@ -536,40 +539,37 @@ msgstr ""
 msgid "Save"
 msgstr ""
 
-#: dashboard/views.py:18
-msgid "Widget was successfully updated"
-msgstr "Виджет успешно изменен"
-
-#: dashboard/views.py:90 dashboard/views.py:91
-msgid "Items"
-msgstr "Элементы"
-
-#: dashboard/views.py:153
-msgid "Widget has been successfully added"
-msgstr "Виджет успешно добавлен"
-
-#: models.py:13
-msgid "title"
+#: dashboard/templates/jet.dashboard/modules/app_list.html:7
+#: dashboard/templates/jet.dashboard/modules/app_list.html:10
+#: templates/admin/index.html:23 templates/admin/index.html.py:26
+#, python-format
+msgid "Models in the %(name)s application"
 msgstr ""
 
-#: models.py:15 models.py:30
-msgid "date created"
-msgstr ""
+#: dashboard/templates/jet.dashboard/modules/feed.html:13
+#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:34
+#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_chart.html:30
+#: dashboard/templates/jet.dashboard/modules/google_analytics_visitors_totals.html:23
+#: dashboard/templates/jet.dashboard/modules/link_list.html:26
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:34
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_chart.html:30
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_visitors_totals.html:23
+msgid "Nothing to show"
+msgstr "Содержимое отсутствует"
 
-#: models.py:18
-msgid "bookmark"
+#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:14
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:14
+msgid "Date"
 msgstr ""
 
-#: models.py:19 templates/admin/base.html:207
-msgid "bookmarks"
-msgstr "закладки"
-
-#: models.py:33
-msgid "pinned application"
+#: dashboard/templates/jet.dashboard/modules/recent_actions.html:6
+#: templates/admin/index.html:75
+msgid "None available"
 msgstr ""
 
-#: models.py:34
-msgid "pinned applications"
+#: dashboard/templates/jet.dashboard/modules/recent_actions.html:29
+#: templates/admin/index.html:98
+msgid "Unknown content"
 msgstr ""
 
 #: templates/admin/actions.html:8
@@ -593,33 +593,40 @@ msgstr ""
 msgid "Clear selection"
 msgstr ""
 
-#: templates/admin/base.html:149
+#: templates/admin/base.html:80
+msgid "current theme"
+msgstr ""
+
+#: templates/admin/base.html:159
+msgid "back"
+msgstr "назад"
+
+#: templates/admin/base.html:180
 msgid "View site"
 msgstr "Открыть сайт"
 
-#: templates/admin/base.html:189 templates/admin/base.html.py:206
+#: templates/admin/base.html:188
+msgid "Documentation"
+msgstr ""
+
+#: templates/admin/base.html:276 templates/admin/base.html.py:293
 msgid "Add bookmark"
 msgstr "Добавить закладку"
 
-#: templates/admin/base.html:202
+#: templates/admin/base.html:289
 msgid "Delete bookmark"
 msgstr "Удалить закладку"
 
-#: templates/admin/base.html:203
+#: templates/admin/base.html:290
 msgid "Are you sure want to delete this bookmark?"
 msgstr "Вы точно хотите удалить эту закладку?"
 
-#: templates/admin/base.html:229
-msgid "Documentation"
-msgstr ""
-
-#: templates/admin/base.html:252
+#: templates/admin/base.html:333
 msgid "Application page"
 msgstr "Страница приложения"
 
 #: templates/admin/base_site.html:3
 #, fuzzy
-#| msgid "Django irc channel"
 msgid "Django site admin"
 msgstr "IRC канал Django"
 
@@ -723,19 +730,11 @@ msgid ""
 "following objects and their related items will be deleted:"
 msgstr ""
 
-#: templates/admin/edit_inline/tabular.html:25
-msgid "Delete?"
-msgstr ""
-
 #: templates/admin/filter.html:6
 #, python-format
 msgid "%(filter_title)s"
 msgstr ""
 
-#: templates/admin/includes/object_delete_summary.html:2
-msgid "Summary"
-msgstr ""
-
 #: templates/admin/index.html:56
 msgid "You don't have permission to edit anything."
 msgstr ""
@@ -762,7 +761,6 @@ msgstr ""
 
 #: templates/admin/object_history.html:23
 #, fuzzy
-#| msgid "Applications"
 msgid "Action"
 msgstr "Приложения"
 
@@ -779,17 +777,17 @@ msgstr ""
 #: templates/admin/related_widget_wrapper.html:8
 #, python-format
 msgid "Change selected %(model)s"
-msgstr ""
+msgstr "Изменить выбранный объект типа %(model)s"
 
 #: templates/admin/related_widget_wrapper.html:15
 #, python-format
 msgid "Add another %(model)s"
-msgstr ""
+msgstr "Добавить ещё один объект типа %(model)s"
 
 #: templates/admin/related_widget_wrapper.html:22
 #, python-format
 msgid "Delete selected %(model)s"
-msgstr ""
+msgstr "Удалить выбранный объект типа %(model)s"
 
 #: templates/admin/search_form.html:6 templates/admin/search_form.html:17
 msgid "Search"
@@ -820,6 +818,14 @@ msgstr ""
 msgid "Save and continue editing"
 msgstr ""
 
+#: templates/admin/edit_inline/tabular.html:25
+msgid "Delete?"
+msgstr ""
+
+#: templates/admin/includes/object_delete_summary.html:2
+msgid "Summary"
+msgstr ""
+
 #: templates/registration/logged_out.html:9
 msgid "Thanks for spending some quality time with the Web site today."
 msgstr ""

+ 0 - 0
jet/management/__init__.py


+ 0 - 0
jet/management/commands/__init__.py


+ 39 - 0
jet/management/commands/jet_custom_apps_example.py

@@ -0,0 +1,39 @@
+from django.core.management.base import NoArgsCommand
+from jet.utils import get_app_list
+
+
+class Command(NoArgsCommand):
+    help = 'Generates example of JET custom apps setting'
+    item_order = 0
+
+    def handle_noargs(self, **options):
+        class User:
+            is_active = True
+            is_staff = True
+
+            def has_module_perms(self, app):
+                return True
+
+            def has_perm(self, object):
+                return True
+
+        class Request:
+            user = User()
+
+        app_list = get_app_list({
+            'request': Request(),
+            'user': None
+        })
+
+        self.stdout.write('# Add this to your settings.py to customize applications and models list')
+        self.stdout.write('JET_SIDE_MENU_CUSTOM_APPS = [')
+
+        for app in app_list:
+            app_label = app.get('app_label', app.get('name'))
+
+            self.stdout.write('    (\'%s\', [' % app_label)
+            for model in app['models']:
+                self.stdout.write('        \'%s\',' % model['object_name'])
+            self.stdout.write('    ]),')
+
+        self.stdout.write(']')

+ 0 - 8
jet/ordered_set.py

@@ -57,11 +57,3 @@ class OrderedSet(collections.MutableSet):
         if isinstance(other, OrderedSet):
             return len(self) == len(other) and list(self) == list(other)
         return set(self) == set(other)
-
-
-if __name__ == '__main__':
-    s = OrderedSet('abracadaba')
-    t = OrderedSet('simsalabim')
-    print(s | t)
-    print(s & t)
-    print(s - t)

+ 4 - 0
jet/settings.py

@@ -3,3 +3,7 @@ from django.conf import settings
 # Theme
 JET_DEFAULT_THEME = getattr(settings, 'JET_DEFAULT_THEME', 'default')
 JET_THEMES = getattr(settings, 'JET_THEMES', [])
+
+# Side menu
+JET_SIDE_MENU_COMPACT = getattr(settings, 'JET_SIDE_MENU_COMPACT', False)
+JET_SIDE_MENU_CUSTOM_APPS = getattr(settings, 'JET_SIDE_MENU_CUSTOM_APPS', None)

+ 0 - 0
jet/static/admin/css/changelists.css


+ 0 - 1
jet/static/admin/js/SelectFilter2.min.js

@@ -1 +0,0 @@
-var SelectFilter={init:function(e,t,n,r){}};

+ 0 - 1
jet/static/admin/js/admin/DateTimeShortcuts.min.js

@@ -1 +0,0 @@
-

+ 169 - 0
jet/static/admin/js/admin/RelatedObjectLookups.js

@@ -0,0 +1,169 @@
+// Handles related-objects functionality: lookup link for raw_id_fields
+// and Add Another links.
+
+function html_unescape(text) {
+    // Unescape a string that was escaped using django.utils.html.escape.
+    text = text.replace(/&lt;/g, '<');
+    text = text.replace(/&gt;/g, '>');
+    text = text.replace(/&quot;/g, '"');
+    text = text.replace(/&#39;/g, "'");
+    text = text.replace(/&amp;/g, '&');
+    return text;
+}
+
+// IE doesn't accept periods or dashes in the window name, but the element IDs
+// we use to generate popup window names may contain them, therefore we map them
+// to allowed characters in a reversible way so that we can locate the correct
+// element when the popup window is dismissed.
+function id_to_windowname(text) {
+    text = text.replace(/\./g, '__dot__');
+    text = text.replace(/\-/g, '__dash__');
+    return text;
+}
+
+function windowname_to_id(text) {
+    text = text.replace(/__dot__/g, '.');
+    text = text.replace(/__dash__/g, '-');
+    return text;
+}
+
+function showAdminPopup(triggeringLink, name_regexp) {
+    var name = triggeringLink.id.replace(name_regexp, '');
+    name = id_to_windowname(name);
+    var href = triggeringLink.href;
+    if (href.indexOf('?') == -1) {
+        href += '?_popup=1';
+    } else {
+        href  += '&_popup=1';
+    }
+
+    // Django JET
+    showRelatedPopup(name, href);
+
+    return false;
+}
+
+function showRelatedObjectLookupPopup(triggeringLink) {
+    return showAdminPopup(triggeringLink, /^lookup_/);
+}
+
+function dismissRelatedLookupPopup(win, chosenId) {
+    var name = windowname_to_id(win.name);
+    var elem = document.getElementById(name);
+    if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
+        elem.value += ',' + chosenId;
+    } else {
+        document.getElementById(name).value = chosenId;
+    }
+
+    // Django JET
+    closeRelatedPopup(win);
+}
+
+function showRelatedObjectPopup(triggeringLink) {
+    var name = triggeringLink.id.replace(/^(change|add|delete)_/, '');
+    name = id_to_windowname(name);
+    var href = triggeringLink.href;
+
+    // Django JET
+    showRelatedPopup(name, href);
+
+    return false;
+}
+
+function dismissAddRelatedObjectPopup(win, newId, newRepr) {
+    // newId and newRepr are expected to have previously been escaped by
+    // django.utils.html.escape.
+    newId = html_unescape(newId);
+    newRepr = html_unescape(newRepr);
+    var name = windowname_to_id(win.name);
+    var elem = document.getElementById(name);
+    var o;
+    if (elem) {
+        var elemName = elem.nodeName.toUpperCase();
+        if (elemName == 'SELECT') {
+            o = new Option(newRepr, newId);
+            elem.options[elem.options.length] = o;
+            o.selected = true;
+        } else if (elemName == 'INPUT') {
+            if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
+                elem.value += ',' + newId;
+            } else {
+                elem.value = newId;
+            }
+        }
+        // Trigger a change event to update related links if required.
+        django.jQuery(elem).trigger('change');
+    } else {
+        var toId = name + "_to";
+        o = new Option(newRepr, newId);
+        SelectBox.add_to_cache(toId, o);
+        SelectBox.redisplay(toId);
+    }
+
+    // Django JET
+    closeRelatedPopup(win);
+}
+
+function dismissChangeRelatedObjectPopup(win, objId, newRepr, newId) {
+    objId = html_unescape(objId);
+    newRepr = html_unescape(newRepr);
+    var id = windowname_to_id(win.name).replace(/^edit_/, '');
+    var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
+    var selects = django.jQuery(selectsSelector);
+    selects.find('option').each(function() {
+        if (this.value == objId) {
+            this.innerHTML = newRepr;
+            this.value = newId;
+        }
+    });
+
+    // Django JET
+    closeRelatedPopup(win);
+};
+
+function dismissDeleteRelatedObjectPopup(win, objId) {
+    objId = html_unescape(objId);
+    var id = windowname_to_id(win.name).replace(/^delete_/, '');
+    var selectsSelector = interpolate('#%s, #%s_from, #%s_to', [id, id, id]);
+    var selects = django.jQuery(selectsSelector);
+    selects.find('option').each(function() {
+        if (this.value == objId) {
+            django.jQuery(this).remove();
+        }
+    }).trigger('change');
+
+    // Django JET
+    closeRelatedPopup(win);
+};
+
+// Kept for backward compatibility
+showAddAnotherPopup = showRelatedObjectPopup;
+dismissAddAnotherPopup = dismissAddRelatedObjectPopup;
+
+// Django JET
+
+opener = parent.window;
+
+function showRelatedPopup(name, href) {
+    django.jQuery(function($) {
+        var $container = $('.related-popup-container');
+        var $loading = $container.find('.loading-indicator');
+        var $popup = $('<iframe>').attr('name', name).attr('src', href).addClass('related-popup').on('load', function() {
+            $popup.add($('.related-popup-back')).fadeIn(200, 'swing', function() {
+                $loading.hide();
+            });
+        });
+
+        $loading.show();
+        $container.fadeIn(200, 'swing', function() {
+            $('.related-popup-container').append($popup);
+        });
+        $('body').addClass('non-scrollable');
+    });
+}
+
+function closeRelatedPopup(win) {
+    jet.jQuery('select').trigger('select:init');
+    jet.jQuery(win.parent).trigger('related-popup:close');
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/admin/js/inlines.min.js


+ 0 - 1
jet/static/admin/js/related-widget-wrapper.min.js

@@ -1 +0,0 @@
-django.jQuery(document).ready(function(){jet.jQuery(function(e){function t(){var t=e(this),n=t.nextAll(".change-related, .delete-related");if(!n.length)return;var r=t.val();r?n.each(function(){var t=e(this);t.attr("href",t.attr("data-href-template").replace("__fk__",r))}):n.removeAttr("href")}var n=e(document);n.on("change",".related-widget-wrapper select",t),n.find(".related-widget-wrapper select").each(t),n.on("click",".related-widget-wrapper-link",function(e){this.href&&showRelatedObjectPopup(this),e.preventDefault()})})});

+ 7 - 1
jet/static/jet/css/_base.scss

@@ -53,6 +53,11 @@ a:hover {
   padding: 20px;
 }
 
+.module {
+  border: 0;
+  margin: 0;
+}
+
 @import "table";
 @import "buttongroup";
 @import "sidebar";
@@ -64,4 +69,5 @@ a:hover {
 @import "delete";
 @import "login";
 @import "content";
-@import "dashboard";
+@import "dashboard";
+@import "relatedpopup";

+ 25 - 13
jet/static/jet/css/_changeform.scss

@@ -1,11 +1,9 @@
 @import "globals";
 
 .module {
-  border: 0;
-  margin: 0;
-  padding: 20px;
-  background-color: $content-background-color;
-  border-radius: 4px;
+  &-separator {
+    height: 1em;
+  }
 
   .form-row {
     padding: 6px 0;
@@ -24,6 +22,10 @@
       }
     }
 
+    br {
+      clear: both;
+    }
+
     &.errors label {
       color: $error-text-color;
     }
@@ -48,6 +50,7 @@
       @extend .clear-list;
       @extend .small;
       color: $error-text-color;
+      margin-bottom: 10px !important;
     }
 
     .datetime {
@@ -101,6 +104,23 @@
       }
     }
   }
+
+  &.aligned {
+    background-color: $content-background-color;
+    border-radius: 4px;
+    padding: 20px;
+
+    ul label {
+      display: inline;
+      float: none;
+      width: auto;
+    }
+
+    ul {
+      margin: 0 0 0 160px;
+      padding: 0;
+    }
+  }
 }
 
 .submit-row {
@@ -175,10 +195,6 @@
   }
 
   .module {
-    padding: 0;
-    background: none;
-    border-radius: 0;
-
     .form-row {
       .select2 {
         max-width: 800px - 20px * 2 - 150px - 24px;
@@ -186,10 +202,6 @@
     }
   }
 
-  .aligned {
-    padding: 20px 20px 0 20px;
-  }
-
   .inline-group {
     .errornote {
       color: $error-text-color;

+ 13 - 0
jet/static/jet/css/_content.scss

@@ -8,17 +8,30 @@
   width: 500px;
 }
 
+#content {
+  > h1 {
+    text-transform: uppercase;
+    font-size: 12px;
+    font-weight: bold;
+    line-height: $top-height;
+    color: $top-text-color;
+    margin: 0 0 2em 0;
+  }
+}
+
 .small {
   font-size: 12px;
 }
 
 .changeform-object-tools {
   text-align: right;
+  overflow: auto;
 }
 
 ul.object-tools {
   @extend .clear-list;
   margin-bottom: 20px !important;
+  float: right;
 
   li {
     margin-top: 10px;

+ 7 - 0
jet/static/jet/css/_helpers.scss

@@ -104,6 +104,13 @@
   transition: $values;
 }
 
+@mixin transform($transform) {
+  -webkit-transform: $transform;
+  -moz-transform: $transform;
+  -o-transform: $transform;
+  transform: $transform;
+}
+
 @mixin font-icon {
   font-family: 'jet-icons';
   speak: none;

+ 71 - 0
jet/static/jet/css/_relatedpopup.scss

@@ -0,0 +1,71 @@
+@import "globals";
+
+.related-popup {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 4;
+  border: 0;
+  width: 100%;
+  height: 100%;
+  padding-left: 250px;
+  box-sizing: border-box;
+  display: none;
+  background: $background-color;
+  background-clip: content-box;
+
+  &-container {
+    display: none;
+    background-color: transparentize($sidebar-popup-overlay-color, 0.5);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 3;
+
+    .loading-indicator {
+      display: none;
+      font-size: 96px;
+      color: $content-contrast2-text-color;
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -48px;
+      margin-top: -48px;
+    }
+  }
+
+  &-back {
+    &, &:visited, &:hover {
+      display: none;
+      background: $content-contrast2-background-color;
+      color: $content-contrast2-text-color;
+      position: absolute;
+      top: 20px;
+      left: 250px;
+      z-index: 5;
+      width: 100px;
+      padding: 14px 6px 14px 0;
+      text-align: center;
+      margin-left: -100px;
+      box-sizing: border-box;
+      text-transform: uppercase;
+      border-radius: 6px 0 0 6px;
+      @include transition(background-color $transitions-duration, color $transitions-duration);
+    }
+
+    &:hover {
+      background: $background-color;
+      color: $text-color;
+    }
+
+    span {
+      vertical-align: middle;
+      font-weight: bold;
+      font-size: 18px;
+    }
+  }
+}

+ 26 - 3
jet/static/jet/css/_sidebar.scss

@@ -43,6 +43,9 @@
           overflow: hidden;
           text-overflow: ellipsis;
           white-space: nowrap;
+          width: 100%;
+          display: inline-block;
+          box-sizing: border-box;
           @include transition(color $transitions-duration);
         }
 
@@ -59,14 +62,16 @@
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
-        padding: 0 24px;
+        padding: 0 14px 0 24px;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         @include transition(color $transitions-duration);
 
         &-icon {
           float: right;
           font-size: 14px;
           font-weight: bold !important;
-          margin-right: 14px;
 
           &, &:visited, &:hover {
             color: $sidebar-title-action-color;
@@ -79,6 +84,24 @@
         }
       }
 
+      &-link {
+        &, &:visited, &:hover {
+          color: $sidebar-text-color;
+          text-transform: uppercase;
+          font-size: 11px;
+          font-weight: bold;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+          padding: 0 24px;
+          @include transition(color $transitions-duration);
+        }
+
+        &:hover {
+          color: $sidebar-hover-title-action-item-color;
+        }
+      }
+
       &-action {
         &, &:visited, &:hover {
           display: block;
@@ -100,7 +123,7 @@
       &-list {
         @extend .clear-list;
 
-        .sidebar-menu-item-title + &:not(:empty) {
+        .sidebar-menu-item-title + &:not(:empty), .sidebar-menu-item-link + &:not(:empty) {
           margin-top: 10px !important;
         }
 

+ 2 - 0
jet/static/jet/css/_top.scss

@@ -60,11 +60,13 @@
         color: $top-icon-color;
         font-size: 24px;
         line-height: $top-height - 2px !important;
+        @include transition(color $transitions-duration);
       }
     }
 
     &.opened &-welcome-msg-arrow {
       color: $top-dropdown-icon-color;
+      @include transform(rotate(180deg));
     }
 
     &-contrast-block {

+ 54 - 49
jet/static/jet/css/icons/style.css

@@ -1,118 +1,123 @@
 @font-face {
-	font-family: 'jet-icons';
-	src:url('fonts/jet-icons.eot?-lem1jo');
-	src:url('fonts/jet-icons.eot?#iefix-lem1jo') format('embedded-opentype'),
-		url('fonts/jet-icons.ttf?-lem1jo') format('truetype'),
-		url('fonts/jet-icons.woff?-lem1jo') format('woff'),
-		url('fonts/jet-icons.svg?-lem1jo#jet-icons') format('svg');
-	font-weight: normal;
-	font-style: normal;
+    font-family: 'jet-icons';
+    src:    url('fonts/jet-icons.eot?2orr6h');
+    src:    url('fonts/jet-icons.eot?2orr6h#iefix') format('embedded-opentype'),
+        url('fonts/jet-icons.ttf?2orr6h') format('truetype'),
+        url('fonts/jet-icons.woff?2orr6h') format('woff'),
+        url('fonts/jet-icons.svg?2orr6h#jet-icons') format('svg');
+    font-weight: normal;
+    font-style: normal;
 }
 
 [class^="icon-"], [class*=" icon-"] {
-	font-family: 'jet-icons';
-	speak: none;
-	font-style: normal;
-	font-weight: normal;
-	font-variant: normal;
-	text-transform: none;
-	line-height: 1;
+    /* use !important to prevent issues with browser extensions that change fonts */
+    font-family: 'jet-icons' !important;
+    speak: none;
+    font-style: normal;
+    font-weight: normal;
+    font-variant: normal;
+    text-transform: none;
+    line-height: 1;
 
-	/* Better Font Rendering =========== */
-	-webkit-font-smoothing: antialiased;
-	-moz-osx-font-smoothing: grayscale;
+    /* Better Font Rendering =========== */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-order:before {
+    content: "\e901";
+}
 .icon-reset:before {
-	content: "\e61e";
+    content: "\e61e";
 }
 .icon-search:before {
-	content: "\e61d";
+    content: "\e61d";
 }
 .icon-user:before {
-	content: "\e61c";
+    content: "\e61c";
 }
 .icon-jet:before {
-	content: "\e61b";
+    content: "\e61b";
 }
 .icon-refresh:before {
-	content: "\e61a";
+    content: "\e61a";
 }
 .icon-grid:before {
-	content: "\e619";
+    content: "\e619";
 }
 .icon-star:before {
-	content: "\e618";
+    content: "\e618";
 }
 .icon-pin:before {
-	content: "\e617";
+    content: "\e617";
 }
 .icon-new:before {
-	content: "\e616";
+    content: "\e616";
 }
 .icon-edit:before {
-	content: "\e615";
+    content: "\e615";
 }
 .icon-clock:before {
-	content: "\e611";
+    content: "\e611";
 }
 .icon-calendar:before {
-	content: "\e612";
+    content: "\e612";
 }
 .icon-book:before {
-	content: "\e60d";
+    content: "\e60d";
 }
 .icon-open-external:before {
-	content: "\e60e";
+    content: "\e60e";
 }
 .icon-data:before {
-	content: "\e60f";
+    content: "\e60f";
 }
 .icon-question:before {
-	content: "\e613";
+    content: "\e613";
 }
 .icon-tick:before {
-	content: "\e614";
+    content: "\e614";
 }
 .icon-cross:before {
-	content: "\e610";
+    content: "\e610";
 }
 .icon-key:before {
-	content: "\e60c";
+    content: "\e60c";
 }
 .icon-arrow-right:before {
-	content: "\e60b";
+    content: "\e60b";
 }
 .icon-arrow-left:before {
-	content: "\e60a";
+    content: "\e60a";
 }
 .icon-arrow-down:before {
-	content: "\e608";
+    content: "\e608";
 }
 .icon-arrow-up:before {
-	content: "\e609";
+    content: "\e609";
 }
 .icon-checkbox-outline:before {
-	content: "\e607";
+    content: "\e607";
 }
 .icon-remove:before {
-	content: "\e600";
+    content: "\e600";
 }
 .icon-add2:before {
-	content: "\e601";
+    content: "\e601";
 }
 .icon-exit:before {
-	content: "\e602";
+    content: "\e602";
 }
 .icon-add:before {
-	content: "\e603";
+    content: "\e603";
 }
 .icon-add3:before {
-	content: "\e604";
+    content: "\e604";
 }
 .icon-expand:before {
-	content: "\e605";
+    content: "\e605";
 }
 .icon-checkbox:before {
-	content: "\e606";
+    content: "\e606";
 }
+

+ 499 - 89
jet/static/jet/css/themes/default/base.css

@@ -349,6 +349,10 @@ a:hover {
 #content {
   padding: 20px; }
 
+.module {
+  border: 0;
+  margin: 0; }
+
 /*
  * Default variable values
  * Create separate themes/theme/_variables.scss to override these variables
@@ -1434,6 +1438,9 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1448,7 +1455,10 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
-        padding: 0 24px;
+        padding: 0 14px 0 24px;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1456,8 +1466,7 @@ a:hover {
         .sidebar-menu-item-title-icon {
           float: right;
           font-size: 14px;
-          font-weight: bold !important;
-          margin-right: 14px; }
+          font-weight: bold !important; }
           .sidebar-menu-item-title-icon, .sidebar-menu-item-title-icon:visited, .sidebar-menu-item-title-icon:hover {
             color: #47bac1;
             -webkit-transition: color 0.3s;
@@ -1466,6 +1475,21 @@ a:hover {
             transition: color 0.3s; }
           .sidebar-menu-item-title-icon:hover {
             color: #639af5; }
+      .sidebar-menu-item-link, .sidebar-menu-item-link:visited, .sidebar-menu-item-link:hover {
+        color: #6f7e95;
+        text-transform: uppercase;
+        font-size: 11px;
+        font-weight: bold;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 24px;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
+      .sidebar-menu-item-link:hover {
+        color: #639af5; }
       .sidebar-menu-item-action, .sidebar-menu-item-action:visited, .sidebar-menu-item-action:hover {
         display: block;
         color: #47bac1;
@@ -1481,7 +1505,7 @@ a:hover {
       .sidebar-menu-item-action:hover {
         color: #639af5;
         background-color: #2b3647; }
-      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty) {
+      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty), .sidebar-menu-item-link + .sidebar-menu-item-list:not(:empty) {
         margin-top: 10px !important; }
       .sidebar-menu-item-list-item.empty {
         display: none; }
@@ -1976,9 +2000,17 @@ a:hover {
         float: right;
         color: #47bac1;
         font-size: 24px;
-        line-height: 30px !important; }
+        line-height: 30px !important;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
     .top-user-tools.opened .top-user-tools-welcome-msg-arrow {
-      color: #ecf2f6; }
+      color: #ecf2f6;
+      -webkit-transform: rotate(180deg);
+      -moz-transform: rotate(180deg);
+      -o-transform: rotate(180deg);
+      transform: rotate(180deg); }
     .top-user-tools-contrast-block {
       display: none;
       padding: 8px 14px;
@@ -3431,80 +3463,90 @@ table#change-history {
 .fill_width {
   width: 100% !important; }
 
-.module {
-  border: 0;
-  margin: 0;
-  padding: 20px;
-  background-color: #fff;
-  border-radius: 4px; }
-  .module .form-row {
-    padding: 6px 0;
-    overflow: hidden; }
-    .module .form-row label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word; }
-      .module .form-row label + p {
-        padding-top: 6px;
-        margin: 4px 0 4px 160px; }
-    .module .form-row.errors label {
-      color: #c14747; }
-    .module .form-row .checkbox-row label {
-      float: none;
-      display: inline; }
-    .module .form-row .help {
-      clear: left;
-      color: #d0dbe6;
-      margin: 12px 0 0 160px; }
-    .module .form-row .checkbox-row .help {
-      margin-left: 0; }
-    .module .form-row .errorlist {
-      color: #c14747; }
-    .module .form-row .datetime {
-      margin-left: 160px; }
-    .module .form-row .add-related span {
-      font-size: 18px;
-      vertical-align: middle; }
-    .module .form-row .change-related span {
-      font-size: 20px;
-      vertical-align: middle; }
-    .module .form-row .add-another {
-      margin-left: 4px; }
-      .module .form-row .add-another:before {
-        font-family: 'jet-icons';
-        speak: none;
-        font-style: normal;
-        font-weight: normal;
-        font-variant: normal;
-        text-transform: none;
-        line-height: 1;
-        /* Better Font Rendering =========== */
-        -webkit-font-smoothing: antialiased;
-        -moz-osx-font-smoothing: grayscale;
-        display: inline-block;
-        vertical-align: middle;
-        font-size: 18px;
-        content: ""; }
-      .module .form-row .add-another img {
-        display: none; }
-    .module .form-row .field-box {
-      margin-right: 20px;
-      float: left; }
-    .module .form-row .file-upload {
-      background: #f6fafc;
+.module-separator {
+  height: 1em; }
+.module .form-row {
+  padding: 6px 0;
+  overflow: hidden; }
+  .module .form-row label {
+    display: block;
+    padding: 6px 10px 0 0;
+    float: left;
+    width: 150px;
+    word-wrap: break-word; }
+    .module .form-row label + p {
+      padding-top: 6px;
+      margin: 4px 0 4px 160px; }
+  .module .form-row br {
+    clear: both; }
+  .module .form-row.errors label {
+    color: #c14747; }
+  .module .form-row .checkbox-row label {
+    float: none;
+    display: inline; }
+  .module .form-row .help {
+    clear: left;
+    color: #d0dbe6;
+    margin: 12px 0 0 160px; }
+  .module .form-row .checkbox-row .help {
+    margin-left: 0; }
+  .module .form-row .errorlist {
+    color: #c14747;
+    margin-bottom: 10px !important; }
+  .module .form-row .datetime {
+    margin-left: 160px; }
+  .module .form-row .add-related span {
+    font-size: 18px;
+    vertical-align: middle; }
+  .module .form-row .change-related span {
+    font-size: 20px;
+    vertical-align: middle; }
+  .module .form-row .add-another {
+    margin-left: 4px; }
+    .module .form-row .add-another:before {
+      font-family: 'jet-icons';
+      speak: none;
+      font-style: normal;
+      font-weight: normal;
+      font-variant: normal;
+      text-transform: none;
+      line-height: 1;
+      /* Better Font Rendering =========== */
+      -webkit-font-smoothing: antialiased;
+      -moz-osx-font-smoothing: grayscale;
       display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px; }
-      .module .form-row .file-upload .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px; }
+      vertical-align: middle;
+      font-size: 18px;
+      content: ""; }
+    .module .form-row .add-another img {
+      display: none; }
+  .module .form-row .field-box {
+    margin-right: 20px;
+    float: left; }
+  .module .form-row .file-upload {
+    background: #f6fafc;
+    display: inline-block;
+    margin: 0;
+    line-height: 1.5em;
+    padding: 10px;
+    border-radius: 4px; }
+    .module .form-row .file-upload .clearable-file-input label {
+      display: inline;
+      float: none;
+      padding: 0;
+      width: auto;
+      margin-left: 10px; }
+.module.aligned {
+  background-color: #fff;
+  border-radius: 4px;
+  padding: 20px; }
+  .module.aligned ul label {
+    display: inline;
+    float: none;
+    width: auto; }
+  .module.aligned ul {
+    margin: 0 0 0 160px;
+    padding: 0; }
 
 .submit-row {
   padding: 20px 0; }
@@ -3548,14 +3590,8 @@ table#change-history {
       display: none; }
       .changeform-tabs ~ .module .stacked.inline-related.selected {
         display: block; }
-  .changeform .module {
-    padding: 0;
-    background: none;
-    border-radius: 0; }
-    .changeform .module .form-row .select2 {
-      max-width: 586px; }
-  .changeform .aligned {
-    padding: 20px 20px 0 20px; }
+  .changeform .module .form-row .select2 {
+    max-width: 586px; }
   .changeform .inline-group .errornote {
     color: #c14747;
     margin: 0;
@@ -4745,14 +4781,24 @@ table#change-history {
 .dashboard #content {
   width: 500px; }
 
+#content > h1 {
+  text-transform: uppercase;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 32px;
+  color: #6f7e95;
+  margin: 0 0 2em 0; }
+
 .small, .module .form-row .help, .module .form-row .errorlist, .changeform .tabular.inline-related .module .errorlist, .login-form .form-row .errorlist {
   font-size: 12px; }
 
 .changeform-object-tools {
-  text-align: right; }
+  text-align: right;
+  overflow: auto; }
 
 ul.object-tools {
-  margin-bottom: 20px !important; }
+  margin-bottom: 20px !important;
+  float: right; }
   ul.object-tools li {
     margin-top: 10px;
     text-align: right; }
@@ -5302,4 +5348,368 @@ img[src$="admin/img/icon-no.gif"] + span {
   border-radius: 0 4px 4px 0 !important;
   padding: 0 10px !important; }
 
+/*
+ * Default variable values
+ * Create separate themes/theme/_variables.scss to override these variables
+ */
+/*
+ * General
+ */
+/*
+ * Sidebar
+ */
+/*
+ * Top
+ */
+/*
+ * Content
+ */
+/*
+ * Buttons
+ */
+/*
+ * Inputs
+ */
+/*
+ * Messages
+ */
+/*
+ * Login
+ */
+/*
+ * jQuery UI
+ */
+/*
+ * Charts
+ */
+.hidden {
+  display: none; }
+
+.clear-list, .sidebar-menu, .sidebar-menu-item-list, .sidebar-popup-list, .top-user-tools, .messagelist, .module .form-row .errorlist, .changeform-tabs, .changeform .tabular.inline-related .module .errorlist, .changeform .stacked-inline-list, .delete-summary ul, .delete-objects-list, .login-form .form-row .errorlist, ul.object-tools, .dashboard-item-content ul:not(.inline), .dashboard-item-content ul.inline {
+  margin: 0;
+  padding: 0;
+  list-style: none; }
+
+.fl {
+  float: left; }
+
+.fr {
+  float: right; }
+
+.cf:before, .cf:after {
+  content: "";
+  display: table; }
+
+.cf:after {
+  clear: both; }
+
+.p10 {
+  padding: 10px; }
+
+.p20 {
+  padding: 20px; }
+
+.p30 {
+  padding: 30px; }
+
+.p40 {
+  padding: 40px; }
+
+.p50 {
+  padding: 50px; }
+
+.p60 {
+  padding: 60px; }
+
+.p70 {
+  padding: 70px; }
+
+.p80 {
+  padding: 80px; }
+
+.pt10 {
+  padding-top: 10px; }
+
+.pt20 {
+  padding-top: 20px; }
+
+.pt30 {
+  padding-top: 30px; }
+
+.pt40 {
+  padding-top: 40px; }
+
+.pt50 {
+  padding-top: 50px; }
+
+.pt60 {
+  padding-top: 60px; }
+
+.pt70 {
+  padding-top: 70px; }
+
+.pt80 {
+  padding-top: 80px; }
+
+.pr10 {
+  padding-right: 10px; }
+
+.pr20 {
+  padding-right: 20px; }
+
+.pr30 {
+  padding-right: 30px; }
+
+.pr40 {
+  padding-right: 40px; }
+
+.pr50 {
+  padding-right: 50px; }
+
+.pr60 {
+  padding-right: 60px; }
+
+.pr70 {
+  padding-right: 70px; }
+
+.pr80 {
+  padding-right: 80px; }
+
+.pb10 {
+  padding-bottom: 10px; }
+
+.pb20 {
+  padding-bottom: 20px; }
+
+.pb30 {
+  padding-bottom: 30px; }
+
+.pb40 {
+  padding-bottom: 40px; }
+
+.pb50 {
+  padding-bottom: 50px; }
+
+.pb60 {
+  padding-bottom: 60px; }
+
+.pb70 {
+  padding-bottom: 70px; }
+
+.pb80 {
+  padding-bottom: 80px; }
+
+.pl10 {
+  padding-left: 10px; }
+
+.pl20 {
+  padding-left: 20px; }
+
+.pl30 {
+  padding-left: 30px; }
+
+.pl40 {
+  padding-left: 40px; }
+
+.pl50 {
+  padding-left: 50px; }
+
+.pl60 {
+  padding-left: 60px; }
+
+.pl70 {
+  padding-left: 70px; }
+
+.pl80 {
+  padding-left: 80px; }
+
+.m10 {
+  margin: 10px; }
+
+.m20 {
+  margin: 20px; }
+
+.m30 {
+  margin: 30px; }
+
+.m40 {
+  margin: 40px; }
+
+.m50 {
+  margin: 50px; }
+
+.m60 {
+  margin: 60px; }
+
+.m70 {
+  margin: 70px; }
+
+.m80 {
+  margin: 80px; }
+
+.mt10 {
+  margin-top: 10px; }
+
+.mt20 {
+  margin-top: 20px; }
+
+.mt30 {
+  margin-top: 30px; }
+
+.mt40 {
+  margin-top: 40px; }
+
+.mt50 {
+  margin-top: 50px; }
+
+.mt60 {
+  margin-top: 60px; }
+
+.mt70 {
+  margin-top: 70px; }
+
+.mt80 {
+  margin-top: 80px; }
+
+.mr10 {
+  margin-right: 10px; }
+
+.mr20 {
+  margin-right: 20px; }
+
+.mr30 {
+  margin-right: 30px; }
+
+.mr40 {
+  margin-right: 40px; }
+
+.mr50 {
+  margin-right: 50px; }
+
+.mr60 {
+  margin-right: 60px; }
+
+.mr70 {
+  margin-right: 70px; }
+
+.mr80 {
+  margin-right: 80px; }
+
+.mb10 {
+  margin-bottom: 10px; }
+
+.mb20 {
+  margin-bottom: 20px; }
+
+.mb30 {
+  margin-bottom: 30px; }
+
+.mb40 {
+  margin-bottom: 40px; }
+
+.mb50 {
+  margin-bottom: 50px; }
+
+.mb60 {
+  margin-bottom: 60px; }
+
+.mb70 {
+  margin-bottom: 70px; }
+
+.mb80 {
+  margin-bottom: 80px; }
+
+.ml10 {
+  margin-left: 10px; }
+
+.ml20 {
+  margin-left: 20px; }
+
+.ml30 {
+  margin-left: 30px; }
+
+.ml40 {
+  margin-left: 40px; }
+
+.ml50 {
+  margin-left: 50px; }
+
+.ml60 {
+  margin-left: 60px; }
+
+.ml70 {
+  margin-left: 70px; }
+
+.ml80 {
+  margin-left: 80px; }
+
+.pos_rel {
+  position: relative; }
+
+.pos_abs {
+  position: absolute; }
+
+.fill_width {
+  width: 100% !important; }
+
+.related-popup {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 4;
+  border: 0;
+  width: 100%;
+  height: 100%;
+  padding-left: 250px;
+  box-sizing: border-box;
+  display: none;
+  background: #ecf2f6;
+  background-clip: content-box; }
+  .related-popup-container {
+    display: none;
+    background-color: rgba(0, 0, 0, 0.5);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 3; }
+    .related-popup-container .loading-indicator {
+      display: none;
+      font-size: 96px;
+      color: #fff;
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -48px;
+      margin-top: -48px; }
+  .related-popup-back, .related-popup-back:visited, .related-popup-back:hover {
+    display: none;
+    background: #59677e;
+    color: #fff;
+    position: absolute;
+    top: 20px;
+    left: 250px;
+    z-index: 5;
+    width: 100px;
+    padding: 14px 6px 14px 0;
+    text-align: center;
+    margin-left: -100px;
+    box-sizing: border-box;
+    text-transform: uppercase;
+    border-radius: 6px 0 0 6px;
+    -webkit-transition: background-color 0.3s, color 0.3s;
+    -moz-transition: background-color 0.3s, color 0.3s;
+    -o-transition: background-color 0.3s, color 0.3s;
+    transition: background-color 0.3s, color 0.3s; }
+  .related-popup-back:hover {
+    background: #ecf2f6;
+    color: #6f7e95; }
+  .related-popup-back span {
+    vertical-align: middle;
+    font-weight: bold;
+    font-size: 18px; }
+
 /*# sourceMappingURL=base.css.map */

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/default/base.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/default/jquery-ui.theme.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/default/select2.theme.css.map


+ 499 - 89
jet/static/jet/css/themes/green/base.css

@@ -380,6 +380,10 @@ a:hover {
 #content {
   padding: 20px; }
 
+.module {
+  border: 0;
+  margin: 0; }
+
 /*
  * Default variable values
  * Create separate themes/theme/_variables.scss to override these variables
@@ -1465,6 +1469,9 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1479,7 +1486,10 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
-        padding: 0 24px;
+        padding: 0 14px 0 24px;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1487,8 +1497,7 @@ a:hover {
         .sidebar-menu-item-title-icon {
           float: right;
           font-size: 14px;
-          font-weight: bold !important;
-          margin-right: 14px; }
+          font-weight: bold !important; }
           .sidebar-menu-item-title-icon, .sidebar-menu-item-title-icon:visited, .sidebar-menu-item-title-icon:hover {
             color: #44b78b;
             -webkit-transition: color 0.3s;
@@ -1497,6 +1506,21 @@ a:hover {
             transition: color 0.3s; }
           .sidebar-menu-item-title-icon:hover {
             color: #7FB1DC; }
+      .sidebar-menu-item-link, .sidebar-menu-item-link:visited, .sidebar-menu-item-link:hover {
+        color: #62a29c;
+        text-transform: uppercase;
+        font-size: 11px;
+        font-weight: bold;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 24px;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
+      .sidebar-menu-item-link:hover {
+        color: #7FB1DC; }
       .sidebar-menu-item-action, .sidebar-menu-item-action:visited, .sidebar-menu-item-action:hover {
         display: block;
         color: #44b78b;
@@ -1512,7 +1536,7 @@ a:hover {
       .sidebar-menu-item-action:hover {
         color: #7FB1DC;
         background-color: #254d49; }
-      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty) {
+      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty), .sidebar-menu-item-link + .sidebar-menu-item-list:not(:empty) {
         margin-top: 10px !important; }
       .sidebar-menu-item-list-item.empty {
         display: none; }
@@ -2007,9 +2031,17 @@ a:hover {
         float: right;
         color: #44b78b;
         font-size: 24px;
-        line-height: 30px !important; }
+        line-height: 30px !important;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
     .top-user-tools.opened .top-user-tools-welcome-msg-arrow {
-      color: #eff6f5; }
+      color: #eff6f5;
+      -webkit-transform: rotate(180deg);
+      -moz-transform: rotate(180deg);
+      -o-transform: rotate(180deg);
+      transform: rotate(180deg); }
     .top-user-tools-contrast-block {
       display: none;
       padding: 8px 14px;
@@ -3462,80 +3494,90 @@ table#change-history {
 .fill_width {
   width: 100% !important; }
 
-.module {
-  border: 0;
-  margin: 0;
-  padding: 20px;
-  background-color: #fff;
-  border-radius: 4px; }
-  .module .form-row {
-    padding: 6px 0;
-    overflow: hidden; }
-    .module .form-row label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word; }
-      .module .form-row label + p {
-        padding-top: 6px;
-        margin: 4px 0 4px 160px; }
-    .module .form-row.errors label {
-      color: #c14747; }
-    .module .form-row .checkbox-row label {
-      float: none;
-      display: inline; }
-    .module .form-row .help {
-      clear: left;
-      color: #cceae4;
-      margin: 12px 0 0 160px; }
-    .module .form-row .checkbox-row .help {
-      margin-left: 0; }
-    .module .form-row .errorlist {
-      color: #c14747; }
-    .module .form-row .datetime {
-      margin-left: 160px; }
-    .module .form-row .add-related span {
-      font-size: 18px;
-      vertical-align: middle; }
-    .module .form-row .change-related span {
-      font-size: 20px;
-      vertical-align: middle; }
-    .module .form-row .add-another {
-      margin-left: 4px; }
-      .module .form-row .add-another:before {
-        font-family: 'jet-icons';
-        speak: none;
-        font-style: normal;
-        font-weight: normal;
-        font-variant: normal;
-        text-transform: none;
-        line-height: 1;
-        /* Better Font Rendering =========== */
-        -webkit-font-smoothing: antialiased;
-        -moz-osx-font-smoothing: grayscale;
-        display: inline-block;
-        vertical-align: middle;
-        font-size: 18px;
-        content: ""; }
-      .module .form-row .add-another img {
-        display: none; }
-    .module .form-row .field-box {
-      margin-right: 20px;
-      float: left; }
-    .module .form-row .file-upload {
-      background: #f5fdfa;
+.module-separator {
+  height: 1em; }
+.module .form-row {
+  padding: 6px 0;
+  overflow: hidden; }
+  .module .form-row label {
+    display: block;
+    padding: 6px 10px 0 0;
+    float: left;
+    width: 150px;
+    word-wrap: break-word; }
+    .module .form-row label + p {
+      padding-top: 6px;
+      margin: 4px 0 4px 160px; }
+  .module .form-row br {
+    clear: both; }
+  .module .form-row.errors label {
+    color: #c14747; }
+  .module .form-row .checkbox-row label {
+    float: none;
+    display: inline; }
+  .module .form-row .help {
+    clear: left;
+    color: #cceae4;
+    margin: 12px 0 0 160px; }
+  .module .form-row .checkbox-row .help {
+    margin-left: 0; }
+  .module .form-row .errorlist {
+    color: #c14747;
+    margin-bottom: 10px !important; }
+  .module .form-row .datetime {
+    margin-left: 160px; }
+  .module .form-row .add-related span {
+    font-size: 18px;
+    vertical-align: middle; }
+  .module .form-row .change-related span {
+    font-size: 20px;
+    vertical-align: middle; }
+  .module .form-row .add-another {
+    margin-left: 4px; }
+    .module .form-row .add-another:before {
+      font-family: 'jet-icons';
+      speak: none;
+      font-style: normal;
+      font-weight: normal;
+      font-variant: normal;
+      text-transform: none;
+      line-height: 1;
+      /* Better Font Rendering =========== */
+      -webkit-font-smoothing: antialiased;
+      -moz-osx-font-smoothing: grayscale;
       display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px; }
-      .module .form-row .file-upload .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px; }
+      vertical-align: middle;
+      font-size: 18px;
+      content: ""; }
+    .module .form-row .add-another img {
+      display: none; }
+  .module .form-row .field-box {
+    margin-right: 20px;
+    float: left; }
+  .module .form-row .file-upload {
+    background: #f5fdfa;
+    display: inline-block;
+    margin: 0;
+    line-height: 1.5em;
+    padding: 10px;
+    border-radius: 4px; }
+    .module .form-row .file-upload .clearable-file-input label {
+      display: inline;
+      float: none;
+      padding: 0;
+      width: auto;
+      margin-left: 10px; }
+.module.aligned {
+  background-color: #fff;
+  border-radius: 4px;
+  padding: 20px; }
+  .module.aligned ul label {
+    display: inline;
+    float: none;
+    width: auto; }
+  .module.aligned ul {
+    margin: 0 0 0 160px;
+    padding: 0; }
 
 .submit-row {
   padding: 20px 0; }
@@ -3579,14 +3621,8 @@ table#change-history {
       display: none; }
       .changeform-tabs ~ .module .stacked.inline-related.selected {
         display: block; }
-  .changeform .module {
-    padding: 0;
-    background: none;
-    border-radius: 0; }
-    .changeform .module .form-row .select2 {
-      max-width: 586px; }
-  .changeform .aligned {
-    padding: 20px 20px 0 20px; }
+  .changeform .module .form-row .select2 {
+    max-width: 586px; }
   .changeform .inline-group .errornote {
     color: #c14747;
     margin: 0;
@@ -4776,14 +4812,24 @@ table#change-history {
 .dashboard #content {
   width: 500px; }
 
+#content > h1 {
+  text-transform: uppercase;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 32px;
+  color: #62a29c;
+  margin: 0 0 2em 0; }
+
 .small, .module .form-row .help, .module .form-row .errorlist, .changeform .tabular.inline-related .module .errorlist, .login-form .form-row .errorlist {
   font-size: 12px; }
 
 .changeform-object-tools {
-  text-align: right; }
+  text-align: right;
+  overflow: auto; }
 
 ul.object-tools {
-  margin-bottom: 20px !important; }
+  margin-bottom: 20px !important;
+  float: right; }
   ul.object-tools li {
     margin-top: 10px;
     text-align: right; }
@@ -5333,4 +5379,368 @@ img[src$="admin/img/icon-no.gif"] + span {
   border-radius: 0 4px 4px 0 !important;
   padding: 0 10px !important; }
 
+/*
+ * Default variable values
+ * Create separate themes/theme/_variables.scss to override these variables
+ */
+/*
+ * General
+ */
+/*
+ * Sidebar
+ */
+/*
+ * Top
+ */
+/*
+ * Content
+ */
+/*
+ * Buttons
+ */
+/*
+ * Inputs
+ */
+/*
+ * Messages
+ */
+/*
+ * Login
+ */
+/*
+ * jQuery UI
+ */
+/*
+ * Charts
+ */
+.hidden {
+  display: none; }
+
+.clear-list, .sidebar-menu, .sidebar-menu-item-list, .sidebar-popup-list, .top-user-tools, .messagelist, .module .form-row .errorlist, .changeform-tabs, .changeform .tabular.inline-related .module .errorlist, .changeform .stacked-inline-list, .delete-summary ul, .delete-objects-list, .login-form .form-row .errorlist, ul.object-tools, .dashboard-item-content ul:not(.inline), .dashboard-item-content ul.inline {
+  margin: 0;
+  padding: 0;
+  list-style: none; }
+
+.fl {
+  float: left; }
+
+.fr {
+  float: right; }
+
+.cf:before, .cf:after {
+  content: "";
+  display: table; }
+
+.cf:after {
+  clear: both; }
+
+.p10 {
+  padding: 10px; }
+
+.p20 {
+  padding: 20px; }
+
+.p30 {
+  padding: 30px; }
+
+.p40 {
+  padding: 40px; }
+
+.p50 {
+  padding: 50px; }
+
+.p60 {
+  padding: 60px; }
+
+.p70 {
+  padding: 70px; }
+
+.p80 {
+  padding: 80px; }
+
+.pt10 {
+  padding-top: 10px; }
+
+.pt20 {
+  padding-top: 20px; }
+
+.pt30 {
+  padding-top: 30px; }
+
+.pt40 {
+  padding-top: 40px; }
+
+.pt50 {
+  padding-top: 50px; }
+
+.pt60 {
+  padding-top: 60px; }
+
+.pt70 {
+  padding-top: 70px; }
+
+.pt80 {
+  padding-top: 80px; }
+
+.pr10 {
+  padding-right: 10px; }
+
+.pr20 {
+  padding-right: 20px; }
+
+.pr30 {
+  padding-right: 30px; }
+
+.pr40 {
+  padding-right: 40px; }
+
+.pr50 {
+  padding-right: 50px; }
+
+.pr60 {
+  padding-right: 60px; }
+
+.pr70 {
+  padding-right: 70px; }
+
+.pr80 {
+  padding-right: 80px; }
+
+.pb10 {
+  padding-bottom: 10px; }
+
+.pb20 {
+  padding-bottom: 20px; }
+
+.pb30 {
+  padding-bottom: 30px; }
+
+.pb40 {
+  padding-bottom: 40px; }
+
+.pb50 {
+  padding-bottom: 50px; }
+
+.pb60 {
+  padding-bottom: 60px; }
+
+.pb70 {
+  padding-bottom: 70px; }
+
+.pb80 {
+  padding-bottom: 80px; }
+
+.pl10 {
+  padding-left: 10px; }
+
+.pl20 {
+  padding-left: 20px; }
+
+.pl30 {
+  padding-left: 30px; }
+
+.pl40 {
+  padding-left: 40px; }
+
+.pl50 {
+  padding-left: 50px; }
+
+.pl60 {
+  padding-left: 60px; }
+
+.pl70 {
+  padding-left: 70px; }
+
+.pl80 {
+  padding-left: 80px; }
+
+.m10 {
+  margin: 10px; }
+
+.m20 {
+  margin: 20px; }
+
+.m30 {
+  margin: 30px; }
+
+.m40 {
+  margin: 40px; }
+
+.m50 {
+  margin: 50px; }
+
+.m60 {
+  margin: 60px; }
+
+.m70 {
+  margin: 70px; }
+
+.m80 {
+  margin: 80px; }
+
+.mt10 {
+  margin-top: 10px; }
+
+.mt20 {
+  margin-top: 20px; }
+
+.mt30 {
+  margin-top: 30px; }
+
+.mt40 {
+  margin-top: 40px; }
+
+.mt50 {
+  margin-top: 50px; }
+
+.mt60 {
+  margin-top: 60px; }
+
+.mt70 {
+  margin-top: 70px; }
+
+.mt80 {
+  margin-top: 80px; }
+
+.mr10 {
+  margin-right: 10px; }
+
+.mr20 {
+  margin-right: 20px; }
+
+.mr30 {
+  margin-right: 30px; }
+
+.mr40 {
+  margin-right: 40px; }
+
+.mr50 {
+  margin-right: 50px; }
+
+.mr60 {
+  margin-right: 60px; }
+
+.mr70 {
+  margin-right: 70px; }
+
+.mr80 {
+  margin-right: 80px; }
+
+.mb10 {
+  margin-bottom: 10px; }
+
+.mb20 {
+  margin-bottom: 20px; }
+
+.mb30 {
+  margin-bottom: 30px; }
+
+.mb40 {
+  margin-bottom: 40px; }
+
+.mb50 {
+  margin-bottom: 50px; }
+
+.mb60 {
+  margin-bottom: 60px; }
+
+.mb70 {
+  margin-bottom: 70px; }
+
+.mb80 {
+  margin-bottom: 80px; }
+
+.ml10 {
+  margin-left: 10px; }
+
+.ml20 {
+  margin-left: 20px; }
+
+.ml30 {
+  margin-left: 30px; }
+
+.ml40 {
+  margin-left: 40px; }
+
+.ml50 {
+  margin-left: 50px; }
+
+.ml60 {
+  margin-left: 60px; }
+
+.ml70 {
+  margin-left: 70px; }
+
+.ml80 {
+  margin-left: 80px; }
+
+.pos_rel {
+  position: relative; }
+
+.pos_abs {
+  position: absolute; }
+
+.fill_width {
+  width: 100% !important; }
+
+.related-popup {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 4;
+  border: 0;
+  width: 100%;
+  height: 100%;
+  padding-left: 250px;
+  box-sizing: border-box;
+  display: none;
+  background: #eff6f5;
+  background-clip: content-box; }
+  .related-popup-container {
+    display: none;
+    background-color: rgba(0, 0, 0, 0.5);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 3; }
+    .related-popup-container .loading-indicator {
+      display: none;
+      font-size: 96px;
+      color: #fff;
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -48px;
+      margin-top: -48px; }
+  .related-popup-back, .related-popup-back:visited, .related-popup-back:hover {
+    display: none;
+    background: #3c706b;
+    color: #fff;
+    position: absolute;
+    top: 20px;
+    left: 250px;
+    z-index: 5;
+    width: 100px;
+    padding: 14px 6px 14px 0;
+    text-align: center;
+    margin-left: -100px;
+    box-sizing: border-box;
+    text-transform: uppercase;
+    border-radius: 6px 0 0 6px;
+    -webkit-transition: background-color 0.3s, color 0.3s;
+    -moz-transition: background-color 0.3s, color 0.3s;
+    -o-transition: background-color 0.3s, color 0.3s;
+    transition: background-color 0.3s, color 0.3s; }
+  .related-popup-back:hover {
+    background: #eff6f5;
+    color: #62a29c; }
+  .related-popup-back span {
+    vertical-align: middle;
+    font-weight: bold;
+    font-size: 18px; }
+
 /*# sourceMappingURL=base.css.map */

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/green/base.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/green/jquery-ui.theme.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/green/select2.theme.css.map


+ 499 - 89
jet/static/jet/css/themes/light-blue/base.css

@@ -380,6 +380,10 @@ a:hover {
 #content {
   padding: 20px; }
 
+.module {
+  border: 0;
+  margin: 0; }
+
 /*
  * Default variable values
  * Create separate themes/theme/_variables.scss to override these variables
@@ -1465,6 +1469,9 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1479,7 +1486,10 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
-        padding: 0 24px;
+        padding: 0 14px 0 24px;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1487,8 +1497,7 @@ a:hover {
         .sidebar-menu-item-title-icon {
           float: right;
           font-size: 14px;
-          font-weight: bold !important;
-          margin-right: 14px; }
+          font-weight: bold !important; }
           .sidebar-menu-item-title-icon, .sidebar-menu-item-title-icon:visited, .sidebar-menu-item-title-icon:hover {
             color: #fff;
             -webkit-transition: color 0.3s;
@@ -1497,6 +1506,21 @@ a:hover {
             transition: color 0.3s; }
           .sidebar-menu-item-title-icon:hover {
             color: #FDBB5E; }
+      .sidebar-menu-item-link, .sidebar-menu-item-link:visited, .sidebar-menu-item-link:hover {
+        color: #7BBCE5;
+        text-transform: uppercase;
+        font-size: 11px;
+        font-weight: bold;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 24px;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
+      .sidebar-menu-item-link:hover {
+        color: #FDBB5E; }
       .sidebar-menu-item-action, .sidebar-menu-item-action:visited, .sidebar-menu-item-action:hover {
         display: block;
         color: #7BBCE5;
@@ -1512,7 +1536,7 @@ a:hover {
       .sidebar-menu-item-action:hover {
         color: #FDBB5E;
         background-color: #0a68a3; }
-      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty) {
+      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty), .sidebar-menu-item-link + .sidebar-menu-item-list:not(:empty) {
         margin-top: 10px !important; }
       .sidebar-menu-item-list-item.empty {
         display: none; }
@@ -2007,9 +2031,17 @@ a:hover {
         float: right;
         color: #78ACE3;
         font-size: 24px;
-        line-height: 30px !important; }
+        line-height: 30px !important;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
     .top-user-tools.opened .top-user-tools-welcome-msg-arrow {
-      color: #81c5f0; }
+      color: #81c5f0;
+      -webkit-transform: rotate(180deg);
+      -moz-transform: rotate(180deg);
+      -o-transform: rotate(180deg);
+      transform: rotate(180deg); }
     .top-user-tools-contrast-block {
       display: none;
       padding: 8px 14px;
@@ -3462,80 +3494,90 @@ table#change-history {
 .fill_width {
   width: 100% !important; }
 
-.module {
-  border: 0;
-  margin: 0;
-  padding: 20px;
-  background-color: #fff;
-  border-radius: 4px; }
-  .module .form-row {
-    padding: 6px 0;
-    overflow: hidden; }
-    .module .form-row label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word; }
-      .module .form-row label + p {
-        padding-top: 6px;
-        margin: 4px 0 4px 160px; }
-    .module .form-row.errors label {
-      color: #c7254e; }
-    .module .form-row .checkbox-row label {
-      float: none;
-      display: inline; }
-    .module .form-row .help {
-      clear: left;
-      color: #c0c6cc;
-      margin: 12px 0 0 160px; }
-    .module .form-row .checkbox-row .help {
-      margin-left: 0; }
-    .module .form-row .errorlist {
-      color: #c7254e; }
-    .module .form-row .datetime {
-      margin-left: 160px; }
-    .module .form-row .add-related span {
-      font-size: 18px;
-      vertical-align: middle; }
-    .module .form-row .change-related span {
-      font-size: 20px;
-      vertical-align: middle; }
-    .module .form-row .add-another {
-      margin-left: 4px; }
-      .module .form-row .add-another:before {
-        font-family: 'jet-icons';
-        speak: none;
-        font-style: normal;
-        font-weight: normal;
-        font-variant: normal;
-        text-transform: none;
-        line-height: 1;
-        /* Better Font Rendering =========== */
-        -webkit-font-smoothing: antialiased;
-        -moz-osx-font-smoothing: grayscale;
-        display: inline-block;
-        vertical-align: middle;
-        font-size: 18px;
-        content: ""; }
-      .module .form-row .add-another img {
-        display: none; }
-    .module .form-row .field-box {
-      margin-right: 20px;
-      float: left; }
-    .module .form-row .file-upload {
-      background: #F8FAFC;
+.module-separator {
+  height: 1em; }
+.module .form-row {
+  padding: 6px 0;
+  overflow: hidden; }
+  .module .form-row label {
+    display: block;
+    padding: 6px 10px 0 0;
+    float: left;
+    width: 150px;
+    word-wrap: break-word; }
+    .module .form-row label + p {
+      padding-top: 6px;
+      margin: 4px 0 4px 160px; }
+  .module .form-row br {
+    clear: both; }
+  .module .form-row.errors label {
+    color: #c7254e; }
+  .module .form-row .checkbox-row label {
+    float: none;
+    display: inline; }
+  .module .form-row .help {
+    clear: left;
+    color: #c0c6cc;
+    margin: 12px 0 0 160px; }
+  .module .form-row .checkbox-row .help {
+    margin-left: 0; }
+  .module .form-row .errorlist {
+    color: #c7254e;
+    margin-bottom: 10px !important; }
+  .module .form-row .datetime {
+    margin-left: 160px; }
+  .module .form-row .add-related span {
+    font-size: 18px;
+    vertical-align: middle; }
+  .module .form-row .change-related span {
+    font-size: 20px;
+    vertical-align: middle; }
+  .module .form-row .add-another {
+    margin-left: 4px; }
+    .module .form-row .add-another:before {
+      font-family: 'jet-icons';
+      speak: none;
+      font-style: normal;
+      font-weight: normal;
+      font-variant: normal;
+      text-transform: none;
+      line-height: 1;
+      /* Better Font Rendering =========== */
+      -webkit-font-smoothing: antialiased;
+      -moz-osx-font-smoothing: grayscale;
       display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px; }
-      .module .form-row .file-upload .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px; }
+      vertical-align: middle;
+      font-size: 18px;
+      content: ""; }
+    .module .form-row .add-another img {
+      display: none; }
+  .module .form-row .field-box {
+    margin-right: 20px;
+    float: left; }
+  .module .form-row .file-upload {
+    background: #F8FAFC;
+    display: inline-block;
+    margin: 0;
+    line-height: 1.5em;
+    padding: 10px;
+    border-radius: 4px; }
+    .module .form-row .file-upload .clearable-file-input label {
+      display: inline;
+      float: none;
+      padding: 0;
+      width: auto;
+      margin-left: 10px; }
+.module.aligned {
+  background-color: #fff;
+  border-radius: 4px;
+  padding: 20px; }
+  .module.aligned ul label {
+    display: inline;
+    float: none;
+    width: auto; }
+  .module.aligned ul {
+    margin: 0 0 0 160px;
+    padding: 0; }
 
 .submit-row {
   padding: 20px 0; }
@@ -3579,14 +3621,8 @@ table#change-history {
       display: none; }
       .changeform-tabs ~ .module .stacked.inline-related.selected {
         display: block; }
-  .changeform .module {
-    padding: 0;
-    background: none;
-    border-radius: 0; }
-    .changeform .module .form-row .select2 {
-      max-width: 586px; }
-  .changeform .aligned {
-    padding: 20px 20px 0 20px; }
+  .changeform .module .form-row .select2 {
+    max-width: 586px; }
   .changeform .inline-group .errornote {
     color: #c7254e;
     margin: 0;
@@ -4776,14 +4812,24 @@ table#change-history {
 .dashboard #content {
   width: 500px; }
 
+#content > h1 {
+  text-transform: uppercase;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 32px;
+  color: #8B9EAB;
+  margin: 0 0 2em 0; }
+
 .small, .module .form-row .help, .module .form-row .errorlist, .changeform .tabular.inline-related .module .errorlist, .login-form .form-row .errorlist {
   font-size: 12px; }
 
 .changeform-object-tools {
-  text-align: right; }
+  text-align: right;
+  overflow: auto; }
 
 ul.object-tools {
-  margin-bottom: 20px !important; }
+  margin-bottom: 20px !important;
+  float: right; }
   ul.object-tools li {
     margin-top: 10px;
     text-align: right; }
@@ -5333,4 +5379,368 @@ img[src$="admin/img/icon-no.gif"] + span {
   border-radius: 0 4px 4px 0 !important;
   padding: 0 10px !important; }
 
+/*
+ * Default variable values
+ * Create separate themes/theme/_variables.scss to override these variables
+ */
+/*
+ * General
+ */
+/*
+ * Sidebar
+ */
+/*
+ * Top
+ */
+/*
+ * Content
+ */
+/*
+ * Buttons
+ */
+/*
+ * Inputs
+ */
+/*
+ * Messages
+ */
+/*
+ * Login
+ */
+/*
+ * jQuery UI
+ */
+/*
+ * Charts
+ */
+.hidden {
+  display: none; }
+
+.clear-list, .sidebar-menu, .sidebar-menu-item-list, .sidebar-popup-list, .top-user-tools, .messagelist, .module .form-row .errorlist, .changeform-tabs, .changeform .tabular.inline-related .module .errorlist, .changeform .stacked-inline-list, .delete-summary ul, .delete-objects-list, .login-form .form-row .errorlist, ul.object-tools, .dashboard-item-content ul:not(.inline), .dashboard-item-content ul.inline {
+  margin: 0;
+  padding: 0;
+  list-style: none; }
+
+.fl {
+  float: left; }
+
+.fr {
+  float: right; }
+
+.cf:before, .cf:after {
+  content: "";
+  display: table; }
+
+.cf:after {
+  clear: both; }
+
+.p10 {
+  padding: 10px; }
+
+.p20 {
+  padding: 20px; }
+
+.p30 {
+  padding: 30px; }
+
+.p40 {
+  padding: 40px; }
+
+.p50 {
+  padding: 50px; }
+
+.p60 {
+  padding: 60px; }
+
+.p70 {
+  padding: 70px; }
+
+.p80 {
+  padding: 80px; }
+
+.pt10 {
+  padding-top: 10px; }
+
+.pt20 {
+  padding-top: 20px; }
+
+.pt30 {
+  padding-top: 30px; }
+
+.pt40 {
+  padding-top: 40px; }
+
+.pt50 {
+  padding-top: 50px; }
+
+.pt60 {
+  padding-top: 60px; }
+
+.pt70 {
+  padding-top: 70px; }
+
+.pt80 {
+  padding-top: 80px; }
+
+.pr10 {
+  padding-right: 10px; }
+
+.pr20 {
+  padding-right: 20px; }
+
+.pr30 {
+  padding-right: 30px; }
+
+.pr40 {
+  padding-right: 40px; }
+
+.pr50 {
+  padding-right: 50px; }
+
+.pr60 {
+  padding-right: 60px; }
+
+.pr70 {
+  padding-right: 70px; }
+
+.pr80 {
+  padding-right: 80px; }
+
+.pb10 {
+  padding-bottom: 10px; }
+
+.pb20 {
+  padding-bottom: 20px; }
+
+.pb30 {
+  padding-bottom: 30px; }
+
+.pb40 {
+  padding-bottom: 40px; }
+
+.pb50 {
+  padding-bottom: 50px; }
+
+.pb60 {
+  padding-bottom: 60px; }
+
+.pb70 {
+  padding-bottom: 70px; }
+
+.pb80 {
+  padding-bottom: 80px; }
+
+.pl10 {
+  padding-left: 10px; }
+
+.pl20 {
+  padding-left: 20px; }
+
+.pl30 {
+  padding-left: 30px; }
+
+.pl40 {
+  padding-left: 40px; }
+
+.pl50 {
+  padding-left: 50px; }
+
+.pl60 {
+  padding-left: 60px; }
+
+.pl70 {
+  padding-left: 70px; }
+
+.pl80 {
+  padding-left: 80px; }
+
+.m10 {
+  margin: 10px; }
+
+.m20 {
+  margin: 20px; }
+
+.m30 {
+  margin: 30px; }
+
+.m40 {
+  margin: 40px; }
+
+.m50 {
+  margin: 50px; }
+
+.m60 {
+  margin: 60px; }
+
+.m70 {
+  margin: 70px; }
+
+.m80 {
+  margin: 80px; }
+
+.mt10 {
+  margin-top: 10px; }
+
+.mt20 {
+  margin-top: 20px; }
+
+.mt30 {
+  margin-top: 30px; }
+
+.mt40 {
+  margin-top: 40px; }
+
+.mt50 {
+  margin-top: 50px; }
+
+.mt60 {
+  margin-top: 60px; }
+
+.mt70 {
+  margin-top: 70px; }
+
+.mt80 {
+  margin-top: 80px; }
+
+.mr10 {
+  margin-right: 10px; }
+
+.mr20 {
+  margin-right: 20px; }
+
+.mr30 {
+  margin-right: 30px; }
+
+.mr40 {
+  margin-right: 40px; }
+
+.mr50 {
+  margin-right: 50px; }
+
+.mr60 {
+  margin-right: 60px; }
+
+.mr70 {
+  margin-right: 70px; }
+
+.mr80 {
+  margin-right: 80px; }
+
+.mb10 {
+  margin-bottom: 10px; }
+
+.mb20 {
+  margin-bottom: 20px; }
+
+.mb30 {
+  margin-bottom: 30px; }
+
+.mb40 {
+  margin-bottom: 40px; }
+
+.mb50 {
+  margin-bottom: 50px; }
+
+.mb60 {
+  margin-bottom: 60px; }
+
+.mb70 {
+  margin-bottom: 70px; }
+
+.mb80 {
+  margin-bottom: 80px; }
+
+.ml10 {
+  margin-left: 10px; }
+
+.ml20 {
+  margin-left: 20px; }
+
+.ml30 {
+  margin-left: 30px; }
+
+.ml40 {
+  margin-left: 40px; }
+
+.ml50 {
+  margin-left: 50px; }
+
+.ml60 {
+  margin-left: 60px; }
+
+.ml70 {
+  margin-left: 70px; }
+
+.ml80 {
+  margin-left: 80px; }
+
+.pos_rel {
+  position: relative; }
+
+.pos_abs {
+  position: absolute; }
+
+.fill_width {
+  width: 100% !important; }
+
+.related-popup {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 4;
+  border: 0;
+  width: 100%;
+  height: 100%;
+  padding-left: 250px;
+  box-sizing: border-box;
+  display: none;
+  background: #f8fafc;
+  background-clip: content-box; }
+  .related-popup-container {
+    display: none;
+    background-color: rgba(0, 0, 0, 0.5);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 3; }
+    .related-popup-container .loading-indicator {
+      display: none;
+      font-size: 96px;
+      color: #8B9AA7;
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -48px;
+      margin-top: -48px; }
+  .related-popup-back, .related-popup-back:visited, .related-popup-back:hover {
+    display: none;
+    background: #E3ECF2;
+    color: #8B9AA7;
+    position: absolute;
+    top: 20px;
+    left: 250px;
+    z-index: 5;
+    width: 100px;
+    padding: 14px 6px 14px 0;
+    text-align: center;
+    margin-left: -100px;
+    box-sizing: border-box;
+    text-transform: uppercase;
+    border-radius: 6px 0 0 6px;
+    -webkit-transition: background-color 0.3s, color 0.3s;
+    -moz-transition: background-color 0.3s, color 0.3s;
+    -o-transition: background-color 0.3s, color 0.3s;
+    transition: background-color 0.3s, color 0.3s; }
+  .related-popup-back:hover {
+    background: #f8fafc;
+    color: #8B9AA7; }
+  .related-popup-back span {
+    vertical-align: middle;
+    font-weight: bold;
+    font-size: 18px; }
+
 /*# sourceMappingURL=base.css.map */

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-blue/base.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-blue/jquery-ui.theme.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-blue/select2.theme.css.map


+ 499 - 89
jet/static/jet/css/themes/light-gray/base.css

@@ -380,6 +380,10 @@ a:hover {
 #content {
   padding: 20px; }
 
+.module {
+  border: 0;
+  margin: 0; }
+
 /*
  * Default variable values
  * Create separate themes/theme/_variables.scss to override these variables
@@ -1465,6 +1469,9 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1479,7 +1486,10 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
-        padding: 0 24px;
+        padding: 0 14px 0 24px;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1487,8 +1497,7 @@ a:hover {
         .sidebar-menu-item-title-icon {
           float: right;
           font-size: 14px;
-          font-weight: bold !important;
-          margin-right: 14px; }
+          font-weight: bold !important; }
           .sidebar-menu-item-title-icon, .sidebar-menu-item-title-icon:visited, .sidebar-menu-item-title-icon:hover {
             color: #fff;
             -webkit-transition: color 0.3s;
@@ -1497,6 +1506,21 @@ a:hover {
             transition: color 0.3s; }
           .sidebar-menu-item-title-icon:hover {
             color: #FDBB5E; }
+      .sidebar-menu-item-link, .sidebar-menu-item-link:visited, .sidebar-menu-item-link:hover {
+        color: #7D8CA1;
+        text-transform: uppercase;
+        font-size: 11px;
+        font-weight: bold;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 24px;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
+      .sidebar-menu-item-link:hover {
+        color: #FDBB5E; }
       .sidebar-menu-item-action, .sidebar-menu-item-action:visited, .sidebar-menu-item-action:hover {
         display: block;
         color: #7D8CA1;
@@ -1512,7 +1536,7 @@ a:hover {
       .sidebar-menu-item-action:hover {
         color: #FDBB5E;
         background-color: #2B333D; }
-      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty) {
+      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty), .sidebar-menu-item-link + .sidebar-menu-item-list:not(:empty) {
         margin-top: 10px !important; }
       .sidebar-menu-item-list-item.empty {
         display: none; }
@@ -2007,9 +2031,17 @@ a:hover {
         float: right;
         color: #79A7D8;
         font-size: 24px;
-        line-height: 30px !important; }
+        line-height: 30px !important;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
     .top-user-tools.opened .top-user-tools-welcome-msg-arrow {
-      color: #8b9cb3; }
+      color: #8b9cb3;
+      -webkit-transform: rotate(180deg);
+      -moz-transform: rotate(180deg);
+      -o-transform: rotate(180deg);
+      transform: rotate(180deg); }
     .top-user-tools-contrast-block {
       display: none;
       padding: 8px 14px;
@@ -3462,80 +3494,90 @@ table#change-history {
 .fill_width {
   width: 100% !important; }
 
-.module {
-  border: 0;
-  margin: 0;
-  padding: 20px;
-  background-color: #fff;
-  border-radius: 4px; }
-  .module .form-row {
-    padding: 6px 0;
-    overflow: hidden; }
-    .module .form-row label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word; }
-      .module .form-row label + p {
-        padding-top: 6px;
-        margin: 4px 0 4px 160px; }
-    .module .form-row.errors label {
-      color: #c7254e; }
-    .module .form-row .checkbox-row label {
-      float: none;
-      display: inline; }
-    .module .form-row .help {
-      clear: left;
-      color: #c0c6cc;
-      margin: 12px 0 0 160px; }
-    .module .form-row .checkbox-row .help {
-      margin-left: 0; }
-    .module .form-row .errorlist {
-      color: #c7254e; }
-    .module .form-row .datetime {
-      margin-left: 160px; }
-    .module .form-row .add-related span {
-      font-size: 18px;
-      vertical-align: middle; }
-    .module .form-row .change-related span {
-      font-size: 20px;
-      vertical-align: middle; }
-    .module .form-row .add-another {
-      margin-left: 4px; }
-      .module .form-row .add-another:before {
-        font-family: 'jet-icons';
-        speak: none;
-        font-style: normal;
-        font-weight: normal;
-        font-variant: normal;
-        text-transform: none;
-        line-height: 1;
-        /* Better Font Rendering =========== */
-        -webkit-font-smoothing: antialiased;
-        -moz-osx-font-smoothing: grayscale;
-        display: inline-block;
-        vertical-align: middle;
-        font-size: 18px;
-        content: ""; }
-      .module .form-row .add-another img {
-        display: none; }
-    .module .form-row .field-box {
-      margin-right: 20px;
-      float: left; }
-    .module .form-row .file-upload {
-      background: #F8FAFC;
+.module-separator {
+  height: 1em; }
+.module .form-row {
+  padding: 6px 0;
+  overflow: hidden; }
+  .module .form-row label {
+    display: block;
+    padding: 6px 10px 0 0;
+    float: left;
+    width: 150px;
+    word-wrap: break-word; }
+    .module .form-row label + p {
+      padding-top: 6px;
+      margin: 4px 0 4px 160px; }
+  .module .form-row br {
+    clear: both; }
+  .module .form-row.errors label {
+    color: #c7254e; }
+  .module .form-row .checkbox-row label {
+    float: none;
+    display: inline; }
+  .module .form-row .help {
+    clear: left;
+    color: #c0c6cc;
+    margin: 12px 0 0 160px; }
+  .module .form-row .checkbox-row .help {
+    margin-left: 0; }
+  .module .form-row .errorlist {
+    color: #c7254e;
+    margin-bottom: 10px !important; }
+  .module .form-row .datetime {
+    margin-left: 160px; }
+  .module .form-row .add-related span {
+    font-size: 18px;
+    vertical-align: middle; }
+  .module .form-row .change-related span {
+    font-size: 20px;
+    vertical-align: middle; }
+  .module .form-row .add-another {
+    margin-left: 4px; }
+    .module .form-row .add-another:before {
+      font-family: 'jet-icons';
+      speak: none;
+      font-style: normal;
+      font-weight: normal;
+      font-variant: normal;
+      text-transform: none;
+      line-height: 1;
+      /* Better Font Rendering =========== */
+      -webkit-font-smoothing: antialiased;
+      -moz-osx-font-smoothing: grayscale;
       display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px; }
-      .module .form-row .file-upload .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px; }
+      vertical-align: middle;
+      font-size: 18px;
+      content: ""; }
+    .module .form-row .add-another img {
+      display: none; }
+  .module .form-row .field-box {
+    margin-right: 20px;
+    float: left; }
+  .module .form-row .file-upload {
+    background: #F8FAFC;
+    display: inline-block;
+    margin: 0;
+    line-height: 1.5em;
+    padding: 10px;
+    border-radius: 4px; }
+    .module .form-row .file-upload .clearable-file-input label {
+      display: inline;
+      float: none;
+      padding: 0;
+      width: auto;
+      margin-left: 10px; }
+.module.aligned {
+  background-color: #fff;
+  border-radius: 4px;
+  padding: 20px; }
+  .module.aligned ul label {
+    display: inline;
+    float: none;
+    width: auto; }
+  .module.aligned ul {
+    margin: 0 0 0 160px;
+    padding: 0; }
 
 .submit-row {
   padding: 20px 0; }
@@ -3579,14 +3621,8 @@ table#change-history {
       display: none; }
       .changeform-tabs ~ .module .stacked.inline-related.selected {
         display: block; }
-  .changeform .module {
-    padding: 0;
-    background: none;
-    border-radius: 0; }
-    .changeform .module .form-row .select2 {
-      max-width: 586px; }
-  .changeform .aligned {
-    padding: 20px 20px 0 20px; }
+  .changeform .module .form-row .select2 {
+    max-width: 586px; }
   .changeform .inline-group .errornote {
     color: #c7254e;
     margin: 0;
@@ -4776,14 +4812,24 @@ table#change-history {
 .dashboard #content {
   width: 500px; }
 
+#content > h1 {
+  text-transform: uppercase;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 32px;
+  color: #8B9EAB;
+  margin: 0 0 2em 0; }
+
 .small, .module .form-row .help, .module .form-row .errorlist, .changeform .tabular.inline-related .module .errorlist, .login-form .form-row .errorlist {
   font-size: 12px; }
 
 .changeform-object-tools {
-  text-align: right; }
+  text-align: right;
+  overflow: auto; }
 
 ul.object-tools {
-  margin-bottom: 20px !important; }
+  margin-bottom: 20px !important;
+  float: right; }
   ul.object-tools li {
     margin-top: 10px;
     text-align: right; }
@@ -5333,4 +5379,368 @@ img[src$="admin/img/icon-no.gif"] + span {
   border-radius: 0 4px 4px 0 !important;
   padding: 0 10px !important; }
 
+/*
+ * Default variable values
+ * Create separate themes/theme/_variables.scss to override these variables
+ */
+/*
+ * General
+ */
+/*
+ * Sidebar
+ */
+/*
+ * Top
+ */
+/*
+ * Content
+ */
+/*
+ * Buttons
+ */
+/*
+ * Inputs
+ */
+/*
+ * Messages
+ */
+/*
+ * Login
+ */
+/*
+ * jQuery UI
+ */
+/*
+ * Charts
+ */
+.hidden {
+  display: none; }
+
+.clear-list, .sidebar-menu, .sidebar-menu-item-list, .sidebar-popup-list, .top-user-tools, .messagelist, .module .form-row .errorlist, .changeform-tabs, .changeform .tabular.inline-related .module .errorlist, .changeform .stacked-inline-list, .delete-summary ul, .delete-objects-list, .login-form .form-row .errorlist, ul.object-tools, .dashboard-item-content ul:not(.inline), .dashboard-item-content ul.inline {
+  margin: 0;
+  padding: 0;
+  list-style: none; }
+
+.fl {
+  float: left; }
+
+.fr {
+  float: right; }
+
+.cf:before, .cf:after {
+  content: "";
+  display: table; }
+
+.cf:after {
+  clear: both; }
+
+.p10 {
+  padding: 10px; }
+
+.p20 {
+  padding: 20px; }
+
+.p30 {
+  padding: 30px; }
+
+.p40 {
+  padding: 40px; }
+
+.p50 {
+  padding: 50px; }
+
+.p60 {
+  padding: 60px; }
+
+.p70 {
+  padding: 70px; }
+
+.p80 {
+  padding: 80px; }
+
+.pt10 {
+  padding-top: 10px; }
+
+.pt20 {
+  padding-top: 20px; }
+
+.pt30 {
+  padding-top: 30px; }
+
+.pt40 {
+  padding-top: 40px; }
+
+.pt50 {
+  padding-top: 50px; }
+
+.pt60 {
+  padding-top: 60px; }
+
+.pt70 {
+  padding-top: 70px; }
+
+.pt80 {
+  padding-top: 80px; }
+
+.pr10 {
+  padding-right: 10px; }
+
+.pr20 {
+  padding-right: 20px; }
+
+.pr30 {
+  padding-right: 30px; }
+
+.pr40 {
+  padding-right: 40px; }
+
+.pr50 {
+  padding-right: 50px; }
+
+.pr60 {
+  padding-right: 60px; }
+
+.pr70 {
+  padding-right: 70px; }
+
+.pr80 {
+  padding-right: 80px; }
+
+.pb10 {
+  padding-bottom: 10px; }
+
+.pb20 {
+  padding-bottom: 20px; }
+
+.pb30 {
+  padding-bottom: 30px; }
+
+.pb40 {
+  padding-bottom: 40px; }
+
+.pb50 {
+  padding-bottom: 50px; }
+
+.pb60 {
+  padding-bottom: 60px; }
+
+.pb70 {
+  padding-bottom: 70px; }
+
+.pb80 {
+  padding-bottom: 80px; }
+
+.pl10 {
+  padding-left: 10px; }
+
+.pl20 {
+  padding-left: 20px; }
+
+.pl30 {
+  padding-left: 30px; }
+
+.pl40 {
+  padding-left: 40px; }
+
+.pl50 {
+  padding-left: 50px; }
+
+.pl60 {
+  padding-left: 60px; }
+
+.pl70 {
+  padding-left: 70px; }
+
+.pl80 {
+  padding-left: 80px; }
+
+.m10 {
+  margin: 10px; }
+
+.m20 {
+  margin: 20px; }
+
+.m30 {
+  margin: 30px; }
+
+.m40 {
+  margin: 40px; }
+
+.m50 {
+  margin: 50px; }
+
+.m60 {
+  margin: 60px; }
+
+.m70 {
+  margin: 70px; }
+
+.m80 {
+  margin: 80px; }
+
+.mt10 {
+  margin-top: 10px; }
+
+.mt20 {
+  margin-top: 20px; }
+
+.mt30 {
+  margin-top: 30px; }
+
+.mt40 {
+  margin-top: 40px; }
+
+.mt50 {
+  margin-top: 50px; }
+
+.mt60 {
+  margin-top: 60px; }
+
+.mt70 {
+  margin-top: 70px; }
+
+.mt80 {
+  margin-top: 80px; }
+
+.mr10 {
+  margin-right: 10px; }
+
+.mr20 {
+  margin-right: 20px; }
+
+.mr30 {
+  margin-right: 30px; }
+
+.mr40 {
+  margin-right: 40px; }
+
+.mr50 {
+  margin-right: 50px; }
+
+.mr60 {
+  margin-right: 60px; }
+
+.mr70 {
+  margin-right: 70px; }
+
+.mr80 {
+  margin-right: 80px; }
+
+.mb10 {
+  margin-bottom: 10px; }
+
+.mb20 {
+  margin-bottom: 20px; }
+
+.mb30 {
+  margin-bottom: 30px; }
+
+.mb40 {
+  margin-bottom: 40px; }
+
+.mb50 {
+  margin-bottom: 50px; }
+
+.mb60 {
+  margin-bottom: 60px; }
+
+.mb70 {
+  margin-bottom: 70px; }
+
+.mb80 {
+  margin-bottom: 80px; }
+
+.ml10 {
+  margin-left: 10px; }
+
+.ml20 {
+  margin-left: 20px; }
+
+.ml30 {
+  margin-left: 30px; }
+
+.ml40 {
+  margin-left: 40px; }
+
+.ml50 {
+  margin-left: 50px; }
+
+.ml60 {
+  margin-left: 60px; }
+
+.ml70 {
+  margin-left: 70px; }
+
+.ml80 {
+  margin-left: 80px; }
+
+.pos_rel {
+  position: relative; }
+
+.pos_abs {
+  position: absolute; }
+
+.fill_width {
+  width: 100% !important; }
+
+.related-popup {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 4;
+  border: 0;
+  width: 100%;
+  height: 100%;
+  padding-left: 250px;
+  box-sizing: border-box;
+  display: none;
+  background: #f8fafc;
+  background-clip: content-box; }
+  .related-popup-container {
+    display: none;
+    background-color: rgba(0, 0, 0, 0.5);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 3; }
+    .related-popup-container .loading-indicator {
+      display: none;
+      font-size: 96px;
+      color: #8B9AA7;
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -48px;
+      margin-top: -48px; }
+  .related-popup-back, .related-popup-back:visited, .related-popup-back:hover {
+    display: none;
+    background: #E3ECF2;
+    color: #8B9AA7;
+    position: absolute;
+    top: 20px;
+    left: 250px;
+    z-index: 5;
+    width: 100px;
+    padding: 14px 6px 14px 0;
+    text-align: center;
+    margin-left: -100px;
+    box-sizing: border-box;
+    text-transform: uppercase;
+    border-radius: 6px 0 0 6px;
+    -webkit-transition: background-color 0.3s, color 0.3s;
+    -moz-transition: background-color 0.3s, color 0.3s;
+    -o-transition: background-color 0.3s, color 0.3s;
+    transition: background-color 0.3s, color 0.3s; }
+  .related-popup-back:hover {
+    background: #f8fafc;
+    color: #8B9AA7; }
+  .related-popup-back span {
+    vertical-align: middle;
+    font-weight: bold;
+    font-size: 18px; }
+
 /*# sourceMappingURL=base.css.map */

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-gray/base.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-gray/jquery-ui.theme.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-gray/select2.theme.css.map


+ 499 - 89
jet/static/jet/css/themes/light-green/base.css

@@ -380,6 +380,10 @@ a:hover {
 #content {
   padding: 20px; }
 
+.module {
+  border: 0;
+  margin: 0; }
+
 /*
  * Default variable values
  * Create separate themes/theme/_variables.scss to override these variables
@@ -1465,6 +1469,9 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1479,7 +1486,10 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
-        padding: 0 24px;
+        padding: 0 14px 0 24px;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1487,8 +1497,7 @@ a:hover {
         .sidebar-menu-item-title-icon {
           float: right;
           font-size: 14px;
-          font-weight: bold !important;
-          margin-right: 14px; }
+          font-weight: bold !important; }
           .sidebar-menu-item-title-icon, .sidebar-menu-item-title-icon:visited, .sidebar-menu-item-title-icon:hover {
             color: #fff;
             -webkit-transition: color 0.3s;
@@ -1497,6 +1506,21 @@ a:hover {
             transition: color 0.3s; }
           .sidebar-menu-item-title-icon:hover {
             color: #FDBB5E; }
+      .sidebar-menu-item-link, .sidebar-menu-item-link:visited, .sidebar-menu-item-link:hover {
+        color: #6DC5A8;
+        text-transform: uppercase;
+        font-size: 11px;
+        font-weight: bold;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 24px;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
+      .sidebar-menu-item-link:hover {
+        color: #FDBB5E; }
       .sidebar-menu-item-action, .sidebar-menu-item-action:visited, .sidebar-menu-item-action:hover {
         display: block;
         color: #6DC5A8;
@@ -1512,7 +1536,7 @@ a:hover {
       .sidebar-menu-item-action:hover {
         color: #FDBB5E;
         background-color: #01805c; }
-      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty) {
+      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty), .sidebar-menu-item-link + .sidebar-menu-item-list:not(:empty) {
         margin-top: 10px !important; }
       .sidebar-menu-item-list-item.empty {
         display: none; }
@@ -2007,9 +2031,17 @@ a:hover {
         float: right;
         color: #2faa60;
         font-size: 24px;
-        line-height: 30px !important; }
+        line-height: 30px !important;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
     .top-user-tools.opened .top-user-tools-welcome-msg-arrow {
-      color: #beebdb; }
+      color: #beebdb;
+      -webkit-transform: rotate(180deg);
+      -moz-transform: rotate(180deg);
+      -o-transform: rotate(180deg);
+      transform: rotate(180deg); }
     .top-user-tools-contrast-block {
       display: none;
       padding: 8px 14px;
@@ -3462,80 +3494,90 @@ table#change-history {
 .fill_width {
   width: 100% !important; }
 
-.module {
-  border: 0;
-  margin: 0;
-  padding: 20px;
-  background-color: #fff;
-  border-radius: 4px; }
-  .module .form-row {
-    padding: 6px 0;
-    overflow: hidden; }
-    .module .form-row label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word; }
-      .module .form-row label + p {
-        padding-top: 6px;
-        margin: 4px 0 4px 160px; }
-    .module .form-row.errors label {
-      color: #c7254e; }
-    .module .form-row .checkbox-row label {
-      float: none;
-      display: inline; }
-    .module .form-row .help {
-      clear: left;
-      color: #c0c6cc;
-      margin: 12px 0 0 160px; }
-    .module .form-row .checkbox-row .help {
-      margin-left: 0; }
-    .module .form-row .errorlist {
-      color: #c7254e; }
-    .module .form-row .datetime {
-      margin-left: 160px; }
-    .module .form-row .add-related span {
-      font-size: 18px;
-      vertical-align: middle; }
-    .module .form-row .change-related span {
-      font-size: 20px;
-      vertical-align: middle; }
-    .module .form-row .add-another {
-      margin-left: 4px; }
-      .module .form-row .add-another:before {
-        font-family: 'jet-icons';
-        speak: none;
-        font-style: normal;
-        font-weight: normal;
-        font-variant: normal;
-        text-transform: none;
-        line-height: 1;
-        /* Better Font Rendering =========== */
-        -webkit-font-smoothing: antialiased;
-        -moz-osx-font-smoothing: grayscale;
-        display: inline-block;
-        vertical-align: middle;
-        font-size: 18px;
-        content: ""; }
-      .module .form-row .add-another img {
-        display: none; }
-    .module .form-row .field-box {
-      margin-right: 20px;
-      float: left; }
-    .module .form-row .file-upload {
-      background: #F8FAFC;
+.module-separator {
+  height: 1em; }
+.module .form-row {
+  padding: 6px 0;
+  overflow: hidden; }
+  .module .form-row label {
+    display: block;
+    padding: 6px 10px 0 0;
+    float: left;
+    width: 150px;
+    word-wrap: break-word; }
+    .module .form-row label + p {
+      padding-top: 6px;
+      margin: 4px 0 4px 160px; }
+  .module .form-row br {
+    clear: both; }
+  .module .form-row.errors label {
+    color: #c7254e; }
+  .module .form-row .checkbox-row label {
+    float: none;
+    display: inline; }
+  .module .form-row .help {
+    clear: left;
+    color: #c0c6cc;
+    margin: 12px 0 0 160px; }
+  .module .form-row .checkbox-row .help {
+    margin-left: 0; }
+  .module .form-row .errorlist {
+    color: #c7254e;
+    margin-bottom: 10px !important; }
+  .module .form-row .datetime {
+    margin-left: 160px; }
+  .module .form-row .add-related span {
+    font-size: 18px;
+    vertical-align: middle; }
+  .module .form-row .change-related span {
+    font-size: 20px;
+    vertical-align: middle; }
+  .module .form-row .add-another {
+    margin-left: 4px; }
+    .module .form-row .add-another:before {
+      font-family: 'jet-icons';
+      speak: none;
+      font-style: normal;
+      font-weight: normal;
+      font-variant: normal;
+      text-transform: none;
+      line-height: 1;
+      /* Better Font Rendering =========== */
+      -webkit-font-smoothing: antialiased;
+      -moz-osx-font-smoothing: grayscale;
       display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px; }
-      .module .form-row .file-upload .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px; }
+      vertical-align: middle;
+      font-size: 18px;
+      content: ""; }
+    .module .form-row .add-another img {
+      display: none; }
+  .module .form-row .field-box {
+    margin-right: 20px;
+    float: left; }
+  .module .form-row .file-upload {
+    background: #F8FAFC;
+    display: inline-block;
+    margin: 0;
+    line-height: 1.5em;
+    padding: 10px;
+    border-radius: 4px; }
+    .module .form-row .file-upload .clearable-file-input label {
+      display: inline;
+      float: none;
+      padding: 0;
+      width: auto;
+      margin-left: 10px; }
+.module.aligned {
+  background-color: #fff;
+  border-radius: 4px;
+  padding: 20px; }
+  .module.aligned ul label {
+    display: inline;
+    float: none;
+    width: auto; }
+  .module.aligned ul {
+    margin: 0 0 0 160px;
+    padding: 0; }
 
 .submit-row {
   padding: 20px 0; }
@@ -3579,14 +3621,8 @@ table#change-history {
       display: none; }
       .changeform-tabs ~ .module .stacked.inline-related.selected {
         display: block; }
-  .changeform .module {
-    padding: 0;
-    background: none;
-    border-radius: 0; }
-    .changeform .module .form-row .select2 {
-      max-width: 586px; }
-  .changeform .aligned {
-    padding: 20px 20px 0 20px; }
+  .changeform .module .form-row .select2 {
+    max-width: 586px; }
   .changeform .inline-group .errornote {
     color: #c7254e;
     margin: 0;
@@ -4776,14 +4812,24 @@ table#change-history {
 .dashboard #content {
   width: 500px; }
 
+#content > h1 {
+  text-transform: uppercase;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 32px;
+  color: #8B9EAB;
+  margin: 0 0 2em 0; }
+
 .small, .module .form-row .help, .module .form-row .errorlist, .changeform .tabular.inline-related .module .errorlist, .login-form .form-row .errorlist {
   font-size: 12px; }
 
 .changeform-object-tools {
-  text-align: right; }
+  text-align: right;
+  overflow: auto; }
 
 ul.object-tools {
-  margin-bottom: 20px !important; }
+  margin-bottom: 20px !important;
+  float: right; }
   ul.object-tools li {
     margin-top: 10px;
     text-align: right; }
@@ -5333,4 +5379,368 @@ img[src$="admin/img/icon-no.gif"] + span {
   border-radius: 0 4px 4px 0 !important;
   padding: 0 10px !important; }
 
+/*
+ * Default variable values
+ * Create separate themes/theme/_variables.scss to override these variables
+ */
+/*
+ * General
+ */
+/*
+ * Sidebar
+ */
+/*
+ * Top
+ */
+/*
+ * Content
+ */
+/*
+ * Buttons
+ */
+/*
+ * Inputs
+ */
+/*
+ * Messages
+ */
+/*
+ * Login
+ */
+/*
+ * jQuery UI
+ */
+/*
+ * Charts
+ */
+.hidden {
+  display: none; }
+
+.clear-list, .sidebar-menu, .sidebar-menu-item-list, .sidebar-popup-list, .top-user-tools, .messagelist, .module .form-row .errorlist, .changeform-tabs, .changeform .tabular.inline-related .module .errorlist, .changeform .stacked-inline-list, .delete-summary ul, .delete-objects-list, .login-form .form-row .errorlist, ul.object-tools, .dashboard-item-content ul:not(.inline), .dashboard-item-content ul.inline {
+  margin: 0;
+  padding: 0;
+  list-style: none; }
+
+.fl {
+  float: left; }
+
+.fr {
+  float: right; }
+
+.cf:before, .cf:after {
+  content: "";
+  display: table; }
+
+.cf:after {
+  clear: both; }
+
+.p10 {
+  padding: 10px; }
+
+.p20 {
+  padding: 20px; }
+
+.p30 {
+  padding: 30px; }
+
+.p40 {
+  padding: 40px; }
+
+.p50 {
+  padding: 50px; }
+
+.p60 {
+  padding: 60px; }
+
+.p70 {
+  padding: 70px; }
+
+.p80 {
+  padding: 80px; }
+
+.pt10 {
+  padding-top: 10px; }
+
+.pt20 {
+  padding-top: 20px; }
+
+.pt30 {
+  padding-top: 30px; }
+
+.pt40 {
+  padding-top: 40px; }
+
+.pt50 {
+  padding-top: 50px; }
+
+.pt60 {
+  padding-top: 60px; }
+
+.pt70 {
+  padding-top: 70px; }
+
+.pt80 {
+  padding-top: 80px; }
+
+.pr10 {
+  padding-right: 10px; }
+
+.pr20 {
+  padding-right: 20px; }
+
+.pr30 {
+  padding-right: 30px; }
+
+.pr40 {
+  padding-right: 40px; }
+
+.pr50 {
+  padding-right: 50px; }
+
+.pr60 {
+  padding-right: 60px; }
+
+.pr70 {
+  padding-right: 70px; }
+
+.pr80 {
+  padding-right: 80px; }
+
+.pb10 {
+  padding-bottom: 10px; }
+
+.pb20 {
+  padding-bottom: 20px; }
+
+.pb30 {
+  padding-bottom: 30px; }
+
+.pb40 {
+  padding-bottom: 40px; }
+
+.pb50 {
+  padding-bottom: 50px; }
+
+.pb60 {
+  padding-bottom: 60px; }
+
+.pb70 {
+  padding-bottom: 70px; }
+
+.pb80 {
+  padding-bottom: 80px; }
+
+.pl10 {
+  padding-left: 10px; }
+
+.pl20 {
+  padding-left: 20px; }
+
+.pl30 {
+  padding-left: 30px; }
+
+.pl40 {
+  padding-left: 40px; }
+
+.pl50 {
+  padding-left: 50px; }
+
+.pl60 {
+  padding-left: 60px; }
+
+.pl70 {
+  padding-left: 70px; }
+
+.pl80 {
+  padding-left: 80px; }
+
+.m10 {
+  margin: 10px; }
+
+.m20 {
+  margin: 20px; }
+
+.m30 {
+  margin: 30px; }
+
+.m40 {
+  margin: 40px; }
+
+.m50 {
+  margin: 50px; }
+
+.m60 {
+  margin: 60px; }
+
+.m70 {
+  margin: 70px; }
+
+.m80 {
+  margin: 80px; }
+
+.mt10 {
+  margin-top: 10px; }
+
+.mt20 {
+  margin-top: 20px; }
+
+.mt30 {
+  margin-top: 30px; }
+
+.mt40 {
+  margin-top: 40px; }
+
+.mt50 {
+  margin-top: 50px; }
+
+.mt60 {
+  margin-top: 60px; }
+
+.mt70 {
+  margin-top: 70px; }
+
+.mt80 {
+  margin-top: 80px; }
+
+.mr10 {
+  margin-right: 10px; }
+
+.mr20 {
+  margin-right: 20px; }
+
+.mr30 {
+  margin-right: 30px; }
+
+.mr40 {
+  margin-right: 40px; }
+
+.mr50 {
+  margin-right: 50px; }
+
+.mr60 {
+  margin-right: 60px; }
+
+.mr70 {
+  margin-right: 70px; }
+
+.mr80 {
+  margin-right: 80px; }
+
+.mb10 {
+  margin-bottom: 10px; }
+
+.mb20 {
+  margin-bottom: 20px; }
+
+.mb30 {
+  margin-bottom: 30px; }
+
+.mb40 {
+  margin-bottom: 40px; }
+
+.mb50 {
+  margin-bottom: 50px; }
+
+.mb60 {
+  margin-bottom: 60px; }
+
+.mb70 {
+  margin-bottom: 70px; }
+
+.mb80 {
+  margin-bottom: 80px; }
+
+.ml10 {
+  margin-left: 10px; }
+
+.ml20 {
+  margin-left: 20px; }
+
+.ml30 {
+  margin-left: 30px; }
+
+.ml40 {
+  margin-left: 40px; }
+
+.ml50 {
+  margin-left: 50px; }
+
+.ml60 {
+  margin-left: 60px; }
+
+.ml70 {
+  margin-left: 70px; }
+
+.ml80 {
+  margin-left: 80px; }
+
+.pos_rel {
+  position: relative; }
+
+.pos_abs {
+  position: absolute; }
+
+.fill_width {
+  width: 100% !important; }
+
+.related-popup {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 4;
+  border: 0;
+  width: 100%;
+  height: 100%;
+  padding-left: 250px;
+  box-sizing: border-box;
+  display: none;
+  background: #f8fafc;
+  background-clip: content-box; }
+  .related-popup-container {
+    display: none;
+    background-color: rgba(0, 0, 0, 0.5);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 3; }
+    .related-popup-container .loading-indicator {
+      display: none;
+      font-size: 96px;
+      color: #8B9AA7;
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -48px;
+      margin-top: -48px; }
+  .related-popup-back, .related-popup-back:visited, .related-popup-back:hover {
+    display: none;
+    background: #E3ECF2;
+    color: #8B9AA7;
+    position: absolute;
+    top: 20px;
+    left: 250px;
+    z-index: 5;
+    width: 100px;
+    padding: 14px 6px 14px 0;
+    text-align: center;
+    margin-left: -100px;
+    box-sizing: border-box;
+    text-transform: uppercase;
+    border-radius: 6px 0 0 6px;
+    -webkit-transition: background-color 0.3s, color 0.3s;
+    -moz-transition: background-color 0.3s, color 0.3s;
+    -o-transition: background-color 0.3s, color 0.3s;
+    transition: background-color 0.3s, color 0.3s; }
+  .related-popup-back:hover {
+    background: #f8fafc;
+    color: #8B9AA7; }
+  .related-popup-back span {
+    vertical-align: middle;
+    font-weight: bold;
+    font-size: 18px; }
+
 /*# sourceMappingURL=base.css.map */

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-green/base.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-green/jquery-ui.theme.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-green/select2.theme.css.map


+ 499 - 89
jet/static/jet/css/themes/light-violet/base.css

@@ -380,6 +380,10 @@ a:hover {
 #content {
   padding: 20px; }
 
+.module {
+  border: 0;
+  margin: 0; }
+
 /*
  * Default variable values
  * Create separate themes/theme/_variables.scss to override these variables
@@ -1465,6 +1469,9 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1479,7 +1486,10 @@ a:hover {
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
-        padding: 0 24px;
+        padding: 0 14px 0 24px;
+        width: 100%;
+        display: inline-block;
+        box-sizing: border-box;
         -webkit-transition: color 0.3s;
         -moz-transition: color 0.3s;
         -o-transition: color 0.3s;
@@ -1487,8 +1497,7 @@ a:hover {
         .sidebar-menu-item-title-icon {
           float: right;
           font-size: 14px;
-          font-weight: bold !important;
-          margin-right: 14px; }
+          font-weight: bold !important; }
           .sidebar-menu-item-title-icon, .sidebar-menu-item-title-icon:visited, .sidebar-menu-item-title-icon:hover {
             color: #fff;
             -webkit-transition: color 0.3s;
@@ -1497,6 +1506,21 @@ a:hover {
             transition: color 0.3s; }
           .sidebar-menu-item-title-icon:hover {
             color: #FDBB5E; }
+      .sidebar-menu-item-link, .sidebar-menu-item-link:visited, .sidebar-menu-item-link:hover {
+        color: #9988cc;
+        text-transform: uppercase;
+        font-size: 11px;
+        font-weight: bold;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        padding: 0 24px;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
+      .sidebar-menu-item-link:hover {
+        color: #FDBB5E; }
       .sidebar-menu-item-action, .sidebar-menu-item-action:visited, .sidebar-menu-item-action:hover {
         display: block;
         color: #9988cc;
@@ -1512,7 +1536,7 @@ a:hover {
       .sidebar-menu-item-action:hover {
         color: #FDBB5E;
         background-color: #443366; }
-      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty) {
+      .sidebar-menu-item-title + .sidebar-menu-item-list:not(:empty), .sidebar-menu-item-link + .sidebar-menu-item-list:not(:empty) {
         margin-top: 10px !important; }
       .sidebar-menu-item-list-item.empty {
         display: none; }
@@ -2007,9 +2031,17 @@ a:hover {
         float: right;
         color: #79A7D8;
         font-size: 24px;
-        line-height: 30px !important; }
+        line-height: 30px !important;
+        -webkit-transition: color 0.3s;
+        -moz-transition: color 0.3s;
+        -o-transition: color 0.3s;
+        transition: color 0.3s; }
     .top-user-tools.opened .top-user-tools-welcome-msg-arrow {
-      color: #c8beeb; }
+      color: #c8beeb;
+      -webkit-transform: rotate(180deg);
+      -moz-transform: rotate(180deg);
+      -o-transform: rotate(180deg);
+      transform: rotate(180deg); }
     .top-user-tools-contrast-block {
       display: none;
       padding: 8px 14px;
@@ -3462,80 +3494,90 @@ table#change-history {
 .fill_width {
   width: 100% !important; }
 
-.module {
-  border: 0;
-  margin: 0;
-  padding: 20px;
-  background-color: #fff;
-  border-radius: 4px; }
-  .module .form-row {
-    padding: 6px 0;
-    overflow: hidden; }
-    .module .form-row label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word; }
-      .module .form-row label + p {
-        padding-top: 6px;
-        margin: 4px 0 4px 160px; }
-    .module .form-row.errors label {
-      color: #c7254e; }
-    .module .form-row .checkbox-row label {
-      float: none;
-      display: inline; }
-    .module .form-row .help {
-      clear: left;
-      color: #c0c6cc;
-      margin: 12px 0 0 160px; }
-    .module .form-row .checkbox-row .help {
-      margin-left: 0; }
-    .module .form-row .errorlist {
-      color: #c7254e; }
-    .module .form-row .datetime {
-      margin-left: 160px; }
-    .module .form-row .add-related span {
-      font-size: 18px;
-      vertical-align: middle; }
-    .module .form-row .change-related span {
-      font-size: 20px;
-      vertical-align: middle; }
-    .module .form-row .add-another {
-      margin-left: 4px; }
-      .module .form-row .add-another:before {
-        font-family: 'jet-icons';
-        speak: none;
-        font-style: normal;
-        font-weight: normal;
-        font-variant: normal;
-        text-transform: none;
-        line-height: 1;
-        /* Better Font Rendering =========== */
-        -webkit-font-smoothing: antialiased;
-        -moz-osx-font-smoothing: grayscale;
-        display: inline-block;
-        vertical-align: middle;
-        font-size: 18px;
-        content: ""; }
-      .module .form-row .add-another img {
-        display: none; }
-    .module .form-row .field-box {
-      margin-right: 20px;
-      float: left; }
-    .module .form-row .file-upload {
-      background: #F8FAFC;
+.module-separator {
+  height: 1em; }
+.module .form-row {
+  padding: 6px 0;
+  overflow: hidden; }
+  .module .form-row label {
+    display: block;
+    padding: 6px 10px 0 0;
+    float: left;
+    width: 150px;
+    word-wrap: break-word; }
+    .module .form-row label + p {
+      padding-top: 6px;
+      margin: 4px 0 4px 160px; }
+  .module .form-row br {
+    clear: both; }
+  .module .form-row.errors label {
+    color: #c7254e; }
+  .module .form-row .checkbox-row label {
+    float: none;
+    display: inline; }
+  .module .form-row .help {
+    clear: left;
+    color: #c0c6cc;
+    margin: 12px 0 0 160px; }
+  .module .form-row .checkbox-row .help {
+    margin-left: 0; }
+  .module .form-row .errorlist {
+    color: #c7254e;
+    margin-bottom: 10px !important; }
+  .module .form-row .datetime {
+    margin-left: 160px; }
+  .module .form-row .add-related span {
+    font-size: 18px;
+    vertical-align: middle; }
+  .module .form-row .change-related span {
+    font-size: 20px;
+    vertical-align: middle; }
+  .module .form-row .add-another {
+    margin-left: 4px; }
+    .module .form-row .add-another:before {
+      font-family: 'jet-icons';
+      speak: none;
+      font-style: normal;
+      font-weight: normal;
+      font-variant: normal;
+      text-transform: none;
+      line-height: 1;
+      /* Better Font Rendering =========== */
+      -webkit-font-smoothing: antialiased;
+      -moz-osx-font-smoothing: grayscale;
       display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px; }
-      .module .form-row .file-upload .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px; }
+      vertical-align: middle;
+      font-size: 18px;
+      content: ""; }
+    .module .form-row .add-another img {
+      display: none; }
+  .module .form-row .field-box {
+    margin-right: 20px;
+    float: left; }
+  .module .form-row .file-upload {
+    background: #F8FAFC;
+    display: inline-block;
+    margin: 0;
+    line-height: 1.5em;
+    padding: 10px;
+    border-radius: 4px; }
+    .module .form-row .file-upload .clearable-file-input label {
+      display: inline;
+      float: none;
+      padding: 0;
+      width: auto;
+      margin-left: 10px; }
+.module.aligned {
+  background-color: #fff;
+  border-radius: 4px;
+  padding: 20px; }
+  .module.aligned ul label {
+    display: inline;
+    float: none;
+    width: auto; }
+  .module.aligned ul {
+    margin: 0 0 0 160px;
+    padding: 0; }
 
 .submit-row {
   padding: 20px 0; }
@@ -3579,14 +3621,8 @@ table#change-history {
       display: none; }
       .changeform-tabs ~ .module .stacked.inline-related.selected {
         display: block; }
-  .changeform .module {
-    padding: 0;
-    background: none;
-    border-radius: 0; }
-    .changeform .module .form-row .select2 {
-      max-width: 586px; }
-  .changeform .aligned {
-    padding: 20px 20px 0 20px; }
+  .changeform .module .form-row .select2 {
+    max-width: 586px; }
   .changeform .inline-group .errornote {
     color: #c7254e;
     margin: 0;
@@ -4776,14 +4812,24 @@ table#change-history {
 .dashboard #content {
   width: 500px; }
 
+#content > h1 {
+  text-transform: uppercase;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 32px;
+  color: #8B9EAB;
+  margin: 0 0 2em 0; }
+
 .small, .module .form-row .help, .module .form-row .errorlist, .changeform .tabular.inline-related .module .errorlist, .login-form .form-row .errorlist {
   font-size: 12px; }
 
 .changeform-object-tools {
-  text-align: right; }
+  text-align: right;
+  overflow: auto; }
 
 ul.object-tools {
-  margin-bottom: 20px !important; }
+  margin-bottom: 20px !important;
+  float: right; }
   ul.object-tools li {
     margin-top: 10px;
     text-align: right; }
@@ -5333,4 +5379,368 @@ img[src$="admin/img/icon-no.gif"] + span {
   border-radius: 0 4px 4px 0 !important;
   padding: 0 10px !important; }
 
+/*
+ * Default variable values
+ * Create separate themes/theme/_variables.scss to override these variables
+ */
+/*
+ * General
+ */
+/*
+ * Sidebar
+ */
+/*
+ * Top
+ */
+/*
+ * Content
+ */
+/*
+ * Buttons
+ */
+/*
+ * Inputs
+ */
+/*
+ * Messages
+ */
+/*
+ * Login
+ */
+/*
+ * jQuery UI
+ */
+/*
+ * Charts
+ */
+.hidden {
+  display: none; }
+
+.clear-list, .sidebar-menu, .sidebar-menu-item-list, .sidebar-popup-list, .top-user-tools, .messagelist, .module .form-row .errorlist, .changeform-tabs, .changeform .tabular.inline-related .module .errorlist, .changeform .stacked-inline-list, .delete-summary ul, .delete-objects-list, .login-form .form-row .errorlist, ul.object-tools, .dashboard-item-content ul:not(.inline), .dashboard-item-content ul.inline {
+  margin: 0;
+  padding: 0;
+  list-style: none; }
+
+.fl {
+  float: left; }
+
+.fr {
+  float: right; }
+
+.cf:before, .cf:after {
+  content: "";
+  display: table; }
+
+.cf:after {
+  clear: both; }
+
+.p10 {
+  padding: 10px; }
+
+.p20 {
+  padding: 20px; }
+
+.p30 {
+  padding: 30px; }
+
+.p40 {
+  padding: 40px; }
+
+.p50 {
+  padding: 50px; }
+
+.p60 {
+  padding: 60px; }
+
+.p70 {
+  padding: 70px; }
+
+.p80 {
+  padding: 80px; }
+
+.pt10 {
+  padding-top: 10px; }
+
+.pt20 {
+  padding-top: 20px; }
+
+.pt30 {
+  padding-top: 30px; }
+
+.pt40 {
+  padding-top: 40px; }
+
+.pt50 {
+  padding-top: 50px; }
+
+.pt60 {
+  padding-top: 60px; }
+
+.pt70 {
+  padding-top: 70px; }
+
+.pt80 {
+  padding-top: 80px; }
+
+.pr10 {
+  padding-right: 10px; }
+
+.pr20 {
+  padding-right: 20px; }
+
+.pr30 {
+  padding-right: 30px; }
+
+.pr40 {
+  padding-right: 40px; }
+
+.pr50 {
+  padding-right: 50px; }
+
+.pr60 {
+  padding-right: 60px; }
+
+.pr70 {
+  padding-right: 70px; }
+
+.pr80 {
+  padding-right: 80px; }
+
+.pb10 {
+  padding-bottom: 10px; }
+
+.pb20 {
+  padding-bottom: 20px; }
+
+.pb30 {
+  padding-bottom: 30px; }
+
+.pb40 {
+  padding-bottom: 40px; }
+
+.pb50 {
+  padding-bottom: 50px; }
+
+.pb60 {
+  padding-bottom: 60px; }
+
+.pb70 {
+  padding-bottom: 70px; }
+
+.pb80 {
+  padding-bottom: 80px; }
+
+.pl10 {
+  padding-left: 10px; }
+
+.pl20 {
+  padding-left: 20px; }
+
+.pl30 {
+  padding-left: 30px; }
+
+.pl40 {
+  padding-left: 40px; }
+
+.pl50 {
+  padding-left: 50px; }
+
+.pl60 {
+  padding-left: 60px; }
+
+.pl70 {
+  padding-left: 70px; }
+
+.pl80 {
+  padding-left: 80px; }
+
+.m10 {
+  margin: 10px; }
+
+.m20 {
+  margin: 20px; }
+
+.m30 {
+  margin: 30px; }
+
+.m40 {
+  margin: 40px; }
+
+.m50 {
+  margin: 50px; }
+
+.m60 {
+  margin: 60px; }
+
+.m70 {
+  margin: 70px; }
+
+.m80 {
+  margin: 80px; }
+
+.mt10 {
+  margin-top: 10px; }
+
+.mt20 {
+  margin-top: 20px; }
+
+.mt30 {
+  margin-top: 30px; }
+
+.mt40 {
+  margin-top: 40px; }
+
+.mt50 {
+  margin-top: 50px; }
+
+.mt60 {
+  margin-top: 60px; }
+
+.mt70 {
+  margin-top: 70px; }
+
+.mt80 {
+  margin-top: 80px; }
+
+.mr10 {
+  margin-right: 10px; }
+
+.mr20 {
+  margin-right: 20px; }
+
+.mr30 {
+  margin-right: 30px; }
+
+.mr40 {
+  margin-right: 40px; }
+
+.mr50 {
+  margin-right: 50px; }
+
+.mr60 {
+  margin-right: 60px; }
+
+.mr70 {
+  margin-right: 70px; }
+
+.mr80 {
+  margin-right: 80px; }
+
+.mb10 {
+  margin-bottom: 10px; }
+
+.mb20 {
+  margin-bottom: 20px; }
+
+.mb30 {
+  margin-bottom: 30px; }
+
+.mb40 {
+  margin-bottom: 40px; }
+
+.mb50 {
+  margin-bottom: 50px; }
+
+.mb60 {
+  margin-bottom: 60px; }
+
+.mb70 {
+  margin-bottom: 70px; }
+
+.mb80 {
+  margin-bottom: 80px; }
+
+.ml10 {
+  margin-left: 10px; }
+
+.ml20 {
+  margin-left: 20px; }
+
+.ml30 {
+  margin-left: 30px; }
+
+.ml40 {
+  margin-left: 40px; }
+
+.ml50 {
+  margin-left: 50px; }
+
+.ml60 {
+  margin-left: 60px; }
+
+.ml70 {
+  margin-left: 70px; }
+
+.ml80 {
+  margin-left: 80px; }
+
+.pos_rel {
+  position: relative; }
+
+.pos_abs {
+  position: absolute; }
+
+.fill_width {
+  width: 100% !important; }
+
+.related-popup {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 4;
+  border: 0;
+  width: 100%;
+  height: 100%;
+  padding-left: 250px;
+  box-sizing: border-box;
+  display: none;
+  background: #f8fafc;
+  background-clip: content-box; }
+  .related-popup-container {
+    display: none;
+    background-color: rgba(0, 0, 0, 0.5);
+    position: fixed;
+    top: 0;
+    left: 0;
+    bottom: 0;
+    right: 0;
+    z-index: 3; }
+    .related-popup-container .loading-indicator {
+      display: none;
+      font-size: 96px;
+      color: #8B9AA7;
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -48px;
+      margin-top: -48px; }
+  .related-popup-back, .related-popup-back:visited, .related-popup-back:hover {
+    display: none;
+    background: #E3ECF2;
+    color: #8B9AA7;
+    position: absolute;
+    top: 20px;
+    left: 250px;
+    z-index: 5;
+    width: 100px;
+    padding: 14px 6px 14px 0;
+    text-align: center;
+    margin-left: -100px;
+    box-sizing: border-box;
+    text-transform: uppercase;
+    border-radius: 6px 0 0 6px;
+    -webkit-transition: background-color 0.3s, color 0.3s;
+    -moz-transition: background-color 0.3s, color 0.3s;
+    -o-transition: background-color 0.3s, color 0.3s;
+    transition: background-color 0.3s, color 0.3s; }
+  .related-popup-back:hover {
+    background: #f8fafc;
+    color: #8B9AA7; }
+  .related-popup-back span {
+    vertical-align: middle;
+    font-weight: bold;
+    font-size: 18px; }
+
 /*# sourceMappingURL=base.css.map */

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-violet/base.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-violet/jquery-ui.theme.css.map


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/css/themes/light-violet/select2.theme.css.map


+ 40 - 1
jet/static/jet/js/main.js

@@ -49,7 +49,7 @@
 
             var addLabelToCheckboxes = function() {
                 var $containers = $('.action-checkbox, .action-checkbox-column').add('.tabular.inline-related .form-row');
-                var $checkboxes = $containers.find('input[type="checkbox"]').add('.checkbox-without-label');
+                var $checkboxes = $containers.find('input[type="checkbox"]').add('.checkbox-without-label').add('label > input[type="checkbox"]');
 
                 $checkboxes.each(function() {
                     addLabelToCheckbox($(this));
@@ -663,9 +663,21 @@
                 $('img[src$="admin/img/icon-unknown.gif"]').after($('<span class="icon-question">'));
             };
 
+            var initChangelistRowSelection = function() {
+                $('#result_list tbody th, #result_list tbody td').on('click', function(e) {
+                    // Fix selection on clicking elements inside row (e.x. links)
+                    if (e.target != this) {
+                        return;
+                    }
+
+                    $(this).closest('tr').find('.action-checkbox .action-select').click();
+                });
+            };
+
             initChangelistHeaders();
             initChangelistFooters();
             initChangelistImages();
+            initChangelistRowSelection();
         };
 
         var initTooltips = function() {
@@ -967,6 +979,32 @@
             });
         };
 
+        var initRelatedPopups = function() {
+            var closeRelatedPopup = function () {
+                var $popups = $('.related-popup');
+                var $container = $('.related-popup-container');
+                var $popup = $popups.last();
+
+                $popup.remove();
+
+                if ($popups.length == 1) {
+                    $container.fadeOut(200, 'swing', function () {
+                        $('.related-popup-back').hide();
+                        $('body').removeClass('non-scrollable');
+                    });
+                }
+            };
+
+            $('.related-popup-back').on('click', function (e) {
+                e.preventDefault();
+                closeRelatedPopup();
+            });
+
+            $(window).on('related-popup:close', function () {
+                closeRelatedPopup();
+            });
+        };
+
         initjQueryCaseInsensitiveSelector();
         initjQuerySlideFadeToggle();
         initFilters();
@@ -983,5 +1021,6 @@
         initUnsavedChangesWarning();
         initScrollbars();
         initThemeChoosing();
+        initRelatedPopups();
     });
 })(jet.jQuery);

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
jet/static/jet/js/main.min.js


+ 82 - 55
jet/templates/admin/base.html

@@ -1,5 +1,5 @@
 {% load i18n admin_static jet_tags %}
-{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}{% format_current_language LANGUAGE_CODE as LANGUAGE_CODE %}{% get_themes as THEMES %}{% get_current_theme as THEME %}{% get_current_jet_version as JET_VERSION %}
+{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}{% format_current_language LANGUAGE_CODE as LANGUAGE_CODE %}{% get_themes as THEMES %}{% get_current_theme as THEME %}{% get_current_jet_version as JET_VERSION %}{% get_side_menu_compact as SIDE_MENU_COMPACT %}
 {% block html %}<!DOCTYPE html>
 <html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
 <head>
@@ -155,6 +155,10 @@
             </div>
 
         {% if not is_popup %}
+            <div class="related-popup-container">
+                <a href="#" class="related-popup-back"><span class="icon-arrow-left"></span> {% trans "back" %}</a>
+                <span class="icon-refresh loading-indicator"></span>
+            </div>
             <div class="sidebar">
                 <div class="sidebar-menu-wrapper">
                     <div id="branding">
@@ -196,34 +200,55 @@
                                     {% csrf_token %}
                                     <input type="hidden" name="app_label">
                                 </form>
-                                <li class="sidebar-menu-item no-horizontal-padding">
-                                    <span class="sidebar-menu-item-title">{% trans 'Applications' %}</span>
-                                    <ul class="sidebar-menu-item-list apps-list-pinned">
-                                        {% for app in app_list.pinned_apps %}
-                                            <li class="sidebar-menu-item-list-item app-item pinned app-{{ app.app_label }}" data-app-label="{{ app.app_label }}">
-                                                <a href="{{ app.app_url }}" class="sidebar-menu-item-list-item-link popup-item-link" data-popup-item-id="sidebar-popup-item-{{ app.app_label }}">
-                                                    <span class="sidebar-menu-item-list-item-arrow icon-arrow-right"></span>
-                                                    <span class="sidebar-menu-item-list-item-link-pin icon-star pin-toggle"></span>
-                                                    <span class="sidebar-menu-item-list-item-link-unpin icon-cross pin-toggle"></span>
-                                                    {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
-                                                </a>
-                                            </li>
-                                        {% endfor %}
-                                    </ul>
-                                    <a href="#" class="sidebar-menu-item-action apps-hide"></a>
-                                    <ul class="sidebar-menu-item-list apps-list">
-                                        {% for app in app_list.apps %}
-                                            <li class="sidebar-menu-item-list-item app-item app-{{ app.app_label }}" data-app-label="{{ app.app_label }}">
-                                                <a href="{{ app.app_url }}" class="sidebar-menu-item-list-item-link popup-item-link" data-popup-item-id="sidebar-popup-item-{{ app.app_label }}">
-                                                    <span class="sidebar-menu-item-list-item-arrow icon-arrow-right"></span>
-                                                    <span class="sidebar-menu-item-list-item-link-pin icon-star pin-toggle"></span>
-                                                    <span class="sidebar-menu-item-list-item-link-unpin icon-cross pin-toggle"></span>
-                                                    {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
-                                                </a>
-                                            </li>
-                                        {% endfor %}
-                                    </ul>
-                                </li>
+                                {% if SIDE_MENU_COMPACT %}
+                                    {% for app in app_list.all_apps %}
+                                        <li class="sidebar-menu-item no-horizontal-padding">
+                                            <a href="{{ app.app_url }}" class="sidebar-menu-item-link">
+                                                {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
+                                            </a>
+                                            <ul class="sidebar-menu-item-list">
+                                                {% for model in app.models %}
+                                                    <li class="sidebar-menu-item-list-item">
+                                                        {% if model.admin_url %}
+                                                            <a href="{{ model.admin_url }}" class="sidebar-menu-item-list-item-link">{{ model.name }}</a>
+                                                        {% else %}
+                                                            {{ model.name }}
+                                                        {% endif %}
+                                                    </li>
+                                                {% endfor %}
+                                            </ul>
+                                        </li>
+                                    {% endfor %}
+                                {% else %}
+                                    <li class="sidebar-menu-item no-horizontal-padding">
+                                        <span class="sidebar-menu-item-title">{% trans 'Applications' %}</span>
+                                        <ul class="sidebar-menu-item-list apps-list-pinned">
+                                            {% for app in app_list.pinned_apps %}
+                                                <li class="sidebar-menu-item-list-item app-item pinned app-{{ app.app_label }}" data-app-label="{{ app.app_label }}">
+                                                    <a href="{{ app.app_url }}" class="sidebar-menu-item-list-item-link popup-item-link" data-popup-item-id="sidebar-popup-item-{{ app.app_label }}">
+                                                        <span class="sidebar-menu-item-list-item-arrow icon-arrow-right"></span>
+                                                        <span class="sidebar-menu-item-list-item-link-pin icon-star pin-toggle"></span>
+                                                        <span class="sidebar-menu-item-list-item-link-unpin icon-cross pin-toggle"></span>
+                                                        {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
+                                                    </a>
+                                                </li>
+                                            {% endfor %}
+                                        </ul>
+                                        <a href="#" class="sidebar-menu-item-action apps-hide"></a>
+                                        <ul class="sidebar-menu-item-list apps-list">
+                                            {% for app in app_list.apps %}
+                                                <li class="sidebar-menu-item-list-item app-item app-{{ app.app_label }}" data-app-label="{{ app.app_label }}">
+                                                    <a href="{{ app.app_url }}" class="sidebar-menu-item-list-item-link popup-item-link" data-popup-item-id="sidebar-popup-item-{{ app.app_label }}">
+                                                        <span class="sidebar-menu-item-list-item-arrow icon-arrow-right"></span>
+                                                        <span class="sidebar-menu-item-list-item-link-pin icon-star pin-toggle"></span>
+                                                        <span class="sidebar-menu-item-list-item-link-unpin icon-cross pin-toggle"></span>
+                                                        {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
+                                                    </a>
+                                                </li>
+                                            {% endfor %}
+                                        </ul>
+                                    </li>
+                                {% endif %}
                             {% endif %}
                             <li class="sidebar-menu-item no-horizontal-padding">
                                 <div class="dialog-confirm" id="bookmarks-add-dialog" title="{% trans "Add bookmark" %}">
@@ -269,36 +294,38 @@
                 <div class="sidebar-copyright">powered by DJANGO JET</div>
             </div>
 
-            {% if app_list %}
-                <div class="sidebar-popup-container">
-                    <div class="sidebar-popup">
-                        {% for app in app_list.apps|add:app_list.pinned_apps %}
-                            <div class="sidebar-popup-item" id="sidebar-popup-item-{{ app.app_label }}">
-                                <div class="sidebar-popup-title">
-                                    {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
-                                </div>
-
-                                <input class="sidebar-popup-search" placeholder="Search...">
+            {% if not SIDE_MENU_COMPACT %}
+                {% if app_list %}
+                    <div class="sidebar-popup-container">
+                        <div class="sidebar-popup">
+                            {% for app in app_list.apps|add:app_list.pinned_apps %}
+                                <div class="sidebar-popup-item" id="sidebar-popup-item-{{ app.app_label }}">
+                                    <div class="sidebar-popup-title">
+                                        {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
+                                    </div>
 
-                                <ul class="sidebar-popup-list">
-                                    <li class="sidebar-popup-list-item app-{{ app.app_label }}{{ app.current|yesno:" current," }}">
-                                        <a href="{{ app.app_url }}" class="sidebar-popup-list-item-link">{% trans 'Application page' %}</a>
-                                    </li>
+                                    <input class="sidebar-popup-search" placeholder="Search...">
 
-                                    {% for model in app.models %}
-                                        <li class="sidebar-popup-list-item model-{{ model.object_name|lower }}{{ model.current|yesno:" current," }}">
-                                            {% if model.admin_url %}
-                                                <a href="{{ model.admin_url }}" class="sidebar-popup-list-item-link">{{ model.name }}</a>
-                                            {% else %}
-                                                {{ model.name }}
-                                            {% endif %}
+                                    <ul class="sidebar-popup-list">
+                                        <li class="sidebar-popup-list-item app-{{ app.app_label }}{{ app.current|yesno:" current," }}">
+                                            <a href="{{ app.app_url }}" class="sidebar-popup-list-item-link">{% trans 'Application page' %}</a>
                                         </li>
-                                    {% endfor %}
-                                </ul>
-                            </div>
-                        {% endfor %}
+
+                                        {% for model in app.models %}
+                                            <li class="sidebar-popup-list-item model-{{ model.object_name|lower }}{{ model.current|yesno:" current," }}">
+                                                {% if model.admin_url %}
+                                                    <a href="{{ model.admin_url }}" class="sidebar-popup-list-item-link">{{ model.name }}</a>
+                                                {% else %}
+                                                    {{ model.name }}
+                                                {% endif %}
+                                            </li>
+                                        {% endfor %}
+                                    </ul>
+                                </div>
+                            {% endfor %}
+                        </div>
                     </div>
-                </div>
+                {% endif %}
             {% endif %}
             </div>
         {% endif %}

+ 2 - 4
jet/templates/admin/change_form.html

@@ -3,7 +3,6 @@
 
 {% block extrahead %}
     {{ block.super }}
-    <script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
     {{ media }}
 {% endblock %}
 
@@ -46,6 +45,7 @@
         <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>
             {% csrf_token %}
             {% block form_top %}{% endblock %}
+            {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
             {% filter_fieldsets_with_errors adminform as fieldsets_with_errors %}
             <div class="changeform">
                 {% if adminform.fieldsets|length > 1 or inline_admin_formsets|length > 0 %}
@@ -78,7 +78,6 @@
 
                 {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %}
                 {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %}
-                {% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
                 {% if errors %}
                     {{ adminform.form.non_field_errors }}
                 {% endif %}
@@ -104,8 +103,6 @@
 
                 {% block after_related_objects %}{% endblock %}
 
-                {% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
-
                 {% block admin_change_form_document_ready %}
                     <script type="text/javascript">
                         (function($) {
@@ -129,6 +126,7 @@
                 {# JavaScript for prepopulated fields #}
                 {% prepopulated_fields_js %}
             </div>
+            {% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
         </form>
     </div>
 {% endblock %}

+ 1 - 4
jet/templates/admin/change_list.html

@@ -5,9 +5,6 @@
 
 {% block extrastyle %}
     {{ block.super }}
-    {% if cl.formset or action_form %}
-    <script type="text/javascript" src="{% url 'admin:jsi18n' %}"></script>
-    {% endif %}
     {{ media.css }}
 {% endblock %}
 
@@ -43,7 +40,7 @@
   <div id="content-main">
     {% block object-tools %}
       {% if has_add_permission %}
-        <ul class="object-tools fr">
+        <ul class="object-tools">
           {% block object-tools-items %}
             <li>
               {% url cl.opts|admin_urlname:'add' as add_url %}

+ 1 - 1
jet/templates/admin/includes/fieldset.html

@@ -18,7 +18,7 @@
                     {% if field.is_checkbox %}
                         {{ field.field }}{{ field.label_tag }}
                     {% else %}
-                        {{ field.label_tag }}
+                        {% if field.field.label != '' %}{{ field.label_tag }}{% endif %}
                         {% if field.is_readonly %}
                             <p>{{ field.contents }}</p>
                         {% else %}

+ 3 - 5
jet/templates/admin/popup_response.html

@@ -4,14 +4,12 @@
   <body>
     <script type="text/javascript">
       {% if action == 'change' %}
-        opener.dismissChangeRelatedObjectPopup(window, "{{ value }}", "{{ obj }}", "{{ new_value }}");
+        parent.window.dismissChangeRelatedObjectPopup(window, "{{ value }}", "{{ obj }}", "{{ new_value }}");
       {% elif action == 'delete' %}
-        opener.dismissDeleteRelatedObjectPopup(window, "{{ value }}");
+        parent.window.dismissDeleteRelatedObjectPopup(window, "{{ value }}");
       {% else %}
-        opener.dismissAddRelatedObjectPopup(window, "{{ value }}", "{{ obj }}");
+        parent.window.dismissAddRelatedObjectPopup(window, "{{ value }}", "{{ obj }}");
       {% endif %}
-
-      opener.jet.jQuery('select').trigger('select:init');
     </script>
   </body>
 </html>

+ 3 - 4
jet/templates/registration/password_change_form.html

@@ -46,12 +46,11 @@
                     </div>
                 </fieldset>
 
-                <div class="submit-row">
-                    <input type="submit" value="{% trans 'Change my password' %}" class="default" />
-                </div>
-
                 <script type="text/javascript">document.getElementById("id_old_password").focus();</script>
             </div>
+            <div class="submit-row">
+                <input type="submit" value="{% trans 'Change my password' %}" class="default" />
+            </div>
         </form>
     </div>
 {% endblock %}

+ 45 - 2
jet/templatetags/jet_tags.py

@@ -126,12 +126,48 @@ def format_deletable_object(deletable_object):
 
 @register.assignment_tag(takes_context=True)
 def get_menu(context):
-    app_list = get_app_list(context)
+    if settings.JET_SIDE_MENU_CUSTOM_APPS not in (None, False):
+        app_list = get_app_list(context, False)
+        app_dict = {}
+        models_dict = {}
+
+        for app in app_list:
+            app_label = app.get('app_label', app.get('name'))
+            app_dict[app_label] = app
+
+            for model in app['models']:
+                if app_label not in models_dict:
+                    models_dict[app_label] = {}
+
+                models_dict[app_label][model['object_name']] = model
+
+            app['models'] = []
+
+        app_list = []
+
+        for item in settings.JET_SIDE_MENU_CUSTOM_APPS:
+            app_label, models = item
+
+            if app_label in app_dict:
+                app = app_dict[app_label]
+
+                for model_label in models:
+                    if model_label == '__all__':
+                        app['models'] = models_dict[app_label].values()
+                        break
+                    elif model_label in models_dict[app_label]:
+                        model = models_dict[app_label][model_label]
+                        app['models'].append(model)
+
+                app_list.append(app)
+    else:
+        app_list = get_app_list(context)
 
     current_found = False
 
     pinned = PinnedApplication.objects.values_list('app_label', flat=True)
 
+    all_aps = []
     apps = []
     pinned_apps = []
 
@@ -152,7 +188,9 @@ def get_menu(context):
         else:
             apps.append(app)
 
-    return {'apps': apps, 'pinned_apps': pinned_apps}
+        all_aps.append(app)
+
+    return {'apps': apps, 'pinned_apps': pinned_apps, 'all_apps': all_aps}
 
 
 @register.assignment_tag
@@ -261,3 +299,8 @@ def get_themes():
 @register.assignment_tag
 def get_current_jet_version():
     return VERSION
+
+
+@register.assignment_tag
+def get_side_menu_compact():
+    return settings.JET_SIDE_MENU_COMPACT

+ 68 - 0
jet/tests/test_ordered_set.py

@@ -0,0 +1,68 @@
+from django.test import TestCase
+import pickle
+from jet.ordered_set import OrderedSet
+
+
+class OrderedSetTestCase(TestCase):
+    def test_pickle(self):
+        set1 = OrderedSet('abracadabra')
+        roundtrip = pickle.loads(pickle.dumps(set1))
+        self.assertEqual(roundtrip, set1)
+
+    def test_empty_pickle(self):
+        empty_oset = OrderedSet()
+        empty_roundtrip = pickle.loads(pickle.dumps(empty_oset))
+        self.assertEqual(empty_roundtrip, empty_oset)
+
+    def test_order(self):
+        set1 = OrderedSet('abracadabra')
+        self.assertEqual(len(set1), 5)
+        self.assertEqual(set1, OrderedSet(['a', 'b', 'r', 'c', 'd']))
+        self.assertEqual(list(reversed(set1)), ['d', 'c', 'r', 'b', 'a'])
+
+    def test_binary_operations(self):
+        set1 = OrderedSet('abracadabra')
+        set2 = OrderedSet('simsalabim')
+
+        self.assertNotEqual(set1, set2)
+        self.assertEqual(set1 & set2, OrderedSet(['a', 'b']))
+        self.assertEqual(set1 | set2, OrderedSet(['a', 'b', 'r', 'c', 'd', 's', 'i', 'm', 'l']))
+        self.assertEqual(set1 - set2, OrderedSet(['r', 'c', 'd']))
+
+    def test_remove(self):
+        set1 = OrderedSet('abracadabra')
+
+        set1.remove('a')
+        set1.remove('b')
+
+        self.assertEqual(set1, OrderedSet('rcd'))
+        self.assertNotIn('a', set1)
+        self.assertNotIn('b', set1)
+        self.assertIn('r', set1)
+
+        set1.discard('a')
+        set1.discard('a')
+
+    def test_remove_error(self):
+        set1 = OrderedSet('abracadabra')
+        try:
+            set1.remove('z')
+        except KeyError:
+            pass
+
+    def test_clear(self):
+        set1 = OrderedSet('abracadabra')
+        set1.clear()
+
+        self.assertEqual(len(set1), 0)
+        self.assertEqual(set1, OrderedSet())
+
+    def test_pop(self):
+        set1 = OrderedSet('ab')
+        elem = set1.pop()
+
+        self.assertEqual(elem, 'b')
+        elem = set1.pop()
+
+        self.assertEqual(elem, 'a')
+        self.assertRaises(KeyError, set1.pop)

+ 0 - 2
jet/tests/test_tags.py

@@ -1,6 +1,4 @@
 from django import forms
-from django.forms import ModelChoiceField
-from django.forms.forms import BoundField
 from django.test import TestCase
 from jet.templatetags.jet_tags import select2_lookups
 from jet.tests.models import TestModel, SearchableTestModel

+ 49 - 1
jet/tests/test_utils.py

@@ -1,7 +1,9 @@
+from datetime import datetime, date
 import json
+from django.contrib.admin import AdminSite
 from django.test import TestCase
 from jet.tests.models import TestModel
-from jet.utils import JsonResponse, get_model_instance_label
+from jet.utils import JsonResponse, get_model_instance_label, get_app_list, get_admin_site, LazyDateTimeEncoder
 
 
 class UtilsTestCase(TestCase):
@@ -18,5 +20,51 @@ class UtilsTestCase(TestCase):
         pinned_application = TestModel.objects.create(field1=field1, field2=field2)
         self.assertEqual(get_model_instance_label(pinned_application), '%s%d' % (field1, field2))
 
+    def test_get_app_list(self):
+        class User:
+            is_active = True
+            is_staff = True
 
+            def has_module_perms(self, app):
+                return True
+
+            def has_perm(self, object):
+                return True
+
+        class Request:
+            user = User()
+
+        app_list = get_app_list({
+            'request': Request(),
+            'user': None
+        })
+
+        self.assertIsInstance(app_list, list)
+
+        for app in app_list:
+            self.assertIsInstance(app, dict)
+            self.assertIsNotNone(app, app.get('models'))
+            self.assertIsNotNone(app, app.get('app_url'))
+            self.assertIsNotNone(app, app.get('app_label'))
+
+            for model in app['models']:
+                self.assertIsNotNone(app, model.get('object_name'))
+                self.assertIsNotNone(app, model.get('name'))
+
+    def test_get_admin_site(self):
+        admin_site = get_admin_site('')
+        self.assertIsInstance(admin_site, AdminSite)
+
+    def test_lazy_date_time_encoder_dates(self):
+        encoder = LazyDateTimeEncoder()
+
+        ts = datetime.now()
+        self.assertEqual(encoder.encode(ts), '"%s"' % ts.isoformat())
+
+        ts = date(2015, 5, 3)
+        self.assertEqual(encoder.encode(ts), '"%s"' % ts.isoformat())
+
+    def test_lazy_date_time_encoder_dict(self):
+        encoder = LazyDateTimeEncoder()
+        self.assertEqual(encoder.encode({'key': 1}), '{"key": 1}')
 

+ 0 - 5
jet/tests/test_views.py

@@ -223,8 +223,3 @@ class ViewsTestCase(TestCase):
         response = json.loads(response.content.decode())
         self.assertFalse(response['error'])
         self.assertFalse(UserDashboardModule.objects.filter(pk=module.pk).exists())
-
-
-
-
-

+ 1 - 1
jet/urls.py

@@ -27,7 +27,7 @@ urlpatterns = patterns(
     url(
         r'^jsi18n/$',
         javascript_catalog,
-        {'packages': ('jet',)},
+        {'packages': ('django.conf', 'django.contrib.admin', 'jet',)},
         name='jsi18n'
     ),
 )

+ 74 - 10
jet/utils.py

@@ -1,12 +1,19 @@
 import datetime
 import json
+try:
+    from django.apps.registry import apps
+except ImportError:
+    try:
+        from django.apps import apps # Fix Django 1.7 import issue
+    except ImportError:
+        pass
 from django.core.serializers.json import DjangoJSONEncoder
 from django.http import HttpResponse
-from django.core.urlresolvers import reverse, resolve
+from django.core.urlresolvers import reverse, resolve, NoReverseMatch
 from django.contrib import admin
 from django.contrib.admin import AdminSite
 from django.utils.encoding import smart_text
-from jet import settings
+from django.utils.text import capfirst
 from django.contrib import messages
 from django.utils.encoding import force_text
 from django.utils.functional import Promise
@@ -33,13 +40,70 @@ class JsonResponse(HttpResponse):
         super(JsonResponse, self).__init__(content=data, **kwargs)
 
 
-def get_app_list(context):
-    template_response = get_admin_site(context.get('current_app', '')).index(context['request'])
-
-    try:
-        return template_response.context_data['app_list']
-    except Exception:
-        return None
+def get_app_list(context, order=True):
+    admin_site = get_admin_site(context.get('current_app', ''))
+    request = context['request']
+
+    app_dict = {}
+    for model, model_admin in admin_site._registry.items():
+        app_label = model._meta.app_label
+        try:
+            has_module_perms = model_admin.has_module_permission(request)
+        except AttributeError:
+            has_module_perms = request.user.has_module_perms(app_label) # Fix Django < 1.8 issue
+
+        if has_module_perms:
+            perms = model_admin.get_model_perms(request)
+
+            # Check whether user has any perm for this module.
+            # If so, add the module to the model_list.
+            if True in perms.values():
+                info = (app_label, model._meta.model_name)
+                model_dict = {
+                    'name': capfirst(model._meta.verbose_name_plural),
+                    'object_name': model._meta.object_name,
+                    'perms': perms,
+                }
+                if perms.get('change', False):
+                    try:
+                        model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=admin_site.name)
+                    except NoReverseMatch:
+                        pass
+                if perms.get('add', False):
+                    try:
+                        model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=admin_site.name)
+                    except NoReverseMatch:
+                        pass
+                if app_label in app_dict:
+                    app_dict[app_label]['models'].append(model_dict)
+                else:
+                    try:
+                        name = apps.get_app_config(app_label).verbose_name
+                    except NameError:
+                        name = app_label.title()
+                    app_dict[app_label] = {
+                        'name': name,
+                        'app_label': app_label,
+                        'app_url': reverse(
+                            'admin:app_list',
+                            kwargs={'app_label': app_label},
+                            current_app=admin_site.name,
+                        ),
+                        'has_module_perms': has_module_perms,
+                        'models': [model_dict],
+                    }
+
+    # Sort the apps alphabetically.
+    app_list = list(app_dict.values())
+
+    if order:
+        app_list.sort(key=lambda x: x['name'].lower())
+
+        # Sort the models alphabetically within each app.
+        for app in app_list:
+            app['models'].sort(key=lambda x: x['name'])
+
+    return app_list
 
 
 def get_admin_site(current_app):
@@ -64,7 +128,7 @@ class LazyDateTimeEncoder(json.JSONEncoder):
             return obj.isoformat()
         elif isinstance(obj, Promise):
             return force_text(obj)
-        return json.JSONEncoder.default(self, obj)
+        return self.encode(obj)
 
 
 def get_model_instance_label(instance):

Vissa filer visades inte eftersom för många filer har ändrats