Browse Source

Merge branch 'dev'

Denis K 8 years ago
parent
commit
b406bb5daa
100 changed files with 4402 additions and 31472 deletions
  1. 1 0
      .gitignore
  2. 13 0
      CHANGELOG.rst
  3. 109 0
      gulpfile.js
  4. 1 1
      jet/__init__.py
  5. 8 2
      jet/dashboard/forms.py
  6. BIN
      jet/dashboard/locale/en/LC_MESSAGES/django.mo
  7. 405 0
      jet/dashboard/locale/en/LC_MESSAGES/django.po
  8. BIN
      jet/dashboard/locale/en/LC_MESSAGES/djangojs.mo
  9. 28 0
      jet/dashboard/locale/en/LC_MESSAGES/djangojs.po
  10. BIN
      jet/dashboard/locale/ru/LC_MESSAGES/django.mo
  11. 411 0
      jet/dashboard/locale/ru/LC_MESSAGES/django.po
  12. BIN
      jet/dashboard/locale/ru/LC_MESSAGES/djangojs.mo
  13. 28 0
      jet/dashboard/locale/ru/LC_MESSAGES/djangojs.po
  14. 9 21
      jet/dashboard/templates/admin/app_index.html
  15. 8 6
      jet/dashboard/templates/admin/index.html
  16. 1 1
      jet/dashboard/templates/jet.dashboard/dashboard.html
  17. 8 3
      jet/dashboard/templates/jet.dashboard/dashboard_tools.html
  18. 2 2
      jet/dashboard/templates/jet.dashboard/modules/app_list.html
  19. 2 2
      jet/dashboard/templates/jet.dashboard/modules/feed.html
  20. 2 2
      jet/dashboard/templates/jet.dashboard/modules/model_list.html
  21. 22 20
      jet/dashboard/templates/jet.dashboard/modules/recent_actions.html
  22. 54 97
      jet/dashboard/templates/jet.dashboard/update_module.html
  23. 16 14
      jet/dashboard/templates/jet.dashboard/update_module_fieldset.html
  24. 2 1
      jet/dashboard/urls.py
  25. 8 0
      jet/dashboard/views.py
  26. 13 0
      jet/forms.py
  27. BIN
      jet/locale/en/LC_MESSAGES/django.mo
  28. 20 793
      jet/locale/en/LC_MESSAGES/django.po
  29. BIN
      jet/locale/en/LC_MESSAGES/djangojs.mo
  30. 9 25
      jet/locale/en/LC_MESSAGES/djangojs.po
  31. BIN
      jet/locale/ru/LC_MESSAGES/django.mo
  32. 23 807
      jet/locale/ru/LC_MESSAGES/django.po
  33. BIN
      jet/locale/ru/LC_MESSAGES/djangojs.mo
  34. 9 25
      jet/locale/ru/LC_MESSAGES/djangojs.po
  35. 0 0
      jet/static/admin/css/base.css
  36. 0 0
      jet/static/admin/css/dashboard.css
  37. 0 0
      jet/static/admin/css/fonts.css
  38. 0 0
      jet/static/admin/css/login.css
  39. 0 0
      jet/static/admin/css/rtl.css
  40. 0 0
      jet/static/admin/css/widgets.css
  41. 0 3
      jet/static/admin/js/SelectFilter2.js
  42. 0 204
      jet/static/admin/js/admin/RelatedObjectLookups.js
  43. 0 0
      jet/static/admin/js/admin/RelatedObjectLookups.min.js
  44. 0 293
      jet/static/admin/js/inlines.js
  45. 0 0
      jet/static/admin/js/inlines.min.js
  46. 0 1
      jet/static/admin/js/related-widget-wrapper.min.js
  47. 127 38
      jet/static/jet/css/_base.scss
  48. 45 0
      jet/static/jet/css/_breadcrumbs.scss
  49. 0 47
      jet/static/jet/css/_buttongroup.scss
  50. 741 357
      jet/static/jet/css/_changeform.scss
  51. 387 37
      jet/static/jet/css/_changelist.scss
  52. 252 97
      jet/static/jet/css/_content.scss
  53. 240 13
      jet/static/jet/css/_dashboard.scss
  54. 91 0
      jet/static/jet/css/_delete-confirmation.scss
  55. 0 68
      jet/static/jet/css/_delete.scss
  56. 77 128
      jet/static/jet/css/_forms.scss
  57. 1 1
      jet/static/jet/css/_globals.scss
  58. 213 0
      jet/static/jet/css/_header.scss
  59. 11 55
      jet/static/jet/css/_helpers.scss
  60. 91 64
      jet/static/jet/css/_login.scss
  61. 83 17
      jet/static/jet/css/_messages.scss
  62. 55 0
      jet/static/jet/css/_modules.scss
  63. 49 0
      jet/static/jet/css/_object-tools.scss
  64. 40 7
      jet/static/jet/css/_relatedpopup.scss
  65. 381 211
      jet/static/jet/css/_sidebar.scss
  66. 0 169
      jet/static/jet/css/_table.scss
  67. 193 0
      jet/static/jet/css/_tables.scss
  68. 0 151
      jet/static/jet/css/_top.scss
  69. 6 1
      jet/static/jet/css/_variables.scss
  70. 5 0
      jet/static/jet/css/icons/_variables.scss
  71. BIN
      jet/static/jet/css/icons/fonts/jet-icons.eot
  72. 0 0
      jet/static/jet/css/icons/fonts/jet-icons.svg
  73. BIN
      jet/static/jet/css/icons/fonts/jet-icons.ttf
  74. BIN
      jet/static/jet/css/icons/fonts/jet-icons.woff
  75. 55 52
      jet/static/jet/css/icons/style.css
  76. 37 1
      jet/static/jet/css/jquery-ui/_jquery-ui.theme.scss
  77. 9 8
      jet/static/jet/css/select2/_layout.scss
  78. 0 5746
      jet/static/jet/css/themes/default/base.css
  79. 0 2
      jet/static/jet/css/themes/default/base.css.map
  80. 0 403
      jet/static/jet/css/themes/default/jquery-ui.theme.css
  81. 0 2
      jet/static/jet/css/themes/default/jquery-ui.theme.css.map
  82. 0 920
      jet/static/jet/css/themes/default/select2.theme.css
  83. 0 2
      jet/static/jet/css/themes/default/select2.theme.css.map
  84. 1 1
      jet/static/jet/css/themes/green/_variables.scss
  85. 0 5777
      jet/static/jet/css/themes/green/base.css
  86. 0 2
      jet/static/jet/css/themes/green/base.css.map
  87. 0 434
      jet/static/jet/css/themes/green/jquery-ui.theme.css
  88. 0 2
      jet/static/jet/css/themes/green/jquery-ui.theme.css.map
  89. 0 951
      jet/static/jet/css/themes/green/select2.theme.css
  90. 0 2
      jet/static/jet/css/themes/green/select2.theme.css.map
  91. 0 5777
      jet/static/jet/css/themes/light-blue/base.css
  92. 0 2
      jet/static/jet/css/themes/light-blue/base.css.map
  93. 0 434
      jet/static/jet/css/themes/light-blue/jquery-ui.theme.css
  94. 0 2
      jet/static/jet/css/themes/light-blue/jquery-ui.theme.css.map
  95. 0 951
      jet/static/jet/css/themes/light-blue/select2.theme.css
  96. 0 2
      jet/static/jet/css/themes/light-blue/select2.theme.css.map
  97. 0 5777
      jet/static/jet/css/themes/light-gray/base.css
  98. 0 2
      jet/static/jet/css/themes/light-gray/base.css.map
  99. 0 434
      jet/static/jet/css/themes/light-gray/jquery-ui.theme.css
  100. 0 2
      jet/static/jet/css/themes/light-gray/jquery-ui.theme.css.map

+ 1 - 0
.gitignore

@@ -4,3 +4,4 @@
 /dist/
 /.idea
 /docs/_build/
+/node_modules/

+ 13 - 0
CHANGELOG.rst

@@ -1,6 +1,19 @@
 Changelog
 =========
 
+0.9.0
+-----
+* Almost complete layout rewrite with only 3 template overrides
+* Responsive layout for mobile devices
+* Reorganized scripts (Browserify + gulp)
+* Updated table sortable headers style
+* Fixed related object popups bugs
+* Added check for JS language files existence before load
+* Refactored locale files
+* Fixed admin permissions checks
+* Fixed compatibility issue with Django 1.10
+
+
 0.1.5
 -----
 * Add inlines.min.js

+ 109 - 0
gulpfile.js

@@ -0,0 +1,109 @@
+require('es6-promise').polyfill();
+
+var gulp = require('gulp'),
+    browserify = require('browserify'),
+    concatCss = require('gulp-concat-css'),
+    minifyCss = require('gulp-minify-css'),
+    sass = require('gulp-sass'),
+    uglify = require('gulp-uglify'),
+    buffer = require('vinyl-buffer'),
+    source = require('vinyl-source-stream'),
+    sourcemaps = require('gulp-sourcemaps'),
+    merge = require('merge-stream'),
+    postcss = require('gulp-postcss'),
+    pxtorem = require('postcss-pxtorem'),
+    autoprefixer = require('autoprefixer'),
+    shell = require('gulp-shell');
+
+var cssProcessors = [
+    autoprefixer(),
+    pxtorem({
+        rootValue: 14,
+        replace: false,
+        propWhiteList: []
+    })
+];
+
+gulp.task('scripts', function() {
+    browserify('./jet/static/jet/js/src/main.js')
+        .bundle()
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(source('bundle.min.js'))
+        .pipe(buffer())
+        .pipe(uglify())
+        .pipe(gulp.dest('./jet/static/jet/js/build/'));
+});
+
+gulp.task('styles', function() {
+    gulp.src('./jet/static/jet/css/**/*.scss')
+        .pipe(sourcemaps.init())
+        .pipe(sass({
+            outputStyle: 'compressed'
+        }))
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(postcss(cssProcessors))
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(sourcemaps.write('./'))
+        .pipe(gulp.dest('./jet/static/jet/css'));
+});
+
+gulp.task('vendor-styles', function() {
+    merge(
+        gulp.src([
+            './node_modules/select2/dist/css/select2.css',
+            './node_modules/jquery-ui/themes/base/all.css',
+            './node_modules/timepicker/jquery.ui.timepicker.css'
+        ]),
+        gulp.src([
+            './node_modules/perfect-scrollbar/src/css/main.scss'
+        ])
+            .pipe(sass({
+                outputStyle: 'compressed'
+            }))
+            .on('error', function(error) {
+                console.error(error);
+            })
+    )
+        .pipe(postcss(cssProcessors))
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(minifyCss())
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(concatCss('vendor.css'))
+        .on('error', function(error) {
+            console.error(error);
+        })
+        .pipe(gulp.dest('./jet/static/jet/css'));
+});
+
+gulp.task('vendor-translations', function() {
+    gulp.src(['./node_modules/jquery-ui/ui/i18n/*.js'])
+        .pipe(gulp.dest('./jet/static/jet/js/i18n/jquery-ui/'));
+
+    gulp.src(['./node_modules/timepicker/i18n/*.js'])
+        .pipe(gulp.dest('./jet/static/jet/js/i18n/jquery-ui-timepicker/'));
+
+    gulp.src(['./node_modules/select2/dist/js/i18n/*.js'])
+        .pipe(gulp.dest('./jet/static/jet/js/i18n/select2/'));
+});
+
+gulp.task('locales', shell.task('python manage.py compilemessages', { quiet: true }));
+
+gulp.task('build', ['scripts', 'styles', 'vendor-styles', 'vendor-translations', 'locales']);
+
+gulp.task('watch', function() {
+    gulp.watch('./jet/static/jet/js/src/**/*.js', ['scripts']);
+    gulp.watch('./jet/static/jet/css/**/*.scss', ['styles']);
+    gulp.watch('./jet/locale/**/*.po', ['locales']);
+});
+
+gulp.task('default', ['build', 'watch']);

+ 1 - 1
jet/__init__.py

@@ -1 +1 @@
-VERSION = '0.1.5'
+VERSION = '0.9.0'

+ 8 - 2
jet/dashboard/forms.py

@@ -17,6 +17,9 @@ class UpdateDashboardModulesForm(forms.Form):
     def clean(self):
         data = super(UpdateDashboardModulesForm, self).clean()
 
+        if not self.request.user.is_authenticated():
+            raise ValidationError('error')
+
         try:
             modules = json.loads(data['modules'])
 
@@ -65,6 +68,9 @@ class AddUserDashboardModuleForm(forms.ModelForm):
     def clean(self):
         data = super(AddUserDashboardModuleForm, self).clean()
 
+        if not self.request.user.is_authenticated():
+            raise ValidationError('error')
+
         if 'app_label' in data:
             index_dashboard_cls = get_current_dashboard('app_index' if data['app_label'] else 'index')
             index_dashboard = index_dashboard_cls({'request': self.request}, app_label=data['app_label'])
@@ -104,7 +110,7 @@ class UpdateDashboardModuleCollapseForm(forms.ModelForm):
     def clean(self):
         data = super(UpdateDashboardModuleCollapseForm, self).clean()
 
-        if self.instance.user != self.request.user.pk:
+        if not self.request.user.is_authenticated() or self.instance.user != self.request.user.pk:
             raise ValidationError('error')
 
         return data
@@ -122,7 +128,7 @@ class RemoveDashboardModuleForm(forms.ModelForm):
     def clean(self):
         cleaned_data = super(RemoveDashboardModuleForm, self).clean()
 
-        if self.instance.user != self.request.user.pk:
+        if not self.request.user.is_authenticated() or self.instance.user != self.request.user.pk:
             raise ValidationError('error')
 
         return cleaned_data

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


+ 405 - 0
jet/dashboard/locale/en/LC_MESSAGES/django.po

@@ -0,0 +1,405 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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/modules.py:138 templates/admin/base.html:281
+msgid "URL"
+msgstr ""
+
+#: dashboard/dashboard.py:207
+msgid "Quick links"
+msgstr ""
+
+#: dashboard/dashboard.py:213
+msgid "Return to site"
+msgstr ""
+
+#: dashboard/dashboard.py:224 dashboard/modules.py:268
+msgid "Applications"
+msgstr ""
+
+#: dashboard/dashboard.py:232
+msgid "Administration"
+msgstr ""
+
+#: dashboard/dashboard.py:240 dashboard/modules.py:413
+msgid "Recent Actions"
+msgstr ""
+
+#: dashboard/dashboard.py:248
+msgid "Latest Django News"
+msgstr ""
+
+#: dashboard/dashboard.py:257
+msgid "Support"
+msgstr ""
+
+#: dashboard/dashboard.py:260
+msgid "Django documentation"
+msgstr ""
+
+#: dashboard/dashboard.py:265
+msgid "Django \"django-users\" mailing list"
+msgstr ""
+
+#: dashboard/dashboard.py:270
+msgid "Django irc channel"
+msgstr ""
+
+#: dashboard/dashboard.py:285
+msgid "Application models"
+msgstr ""
+
+#: dashboard/models.py:11 dashboard/modules.py:139
+msgid "Title"
+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: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 "Access"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:163
+#: dashboard/dashboard_modules/yandex_metrika.py:118
+msgid "Counter"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:164
+#: dashboard/dashboard_modules/yandex_metrika.py:119
+msgid "Statistics period"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:165
+#: dashboard/dashboard_modules/yandex_metrika.py:120
+msgid "Today"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:166
+#: dashboard/dashboard_modules/yandex_metrika.py:121
+msgid "Last week"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:167
+#: dashboard/dashboard_modules/yandex_metrika.py:122
+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:179
+#: dashboard/dashboard_modules/yandex_metrika.py:134
+msgid "none"
+msgstr ""
+
+#: 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:182
+#: dashboard/dashboard_modules/yandex_metrika.py:137
+msgid "counters loading failed"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:187
+#: dashboard/dashboard_modules/yandex_metrika.py:142
+msgid "Show"
+msgstr ""
+
+#: 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:189
+#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:16
+msgid "Sessions"
+msgstr ""
+
+#: 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:192
+#: dashboard/dashboard_modules/google_analytics.py:200
+#: dashboard/dashboard_modules/yandex_metrika.py:147
+#: dashboard/dashboard_modules/yandex_metrika.py:155
+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 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: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:279
+#, python-format
+msgid ""
+"Please <a href=\"%s\">select Google Analytics counter</a> to start using "
+"widget"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:298
+#: dashboard/dashboard_modules/google_analytics_views.py:42
+#: 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: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:310
+msgid "Google Analytics visitors totals"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:325
+msgid "users"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:326
+msgid "sessions"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:327
+#: dashboard/dashboard_modules/yandex_metrika.py:266
+msgid "views"
+msgstr ""
+
+#: 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:339
+msgid "Google Analytics visitors chart"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics.py:397
+msgid "Google Analytics period visitors"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics_views.py:26
+#: dashboard/dashboard_modules/google_analytics_views.py:46
+#: dashboard/dashboard_modules/yandex_metrika_views.py:23
+#: dashboard/dashboard_modules/yandex_metrika_views.py:45
+msgid "Module not found"
+msgstr ""
+
+#: dashboard/dashboard_modules/google_analytics_views.py:44
+#: dashboard/dashboard_modules/yandex_metrika_views.py:43
+msgid "Bad arguments"
+msgstr ""
+
+#: 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:144
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:16
+msgid "Visits"
+msgstr ""
+
+#: 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:221
+#, python-format
+msgid ""
+"Please <a href=\"%s\">select Yandex Metrika counter</a> to start using widget"
+msgstr ""
+
+#: dashboard/dashboard_modules/yandex_metrika.py:249
+msgid "Yandex Metrika visitors totals"
+msgstr ""
+
+#: dashboard/dashboard_modules/yandex_metrika.py:264
+msgid "visitors"
+msgstr ""
+
+#: dashboard/dashboard_modules/yandex_metrika.py:265
+msgid "visits"
+msgstr ""
+
+#: dashboard/dashboard_modules/yandex_metrika.py:278
+msgid "Yandex Metrika visitors chart"
+msgstr ""
+
+#: dashboard/dashboard_modules/yandex_metrika.py:330
+msgid "Yandex Metrika period visitors"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/dashboard.html:17
+msgid "Delete widget"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/dashboard.html:18
+msgid "Are you sure want to delete this widget?"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:7
+msgid "widgets"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:8
+msgid "available"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:13
+msgid "inititals"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:21
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:27
+msgid "Reset widgets"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:28
+msgid "Are you sure want to reset widgets?"
+msgstr ""
+
+#: dashboard/templates/jet.dashboard/update_module.html:35
+msgid "General"
+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 ""

BIN
jet/dashboard/locale/en/LC_MESSAGES/djangojs.mo


+ 28 - 0
jet/dashboard/locale/en/LC_MESSAGES/djangojs.po

@@ -0,0 +1,28 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-09-11 12:44+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: static/jet/js/src/features/dashboard.js:79 static/jet/js/src/features/dashboard.js:208
+msgid "Cancel"
+msgstr ""
+
+#: static/jet/js/src/features/dashboard.js:203
+msgid "Delete"
+msgstr ""
+
+#: static/jet/js/src/features/dashboard.js:74
+msgid "Yes"
+msgstr ""

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


+ 411 - 0
jet/dashboard/locale/ru/LC_MESSAGES/django.po

@@ -0,0 +1,411 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"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/modules.py:138 templates/admin/base.html:281
+msgid "URL"
+msgstr "URL"
+
+#: dashboard/dashboard.py:207
+msgid "Quick links"
+msgstr "Быстрые ссылки"
+
+#: dashboard/dashboard.py:213
+msgid "Return to site"
+msgstr "Вернуться на сайт"
+
+#: dashboard/dashboard.py:224 dashboard/modules.py:268
+msgid "Applications"
+msgstr "Приложения"
+
+#: dashboard/dashboard.py:232
+msgid "Administration"
+msgstr "Администрирование"
+
+#: dashboard/dashboard.py:240 dashboard/modules.py:413
+msgid "Recent Actions"
+msgstr "Последние действия"
+
+#: dashboard/dashboard.py:248
+msgid "Latest Django News"
+msgstr "Новости от Django"
+
+#: dashboard/dashboard.py:257
+msgid "Support"
+msgstr "Поддержка"
+
+#: dashboard/dashboard.py:260
+msgid "Django documentation"
+msgstr "Документация по Django"
+
+#: dashboard/dashboard.py:265
+msgid "Django \"django-users\" mailing list"
+msgstr "Гугл-группа \"django-users\""
+
+#: dashboard/dashboard.py:270
+msgid "Django irc channel"
+msgstr "IRC канал Django"
+
+#: dashboard/dashboard.py:285
+msgid "Application models"
+msgstr "Модели приложения"
+
+#: dashboard/models.py:11 dashboard/modules.py:139
+msgid "Title"
+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: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 "Access"
+msgstr "Доступ"
+
+#: dashboard/dashboard_modules/google_analytics.py:163
+#: dashboard/dashboard_modules/yandex_metrika.py:118
+msgid "Counter"
+msgstr "Счетчик"
+
+#: dashboard/dashboard_modules/google_analytics.py:164
+#: dashboard/dashboard_modules/yandex_metrika.py:119
+msgid "Statistics period"
+msgstr "Статистика за период"
+
+#: dashboard/dashboard_modules/google_analytics.py:165
+#: dashboard/dashboard_modules/yandex_metrika.py:120
+msgid "Today"
+msgstr "Сегодня"
+
+#: dashboard/dashboard_modules/google_analytics.py:166
+#: dashboard/dashboard_modules/yandex_metrika.py:121
+msgid "Last week"
+msgstr "Последняя неделя"
+
+#: dashboard/dashboard_modules/google_analytics.py:167
+#: dashboard/dashboard_modules/yandex_metrika.py:122
+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:179
+#: dashboard/dashboard_modules/yandex_metrika.py:134
+msgid "none"
+msgstr "не указано"
+
+#: 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:182
+#: dashboard/dashboard_modules/yandex_metrika.py:137
+msgid "counters loading failed"
+msgstr "не удалось загрузить счетчики"
+
+#: dashboard/dashboard_modules/google_analytics.py:187
+#: dashboard/dashboard_modules/yandex_metrika.py:142
+msgid "Show"
+msgstr "Показывать"
+
+#: 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:189
+#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:16
+msgid "Sessions"
+msgstr "Сессии"
+
+#: 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:192
+#: dashboard/dashboard_modules/google_analytics.py:200
+#: dashboard/dashboard_modules/yandex_metrika.py:147
+#: dashboard/dashboard_modules/yandex_metrika.py:155
+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 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:276
+#, python-format
+msgid ""
+"Please <a href=\"%s\">attach Google account and choose Google Analytics "
+"counter</a> to start using widget"
+msgstr ""
+"Пожалуйста <a href=\"%s\">прикрепите аккаунт Google и выберите счетчик "
+"Google Analytics</a> для виджета"
+
+#: dashboard/dashboard_modules/google_analytics.py:279
+#, python-format
+msgid ""
+"Please <a href=\"%s\">select Google Analytics counter</a> to start using "
+"widget"
+msgstr ""
+"Пожалуйста <a href=\"%s\">выберите счетчик Google Analytics</a> для виджета"
+
+#: dashboard/dashboard_modules/google_analytics.py:298
+#: dashboard/dashboard_modules/google_analytics_views.py:42
+#: 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: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:310
+msgid "Google Analytics visitors totals"
+msgstr "Данные о посещениях Google Analytics"
+
+#: dashboard/dashboard_modules/google_analytics.py:325
+msgid "users"
+msgstr "пользователи"
+
+#: dashboard/dashboard_modules/google_analytics.py:326
+msgid "sessions"
+msgstr "сессии"
+
+#: dashboard/dashboard_modules/google_analytics.py:327
+#: dashboard/dashboard_modules/yandex_metrika.py:266
+msgid "views"
+msgstr "просмотры"
+
+#: 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:339
+msgid "Google Analytics visitors chart"
+msgstr "График посещений Google Analytics"
+
+#: dashboard/dashboard_modules/google_analytics.py:397
+msgid "Google Analytics period visitors"
+msgstr "Посещения Google Analytics за период"
+
+#: dashboard/dashboard_modules/google_analytics_views.py:26
+#: dashboard/dashboard_modules/google_analytics_views.py:46
+#: dashboard/dashboard_modules/yandex_metrika_views.py:23
+#: dashboard/dashboard_modules/yandex_metrika_views.py:45
+msgid "Module not found"
+msgstr "Модуль не найден"
+
+#: dashboard/dashboard_modules/google_analytics_views.py:44
+#: dashboard/dashboard_modules/yandex_metrika_views.py:43
+msgid "Bad arguments"
+msgstr "Некорректные аргументы"
+
+#: 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:144
+#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:16
+msgid "Visits"
+msgstr "Визиты"
+
+#: 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 ""
+"Пожалуйста <a href=\"%s\">прикрепите аккаунт Яндекс и выберите счетчик "
+"Яндекс Метрики</a> для виджета"
+
+#: 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:249
+msgid "Yandex Metrika visitors totals"
+msgstr "Данные о посещениях Яндекс Метрики"
+
+#: dashboard/dashboard_modules/yandex_metrika.py:264
+msgid "visitors"
+msgstr "посетители"
+
+#: dashboard/dashboard_modules/yandex_metrika.py:265
+msgid "visits"
+msgstr "визиты"
+
+#: dashboard/dashboard_modules/yandex_metrika.py:278
+msgid "Yandex Metrika visitors chart"
+msgstr "График посещений Яндекс Метрики"
+
+#: dashboard/dashboard_modules/yandex_metrika.py:330
+msgid "Yandex Metrika period visitors"
+msgstr "Посещения Яндекс Метрики за период"
+
+#: dashboard/templates/jet.dashboard/dashboard.html:17
+msgid "Delete widget"
+msgstr "Удалить виджет"
+
+#: dashboard/templates/jet.dashboard/dashboard.html:18
+msgid "Are you sure want to delete this widget?"
+msgstr "Вы точно хотите удалить этот виджет?"
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:7
+msgid "widgets"
+msgstr "виджеты"
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:8
+msgid "available"
+msgstr "доступные"
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:13
+msgid "inititals"
+msgstr "изначальные"
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:21
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:27
+msgid "Reset widgets"
+msgstr "Сбросить виджеты"
+
+#: dashboard/templates/jet.dashboard/dashboard_tools.html:28
+msgid "Are you sure want to reset widgets?"
+msgstr "Вы точно хотите сбросить виджеты?"
+
+#: dashboard/templates/jet.dashboard/update_module.html:35
+msgid "General"
+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 "Содержимое отсутствует"

BIN
jet/dashboard/locale/ru/LC_MESSAGES/djangojs.mo


+ 28 - 0
jet/dashboard/locale/ru/LC_MESSAGES/djangojs.po

@@ -0,0 +1,28 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-09-11 12:44+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"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: static/jet/js/src/features/dashboard.js:79 static/jet/js/src/features/dashboard.js:208
+msgid "Cancel"
+msgstr "Отмена"
+
+#: static/jet/js/src/features/dashboard.js:203
+msgid "Delete"
+msgstr "Удалить"
+
+#: static/jet/js/src/features/dashboard.js:74
+msgid "Yes"
+msgstr "Да"

+ 9 - 21
jet/dashboard/templates/admin/app_index.html

@@ -1,10 +1,7 @@
 {% extends "admin/base_site.html" %}
 {% load i18n static jet_dashboard_tags %}
 
-{% block html %}
-    {% get_dashboard 'app_index' as dashboard %}
-    {{ block.super }}
-{% endblock %}
+{% block html %}{% get_dashboard 'app_index' as dashboard %}{{ block.super }}{% endblock %}
 
 {% block extrastyle %}
     {{ block.super }}
@@ -17,33 +14,24 @@
 
 {% block extrahead %}
     {{ block.super }}
+
     {% for js in dashboard.media.js %}
         <script src="{% static js %}"></script>
     {% endfor %}
 {% endblock %}
 
-{% block coltype %}colMS{% endblock %}
-
-{% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %}
-
-{% if not is_popup %}
-    {% block breadcrumbs %}
-        <div class="breadcrumbs">
-            <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
-            &rsaquo;
-            {% for app in app_list %}
-                {% if app.name != app.app_label|capfirst|escape %}{{ app.name }}{% else %}{% trans app.app_label as app_label %}{{ app_label|capfirst|escape }}{% endif %}
-            {% endfor %}
-        </div>
-    {% endblock %}
-{% endif %}
+{% block bodyclass %}{{ block.super }} dashboard jet app-{{ app_label }}{% endblock %}
 
 {% block sidebar %}{% endblock %}
 
-{% block top-right %}
+{% block breadcrumbs %}
+    {% if not is_popup %}
+        <div class="breadcrumbs"></div>
+    {% endif %}
+
     {{ dashboard.render_tools }}
 {% endblock %}
 
 {% block content %}
     {{ dashboard.render }}
-{% endblock %}
+{% endblock %}

+ 8 - 6
jet/dashboard/templates/admin/index.html

@@ -1,10 +1,7 @@
 {% extends "admin/base_site.html" %}
 {% load i18n admin_static jet_dashboard_tags static %}
 
-{% block html %}
-    {% get_dashboard 'index' as dashboard %}
-    {{ block.super }}
-{% endblock %}
+{% block html %}{% get_dashboard 'index' as dashboard %}{{ block.super }}{% endblock %}
 
 {% block extrastyle %}
     {{ block.super }}
@@ -17,16 +14,21 @@
 
 {% block extrahead %}
     {{ block.super }}
+
     {% for js in dashboard.media.js %}
         <script src="{% static js %}"></script>
     {% endfor %}
 {% endblock %}
 
-{% block coltype %}colMS{% endblock %}
+{% block bodyclass %}{{ block.super }} dashboard jet{% endblock %}
 
 {% block sidebar %}{% endblock %}
 
-{% block top-right %}
+{% block breadcrumbs %}
+    {% if not is_popup %}
+        <div class="breadcrumbs"></div>
+    {% endif %}
+
     {{ dashboard.render_tools }}
 {% endblock %}
 

+ 1 - 1
jet/dashboard/templates/jet.dashboard/dashboard.html

@@ -1,6 +1,6 @@
 {% load i18n %}
 
-<div class="dashboard columns_{{ columns|length }} cf">
+<div class="dashboard-container columns_{{ columns|length }} cf">
     {% for i in columns %}
         <div class="dashboard-column-wrapper">
             <div class="dashboard-column{% if forloop.first %} first{% endif %}">

+ 8 - 3
jet/dashboard/templates/jet.dashboard/dashboard_tools.html

@@ -1,6 +1,11 @@
 {% load i18n %}
 
-<div class="background-form">
+<div class="dashboard-tools-toggle-container">
+    <a href="#" class="dashboard-tools-toggle button">
+        <span class="dashboard-tools-toggle-icon icon-settings"></span>
+    </a>
+</div>
+<div class="dashboard-tools">
     <form action="{% url "jet-dashboard:add_user_dashboard_module" %}" method="POST" id="add-dashboard-module-form">
         {% csrf_token %}
         <select class="add-dashboard" name="module">
@@ -15,10 +20,10 @@
                     <option value="{{ forloop.counter0 }}" data-type="children">{{ module.title }}</option>
                 {% endfor %}
             </optgroup>
-        </select><a href="#" class="button button-secondary add-dashboard-link" title="{% trans "Add" %}"><span class="icon-add"></span></a>
+        </select><a href="#" class="button add-dashboard-link" title="{% trans "Add" %}"><span class="add-dashboard-link-icon icon-add"></span><span class="add-dashboard-link-label">{% trans "Add" %}</span></a>
         <input type="hidden" name="app_label" value="{% if app_label %}{{ app_label }}{% endif %}">
         <input type="hidden" name="type" value="">
-        <a href="#" class="button button-transparent reset-dashboard-link" title="{% trans "Reset widgets" %}"><span class="icon-reset"></span></a>
+        <a href="#" class="button transparent reset-dashboard-link" title="{% trans "Reset widgets" %}"><span class="reset-dashboard-link-icon icon-reset"></span><span class="reset-dashboard-link-label">{% trans "Reset widgets" %}</span></a>
     </form>
     <form action="{% url "jet-dashboard:reset_dashboard" %}" method="POST" id="reset-dashboard-form">
         {% csrf_token %}

+ 2 - 2
jet/dashboard/templates/jet.dashboard/modules/app_list.html

@@ -15,13 +15,13 @@
             <li>
                 <span class="float-right">
                     {% if model.add_url %}
-                        <a href="{{ model.add_url }}" class="addlink" title="{% trans 'Add' %}"><span class="icon-add3"></span></a>
+                        <a href="{{ model.add_url }}" class="addlink" title="{% trans 'Add' %}"></a>
                     {% else %}
                         &nbsp;
                     {% endif %}
 
                     {% if model.admin_url %}
-                        <a href="{{ model.admin_url }}" class="changelink" title="{% trans 'Change' %}"><span class="icon-edit"></span></a>
+                        <a href="{{ model.admin_url }}" class="changelink" title="{% trans 'Change' %}"></a>
                     {% else %}
                         &nbsp;
                     {% endif %}

+ 2 - 2
jet/dashboard/templates/jet.dashboard/modules/feed.html

@@ -3,9 +3,9 @@
 <ul>
     {% if module.children %}
         {% for child in module.children %}
-            <li class="nowrap">
+            <li>
                 {% if child.date %}<span class="float-right dim">{{ child.date|date }}</span>{% endif %}
-                {% if child.warning %}<span class="warning">{{ child.title }}</span>{% else %}<a href="{{ child.link }}" target="_blank"><span class="icon-open-external"></span> {{ child.title }}</a>{% endif %}
+                {% if child.warning %}<span class="warning">{{ child.title }}</span>{% else %}<a href="{{ child.link }}" target="_blank" class="nowrap"><span class="icon-open-external"></span> {{ child.title }}</a>{% endif %}
             </li>
         {% endfor %}
     {% else %}

+ 2 - 2
jet/dashboard/templates/jet.dashboard/modules/model_list.html

@@ -5,13 +5,13 @@
         <li>
             <span class="float-right">
                 {% if model.add_url %}
-                    <a href="{{ model.add_url }}" class="addlink" title="{% trans 'Add' %}"><span class="icon-add3"></span></a>
+                    <a href="{{ model.add_url }}" class="addlink" title="{% trans 'Add' %}"></a>
                 {% else %}
                     &nbsp;
                 {% endif %}
 
                 {% if model.admin_url %}
-                    <a href="{{ model.admin_url }}" class="changelink" title="{% trans 'Change' %}"><span class="icon-edit"></span></a>
+                    <a href="{{ model.admin_url }}" class="changelink" title="{% trans 'Change' %}"></a>
                 {% else %}
                     &nbsp;
                 {% endif %}

+ 22 - 20
jet/dashboard/templates/jet.dashboard/modules/recent_actions.html

@@ -7,33 +7,35 @@
         </li>
     {% else %}
         {% for entry in module.children %}
-            <li class="nowrap">
+            <li>
                 <span class="float-right">
                     <span class="icon-user tooltip" title="{{ entry.user }}"></span>
                     <span class="icon-clock tooltip" title="{{ entry.action_time }}"></span>
                 </span>
 
-                {% if entry.is_addition %}
-                    <span class="icon-add3"></span>
-                {% endif %}
-                {% if entry.is_change %}
-                    <span class="icon-edit"></span>
-                {% endif %}
-                {% if entry.is_deletion %}
-                    <span class="icon-cross"></span>
-                {% endif %}
+                <div class="nowrap">
+                    {% if entry.is_addition %}
+                        <span class="icon-add3"></span>
+                    {% endif %}
+                    {% if entry.is_change %}
+                        <span class="icon-edit"></span>
+                    {% endif %}
+                    {% if entry.is_deletion %}
+                        <span class="icon-cross"></span>
+                    {% endif %}
 
-                {% if entry.content_type %}
-                    <span class="mini quiet">{% filter capfirst %}{{ entry.content_type }}{% endfilter %}</span>
-                {% else %}
-                    <span class="mini quiet">{% trans 'Unknown content' %}</span>
-                {% endif %}
+                    {% if entry.content_type %}
+                        <span>{% filter capfirst %}{{ entry.content_type }}{% endfilter %}</span>
+                    {% else %}
+                        <span>{% trans 'Unknown content' %}</span>
+                    {% endif %}
 
-                {% if entry.is_deletion or not entry.get_admin_url %}
-                    {{ entry.object_repr }}
-                {% else %}
-                    <a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a>
-                {% endif %}
+                    {% if entry.is_deletion or not entry.get_admin_url %}
+                        {{ entry.object_repr }}
+                    {% else %}
+                        <a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a>
+                    {% endif %}
+                </div>
             </li>
         {% endfor %}
     {% endif %}

+ 54 - 97
jet/dashboard/templates/jet.dashboard/update_module.html

@@ -20,120 +20,77 @@
     {% endblock %}
 {% endif %}
 
-{% block content %}
-    <form action="" method="POST">
-        <div class="changeform">
-            {% csrf_token %}
-
-            {{ form.media }}
-            {{ settings_form.media }}
-            {{ children_formset.media }}
-
-            <ul class="changeform-tabs">
-                <li class="changeform-tabs-item selected{% if form.errors or settings_form.errors %} errors{% endif %}">
-                    <a href="#" class="changeform-tabs-item-link" data-module-id="module_0">
-                        {% trans "General" %}
-                    </a>
-                </li>
-                {% if children_formset %}
-                    {% formset_has_errors children_formset as errors %}
-
-                    <li class="changeform-tabs-item{% if errors %} errors{% endif %}">
-                        <a href="#" class="changeform-tabs-item-link" data-module-id="module_1">
-                            {{ child_name_plural }}
-                        </a>
-                    </li>
-                {% endif %}
-            </ul>
+{% block bodyclass %}{{ block.super }} dashboard jet change-form{% endblock %}
 
-            <div class="module selected" id="module_0">
-                {{ form.non_field_errors }}
-                {{ settings_form.non_field_errors }}
+{% block content %}
+    <div id="content-main">
+        {% block object-tools %}{% endblock %}
 
+        <form action="" method="post" novalidate>{% csrf_token %}{% block form_top %}{% endblock %}
+            <div>
                 {% if form.errors or settings_form.errors %}
+                    <p class="errornote">{% trans "Please correct the errors below." %}</p>
+                {% endif %}
+
+                {% block field_sets %}
                     <fieldset class="module aligned">
-                        <p class="errornote">
-                            {% trans "Please correct the errors below." %}
-                        </p>
+                        {% include "jet.dashboard/update_module_fieldset.html" with form=form wrap=False %}
+
+                        {% if settings_form %}
+                            {% include "jet.dashboard/update_module_fieldset.html" with form=settings_form wrap=False %}
+                        {% endif %}
                     </fieldset>
-                {% endif %}
+                {% endblock %}
 
-                {% include "jet.dashboard/update_module_fieldset.html" with form=form %}
+                {% block after_field_sets %}{% endblock %}
 
-                {% if settings_form %}
-                    {% include "jet.dashboard/update_module_fieldset.html" with form=settings_form %}
-                {% endif %}
-            </div>
+                {% block inline_field_sets %}
+                    {% if children_formset %}
+                        <div class="inline-group">
+                            <fieldset class="module">
+                                <h2>{{ child_name_plural }}</h2>
+
+                                {{ children_formset.management_form }}
+                                {{ children_formset.non_form_errors }}
 
-            {% if children_formset %}
-                <div class="module" id="module_1">
-                    <div class="inline-group">
-                        {{ children_formset.management_form }}
-                        {{ children_formset.non_form_errors }}
-
-                        <div class="stacked-inline side cf">
-                            <div class="stacked-inline-side">
-                            <div class="stacked-inline-side-top"></div>
-                                <ul class="stacked-inline-list">
-                                    {% for form in children_formset %}
-                                        <li class="stacked-inline-list-item{% if forloop.first %} selected{% endif %}{% if form.errors %} errors{% endif %}">
-                                            <a href="#" class="stacked-inline-list-item-link" data-inline-related-id="{{ children_formset.prefix }}-{{ forloop.counter0 }}">
-                                                {% if not form.initial %}
-                                                    <span class="icon-new"></span>
-                                                {% endif %}
-                                                <b>{{ child_name }}:</b>&nbsp;
-                                                <span class="inline_label">
-                                                    #{{ forloop.counter }}
-                                                </span>
-                                            </a>
-                                        </li>
-                                    {% endfor %}
-                                    <li class="stacked-inline-list-item empty">
-                                        <a href="#" class="stacked-inline-list-item-link" data-inline-related-id="{{ children_formset.prefix }}-empty">
-                                            <span class="icon-new"></span>
-                                            <b>{{ child_name }}:</b>&nbsp;
-                                            <span class="inline_label">
-                                                #{{ children_formset|length }}
-                                            </span>
-                                        </a>
-                                    </li>
-                                </ul>
-                                <div class="stacked-inline-side-bottom"></div>
-                            </div>
-                            <div class="stacked-inline-content">
                                 {% for form in children_formset %}
-                                    <div class="stacked {% if forloop.first %}selected {% endif %}inline-related {% if forloop.last %} last-related{% endif %}" id="{{ children_formset.prefix }}-{{ forloop.counter0 }}">
+                                    <div class="inline-related{% if forloop.last %} empty-form last-related{% else %} has_original{% endif %}">
+                                        <h3>
+                                            <b>{{ child_name|capfirst }}:</b>&nbsp;<span class="inline_label">#{{ forloop.counter }}</span>
+
+                                            {% if forloop.last %}
+                                                <span><a href="#" class="inline-deletelink">{% trans "Delete" %}</a></span>
+                                            {% elif children_formset.can_delete %}
+                                                <span class="delete"><label>{{ form.DELETE }} {% trans "Delete" %}</label></span>
+                                            {% endif %}
+                                        </h3>
+
                                         {% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %}
+
                                         {% include "jet.dashboard/update_module_fieldset.html" with form=form %}
                                     </div>
                                 {% endfor %}
-                                {% with form=children_formset.empty_form %}
-                                    <div class="stacked inline-related empty-form last-related" id="{{ children_formset.prefix }}-empty">
-                                        {% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %}
-                                        {% include "jet.dashboard/update_module_fieldset.html" with form=form %}
+
+                                {% with child_name as verbose_name %}
+                                    <div class="add-row">
+                                        <a href="#">{% blocktrans %}Add another {{ verbose_name }}{% endblocktrans %}</a>
                                     </div>
                                 {% endwith %}
-                            </div>
+                            </fieldset>
                         </div>
-                    </div>
-                    </div>
+                    {% endif %}
+                {% endblock %}
 
-                    <script type="text/javascript">
-                    (function($) {
-                      $("#module_1 .inline-related").stackedFormset({
-                        prefix: '{{ children_formset.prefix }}',
-                        adminStaticPrefix: '{% static "admin/" %}',
-                        deleteText: "{% trans "Remove" %}",
-                        addText: "<span class=\"icon-add\"></span> {% blocktrans with verbose_name=child_name|capfirst %}Add another {{ verbose_name }}{% endblocktrans %}"
-                      });
-                    })(django.jQuery);
-                    </script>
+                {% block after_related_objects %}{% endblock %}
 
-            {% endif %}
+                {% block submit_buttons_bottom %}
+                    <div class="submit-row">
+                        <input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />
+                    </div>
+                {% endblock %}
 
-            <div class="submit-row">
-                <input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />
+                {% block admin_change_form_document_ready %}{% endblock %}
             </div>
-       </div>
-    </form>
-{% endblock %}
+        </form>
+    </div>
+{% endblock %}

+ 16 - 14
jet/dashboard/templates/jet.dashboard/update_module_fieldset.html

@@ -1,20 +1,22 @@
 {% load i18n jet_tags %}
 
-<fieldset class="module aligned">
+{% if wrap != False %}<fieldset class="module aligned">{% endif %}
     {% for field in form %}
-        <div class="form-row{% if field.errors %} errors{% endif %}">
-            {{ field.errors }}
+        {% if field.name != 'DELETE' %}
+            <div class="form-row{% if field.errors %} errors{% endif %}">
+                {{ field.errors }}
 
-            {% if field|is_checkbox %}
-                {{ field }} <label{% if field.field.required %} class="required"{% endif %} for="{{ field.id_for_label }}">{{ field.label }}</label>
-            {% else %}
-                <label{% if field.field.required %} class="required"{% endif %} for="{{ field.id_for_label }}">{{ field.label }}:</label>
-                {{ field }}
-            {% endif %}
+                {% if field|is_checkbox %}
+                    {{ field }} <label{% if field.field.required %} class="required"{% endif %} for="{{ field.id_for_label }}">{{ field.label }}</label>
+                {% else %}
+                    <label{% if field.field.required %} class="required"{% endif %} for="{{ field.id_for_label }}">{{ field.label }}:</label>
+                    {{ field }}
+                {% endif %}
 
-            {% if field.field.help_text %}
-                <p class="help">{{ field.field.help_text|safe }}</p>
-            {% endif %}
-        </div>
+                {% if field.field.help_text %}
+                    <p class="help">{{ field.field.help_text|safe }}</p>
+                {% endif %}
+            </div>
+        {% endif %}
     {% endfor %}
-</fieldset>
+{% if wrap != False %}</fieldset>{% endif %}

+ 2 - 1
jet/dashboard/urls.py

@@ -1,5 +1,5 @@
 import django
-from django.conf.urls import patterns, url
+from django.conf.urls import url
 from django.views.i18n import javascript_catalog
 from jet.dashboard import dashboard
 from jet.dashboard.views import update_dashboard_modules_view, add_user_dashboard_module_view, \
@@ -53,4 +53,5 @@ urlpatterns = [
 urlpatterns += dashboard.urls.get_urls()
 
 if django.VERSION[:2] < (1, 8):
+    from django.conf.urls import patterns
     urlpatterns = patterns('', *urlpatterns)

+ 8 - 0
jet/dashboard/views.py

@@ -1,6 +1,7 @@
 from django.contrib import messages
 from django.core.urlresolvers import reverse
 from django.forms.formsets import formset_factory
+from django.http import HttpResponseRedirect
 from django.views.decorators.http import require_POST, require_GET
 from jet.dashboard.forms import UpdateDashboardModulesForm, AddUserDashboardModuleForm, \
     UpdateDashboardModuleCollapseForm, RemoveDashboardModuleForm, ResetDashboardForm
@@ -18,6 +19,9 @@ class UpdateDashboardModuleView(SuccessMessageMixin, UpdateView):
     object = None
     module = None
 
+    def has_permission(self, request):
+        return request.user.is_active and request.user.is_staff
+
     def get_success_url(self):
         if self.object.app_label:
             return reverse('admin:app_list', kwargs={'app_label': self.object.app_label})
@@ -92,6 +96,10 @@ class UpdateDashboardModuleView(SuccessMessageMixin, UpdateView):
         return data
 
     def dispatch(self, request, *args, **kwargs):
+        if not self.has_permission(request):
+            index_path = reverse('admin:index')
+            return HttpResponseRedirect(index_path)
+
         self.object = self.get_object()
         self.module = self.get_module()(model=self.object)
         return super(UpdateDashboardModuleView, self).dispatch(request, *args, **kwargs)

+ 13 - 0
jet/forms.py

@@ -67,6 +67,12 @@ class ToggleApplicationPinForm(forms.ModelForm):
         model = PinnedApplication
         fields = ['app_label']
 
+    def clean(self):
+        data = super(ToggleApplicationPinForm, self).clean()
+        if not self.request.user.is_authenticated():
+            raise ValidationError('error')
+        return data
+
     def save(self, commit=True):
         if commit:
             try:
@@ -93,9 +99,16 @@ class ModelLookupForm(forms.Form):
     object_id = forms.IntegerField(required=False)
     model_cls = None
 
+    def __init__(self, request, *args, **kwargs):
+        self.request = request
+        super(ModelLookupForm, self).__init__(*args, **kwargs)
+
     def clean(self):
         data = super(ModelLookupForm, self).clean()
 
+        if not self.request.user.is_authenticated():
+            raise ValidationError('error')
+
         try:
             self.model_cls = get_model(data['app_label'], data['model'])
         except:

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


+ 20 - 793
jet/locale/en/LC_MESSAGES/django.po

@@ -14,830 +14,57 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-
-#: 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 ""
+"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"
 
 #: 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:213
-msgid "Return to site"
-msgstr ""
-
-#: dashboard/dashboard.py:214 templates/admin/base.html:102
-msgid "Change password"
-msgstr ""
-
-#: dashboard/dashboard.py:216 templates/admin/base.html:106
-msgid "Log out"
-msgstr ""
-
-#: dashboard/dashboard.py:224 dashboard/modules.py:268
-#: templates/admin/base.html:205 templates/admin/index.html:14
-msgid "Applications"
-msgstr ""
-
-#: dashboard/dashboard.py:232
-msgid "Administration"
-msgstr ""
-
-#: dashboard/dashboard.py:240 dashboard/modules.py:413
-#: templates/admin/index.html:68
-msgid "Recent Actions"
-msgstr ""
-
-#: dashboard/dashboard.py:248
-msgid "Latest Django News"
-msgstr ""
-
-#: dashboard/dashboard.py:257
-msgid "Support"
-msgstr ""
-
-#: dashboard/dashboard.py:260
-msgid "Django documentation"
-msgstr ""
-
-#: dashboard/dashboard.py:265
-msgid "Django \"django-users\" mailing list"
-msgstr ""
-
-#: dashboard/dashboard.py:270
-msgid "Django irc channel"
-msgstr ""
-
-#: dashboard/dashboard.py:285
-msgid "Application models"
-msgstr ""
-
-#: 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 ""
-
-#: 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 "Access"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:163
-#: dashboard/dashboard_modules/yandex_metrika.py:118
-msgid "Counter"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:164
-#: dashboard/dashboard_modules/yandex_metrika.py:119
-msgid "Statistics period"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:165
-#: dashboard/dashboard_modules/yandex_metrika.py:120
-msgid "Today"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:166
-#: dashboard/dashboard_modules/yandex_metrika.py:121
-msgid "Last week"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:167
-#: dashboard/dashboard_modules/yandex_metrika.py:122
-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:179
-#: dashboard/dashboard_modules/yandex_metrika.py:134
-msgid "none"
-msgstr ""
-
-#: 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:182
-#: dashboard/dashboard_modules/yandex_metrika.py:137
-msgid "counters loading failed"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:187
-#: dashboard/dashboard_modules/yandex_metrika.py:142
-msgid "Show"
-msgstr ""
-
-#: 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:189
-#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:16
-msgid "Sessions"
-msgstr ""
-
-#: 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:192
-#: dashboard/dashboard_modules/google_analytics.py:200
-#: dashboard/dashboard_modules/yandex_metrika.py:147
-#: dashboard/dashboard_modules/yandex_metrika.py:155
-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 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: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:279
-#, python-format
-msgid ""
-"Please <a href=\"%s\">select Google Analytics counter</a> to start using "
-"widget"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:298
-#: dashboard/dashboard_modules/google_analytics_views.py:42
-#: 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: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:310
-msgid "Google Analytics visitors totals"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:325
-msgid "users"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:326
-msgid "sessions"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:327
-#: dashboard/dashboard_modules/yandex_metrika.py:266
-msgid "views"
-msgstr ""
-
-#: 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:339
-msgid "Google Analytics visitors chart"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics.py:397
-msgid "Google Analytics period visitors"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics_views.py:26
-#: dashboard/dashboard_modules/google_analytics_views.py:46
-#: dashboard/dashboard_modules/yandex_metrika_views.py:23
-#: dashboard/dashboard_modules/yandex_metrika_views.py:45
-msgid "Module not found"
-msgstr ""
-
-#: dashboard/dashboard_modules/google_analytics_views.py:44
-#: dashboard/dashboard_modules/yandex_metrika_views.py:43
-msgid "Bad arguments"
-msgstr ""
-
-#: 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:144
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:16
-msgid "Visits"
-msgstr ""
-
-#: 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:221
-#, python-format
-msgid ""
-"Please <a href=\"%s\">select Yandex Metrika counter</a> to start using widget"
-msgstr ""
-
-#: dashboard/dashboard_modules/yandex_metrika.py:249
-msgid "Yandex Metrika visitors totals"
-msgstr ""
-
-#: dashboard/dashboard_modules/yandex_metrika.py:264
-msgid "visitors"
-msgstr ""
-
-#: dashboard/dashboard_modules/yandex_metrika.py:265
-msgid "visits"
-msgstr ""
-
-#: dashboard/dashboard_modules/yandex_metrika.py:278
-msgid "Yandex Metrika visitors chart"
-msgstr ""
-
-#: dashboard/dashboard_modules/yandex_metrika.py:330
-msgid "Yandex Metrika period visitors"
-msgstr ""
-
-#: dashboard/templates/admin/app_index.html:32
-#: dashboard/templates/jet.dashboard/update_module.html:14
-#: 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
-#: templates/admin/object_history.html:6
-#: templates/registration/logged_out.html:4
-#: templates/registration/password_change_done.html:6
-#: templates/registration/password_change_form.html:6
-msgid "Home"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard.html:17
-msgid "Delete widget"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard.html:18
-msgid "Are you sure want to delete this widget?"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:7
-msgid "widgets"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:8
-msgid "available"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:13
-msgid "inititals"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:18
-#: dashboard/templates/jet.dashboard/modules/app_list.html:18
-#: dashboard/templates/jet.dashboard/modules/model_list.html:8
-#: templates/admin/change_form.html:20 templates/admin/index.html:34
-msgid "Add"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:21
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:27
-msgid "Reset widgets"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:28
-msgid "Are you sure want to reset widgets?"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/module.html:22
-#: templates/admin/delete_confirmation.html:12
-#: templates/admin/related_widget_wrapper.html:24
-#: templates/admin/submit_line.html:11
-msgid "Delete"
-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/login.html:27
-#: templates/admin/edit_inline/stacked.html:8
-#: templates/admin/edit_inline/tabular.html:10
-#: 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: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
-msgid "Remove"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/update_module.html:127
-#: templates/admin/edit_inline/stacked.html:76
-#: templates/admin/edit_inline/tabular.html:99
-#, python-format
-msgid "Add another %(verbose_name)s"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/update_module.html:135
-#: templates/admin/pagination.html:20 templates/admin/submit_line.html:4
-msgid "Save"
-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 ""
-
-#: templates/admin/actions.html:8
-msgid "Run the selected action"
-msgstr ""
-
-#: templates/admin/actions.html:8
-msgid "Go"
-msgstr ""
-
-#: templates/admin/actions.html:17
-msgid "Click here to select the objects across all pages"
-msgstr ""
-
-#: templates/admin/actions.html:17
-#, python-format
-msgid "Select all %(total_count)s %(module_name)s"
-msgstr ""
-
-#: templates/admin/actions.html:19
-msgid "Clear selection"
-msgstr ""
-
-#: templates/admin/base.html:80
-msgid "current theme"
-msgstr ""
-
-#: templates/admin/base.html:159
+#: templates/admin/base.html:133
 msgid "back"
 msgstr ""
 
-#: templates/admin/base.html:180
+#: templates/admin/base.html:60
 msgid "View site"
 msgstr ""
 
-#: templates/admin/base.html:188
-msgid "Documentation"
-msgstr ""
-
-#: templates/admin/base.html:276 templates/admin/base.html.py:293
+#: templates/admin/base.html:273 templates/admin/base.html:292
 msgid "Add bookmark"
 msgstr ""
 
-#: templates/admin/base.html:289
+#: templates/admin/base.html:286
 msgid "Delete bookmark"
 msgstr ""
 
-#: templates/admin/base.html:290
+#: templates/admin/base.html:287
 msgid "Are you sure want to delete this bookmark?"
 msgstr ""
 
-#: templates/admin/base.html:333
+#: templates/admin/base.html:339
 msgid "Application page"
 msgstr ""
 
-#: templates/admin/base_site.html:3
-msgid "Django site admin"
-msgstr ""
-
-#: templates/admin/change_form.html:35 templates/admin/object_history.html:10
-msgid "History"
-msgstr ""
-
-#: templates/admin/change_form.html:38
-#: templates/admin/edit_inline/stacked.html:49
-#: templates/admin/edit_inline/tabular.html:45
-msgid "View on site"
-msgstr ""
-
-#: templates/admin/change_list.html:51
-#, python-format
-msgid "Add %(name)s"
-msgstr ""
-
-#: templates/admin/change_list.html:61 templates/admin/login.html:27
-#: templates/registration/password_change_form.html:21
-msgid "Please correct the error below."
-msgstr ""
-
-#: templates/admin/change_list_results.html:17
-#, python-format
-msgid "Sorting priority: %(priority_number)s"
-msgstr ""
-
-#: templates/admin/change_list_results.html:18
-msgid "Remove from sorting"
-msgstr ""
-
-#: templates/admin/change_list_results.html:19
-msgid "Toggle sorting"
-msgstr ""
-
-#: templates/admin/change_list_results.html:35
-msgid "try to reset filters"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:18
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
-"related objects, but your account doesn't have permission to delete the "
-"following types of objects:"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:25
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
-"following protected related objects:"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:32
-#, python-format
-msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
-"All of the following related items will be deleted:"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:41
-#: templates/admin/delete_selected_confirmation.html:43
-msgid "Yes, I'm sure"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:42
-#: templates/admin/delete_selected_confirmation.html:44
-msgid "No, take me back"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:56
-#: templates/admin/delete_selected_confirmation.html:59
-msgid "Objects"
-msgstr ""
-
-#: templates/admin/delete_selected_confirmation.html:11
-msgid "Delete multiple objects"
-msgstr ""
-
-#: templates/admin/delete_selected_confirmation.html:17
-#, python-format
-msgid ""
-"Deleting the selected %(objects_name)s would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
-msgstr ""
-
-#: templates/admin/delete_selected_confirmation.html:24
-#, python-format
-msgid ""
-"Deleting the selected %(objects_name)s would require deleting the following "
-"protected related objects:"
-msgstr ""
-
-#: templates/admin/delete_selected_confirmation.html:31
-#, python-format
-msgid ""
-"Are you sure you want to delete the selected %(objects_name)s? All of the "
-"following objects and their related items will be deleted:"
-msgstr ""
-
-#: templates/admin/filter.html:6
-#, python-format
-msgid "%(filter_title)s"
-msgstr ""
-
-#: templates/admin/index.html:56
-msgid "You don't have permission to edit anything."
-msgstr ""
-
-#: templates/admin/login.html:16
-msgid "<span class=\"bright\">Admin</span> Site"
-msgstr ""
-
-#: templates/admin/login.html:21 templates/admin/login.html.py:54
-msgid "Log in"
-msgstr ""
-
-#: templates/admin/login.html:50
-msgid "Forgotten your password or username?"
-msgstr ""
-
-#: templates/admin/object_history.html:21
-msgid "Date/time"
-msgstr ""
-
-#: templates/admin/object_history.html:22
-msgid "User"
-msgstr ""
-
-#: templates/admin/object_history.html:23
-msgid "Action"
-msgstr ""
-
-#: templates/admin/object_history.html:37
-msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
-msgstr ""
-
-#: templates/admin/pagination.html:7 templates/admin/search_form.html:20
-msgid "Show all"
-msgstr ""
-
-#: templates/admin/related_widget_wrapper.html:8
-#, python-format
-msgid "Change selected %(model)s"
-msgstr ""
-
-#: templates/admin/related_widget_wrapper.html:15
-#, python-format
-msgid "Add another %(model)s"
-msgstr ""
-
-#: templates/admin/related_widget_wrapper.html:22
-#, python-format
-msgid "Delete selected %(model)s"
-msgstr ""
-
-#: templates/admin/search_form.html:6 templates/admin/search_form.html:17
-msgid "Search"
-msgstr ""
-
-#: templates/admin/search_form.html:20
-#, python-format
-msgid "%(counter)s result"
-msgid_plural "%(counter)s results"
-msgstr[0] ""
-msgstr[1] ""
-
-#: templates/admin/search_form.html:20
-#, python-format
-msgid "%(full_result_count)s total"
-msgstr ""
-
-#: templates/admin/submit_line.html:5
-msgid "Save as new"
-msgstr ""
-
-#: templates/admin/submit_line.html:6
-msgid "Save and add another"
-msgstr ""
-
-#: templates/admin/submit_line.html:7
-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."
+#: templates/admin/base.html:276
+msgid "Title"
 msgstr ""
 
-#: templates/registration/logged_out.html:10
-msgid "Log in again"
+#: templates/admin/base.html:278
+msgid "URL"
 msgstr ""
 
-#: templates/registration/password_change_done.html:7
-#: templates/registration/password_change_form.html:7
-msgid "Password change"
+#: templates/admin/base.html:217
+msgid "Applications"
 msgstr ""
 
-#: templates/registration/password_change_done.html:15
-msgid "Your password was changed."
+#: templates/admin/base.html:243
+msgid "Hide applications"
 msgstr ""
 
-#: templates/registration/password_change_form.html:25
-msgid ""
-"Please enter your old password, for security's sake, and then enter your new "
-"password twice so we can verify you typed it in correctly."
+#: templates/admin/base.html:244
+msgid "Show hidden"
 msgstr ""
 
-#: templates/registration/password_change_form.html:50
-msgid "Change my password"
+#: templates/admin/base.html:363
+msgid "current theme"
 msgstr ""

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


+ 9 - 25
jet/locale/en/LC_MESSAGES/djangojs.po

@@ -15,46 +15,30 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: static/jet/js/main.js:266 static/jet/js/main.min.js:1
+#: static/jet/js/src/features/sidebar/bookmarks.js:80
 msgid "Add"
 msgstr ""
 
-#: static/jet/js/main.js:271 static/jet/js/main.js:315
-#: static/jet/js/main.js:766 static/jet/js/main.js:862
-#: static/jet/js/main.min.js:1 static/jet/js/main.min.js:2
-#: static/jet/js/main.min.js:3
+#: static/jet/js/src/features/sidebar/bookmarks.js:85 static/jet/js/src/features/sidebar/bookmarks.js:118
 msgid "Cancel"
 msgstr ""
 
-#: static/jet/js/main.js:310 static/jet/js/main.js:761
-#: static/jet/js/main.min.js:1 static/jet/js/main.min.js:2
+#: static/jet/js/src/features/sidebar/bookmarks.js:113
 msgid "Delete"
 msgstr ""
 
-#: static/jet/js/main.js:336 static/jet/js/main.min.js:1
-msgid "Hide applications"
-msgstr ""
-
-#: static/jet/js/main.js:338 static/jet/js/main.min.js:1
-msgid "Show hidden"
-msgstr ""
-
-#: static/jet/js/main.js:857 static/jet/js/main.min.js:3
-msgid "Yes"
-msgstr ""
-
-#: static/jet/js/main.js:884 static/jet/js/main.min.js:3
+#: static/jet/js/src/features/changeform.js:11
 msgid "Warning: you have unsaved changes"
 msgstr ""
 
-#: static/jet/js/select2.jet.js:108 static/jet/js/select2.jet.min.js:1
+#: static/jet/js/src/features/selects.js:109
 msgid "select all"
 msgstr ""
 
-#: static/jet/js/select2.jet.js:111 static/jet/js/select2.jet.min.js:1
+#: static/jet/js/src/features/selects.js:112
 msgid "deselect all"
 msgstr ""
 
-#: static/jet/vendor/jquery-ui/jquery-ui.min.js:8
-msgid "'"
-msgstr ""
+#: static/jet/js/src/layout-updaters/changeform-tabs.js:15 static/jet/js/src/layout-updaters/changeform-tabs.js:30
+msgid "General"
+msgstr "Общее"

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


+ 23 - 807
jet/locale/ru/LC_MESSAGES/django.po

@@ -17,838 +17,54 @@ 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"
 
-#: 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:213
-msgid "Return to site"
-msgstr "Вернуться на сайт"
-
-#: dashboard/dashboard.py:214 templates/admin/base.html:102
-msgid "Change password"
-msgstr ""
-
-#: dashboard/dashboard.py:216 templates/admin/base.html:106
-msgid "Log out"
-msgstr ""
-
-#: dashboard/dashboard.py:224 dashboard/modules.py:268
-#: templates/admin/base.html:205 templates/admin/index.html:14
-msgid "Applications"
-msgstr "Приложения"
-
-#: dashboard/dashboard.py:232
-msgid "Administration"
-msgstr "Администрирование"
-
-#: dashboard/dashboard.py:240 dashboard/modules.py:413
-#: templates/admin/index.html:68
-msgid "Recent Actions"
-msgstr "Последние действия"
-
-#: dashboard/dashboard.py:248
-msgid "Latest Django News"
-msgstr "Новости от Django"
-
-#: dashboard/dashboard.py:257
-msgid "Support"
-msgstr "Поддержка"
-
-#: dashboard/dashboard.py:260
-msgid "Django documentation"
-msgstr "Документация по Django"
-
-#: dashboard/dashboard.py:265
-msgid "Django \"django-users\" mailing list"
-msgstr "Гугл-группа \"django-users\""
-
-#: dashboard/dashboard.py:270
-msgid "Django irc channel"
-msgstr "IRC канал Django"
-
-#: dashboard/dashboard.py:285
-msgid "Application models"
-msgstr "Модели приложения"
-
-#: 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: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 "Access"
-msgstr "Доступ"
-
-#: dashboard/dashboard_modules/google_analytics.py:163
-#: dashboard/dashboard_modules/yandex_metrika.py:118
-msgid "Counter"
-msgstr "Счетчик"
-
-#: dashboard/dashboard_modules/google_analytics.py:164
-#: dashboard/dashboard_modules/yandex_metrika.py:119
-msgid "Statistics period"
-msgstr "Статистика за период"
-
-#: dashboard/dashboard_modules/google_analytics.py:165
-#: dashboard/dashboard_modules/yandex_metrika.py:120
-msgid "Today"
-msgstr "Сегодня"
-
-#: dashboard/dashboard_modules/google_analytics.py:166
-#: dashboard/dashboard_modules/yandex_metrika.py:121
-msgid "Last week"
-msgstr "Последняя неделя"
-
-#: dashboard/dashboard_modules/google_analytics.py:167
-#: dashboard/dashboard_modules/yandex_metrika.py:122
-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:179
-#: dashboard/dashboard_modules/yandex_metrika.py:134
-msgid "none"
-msgstr "не указано"
-
-#: 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:182
-#: dashboard/dashboard_modules/yandex_metrika.py:137
-msgid "counters loading failed"
-msgstr "не удалось загрузить счетчики"
-
-#: dashboard/dashboard_modules/google_analytics.py:187
-#: dashboard/dashboard_modules/yandex_metrika.py:142
-msgid "Show"
-msgstr "Показывать"
-
-#: 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:189
-#: dashboard/templates/jet.dashboard/modules/google_analytics_period_visitors.html:16
-msgid "Sessions"
-msgstr "Сессии"
-
-#: 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:192
-#: dashboard/dashboard_modules/google_analytics.py:200
-#: dashboard/dashboard_modules/yandex_metrika.py:147
-#: dashboard/dashboard_modules/yandex_metrika.py:155
-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 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:276
-#, python-format
-msgid ""
-"Please <a href=\"%s\">attach Google account and choose Google Analytics "
-"counter</a> to start using widget"
-msgstr ""
-"Пожалуйста <a href=\"%s\">прикрепите аккаунт Google и выберите счетчик "
-"Google Analytics</a> для виджета"
-
-#: dashboard/dashboard_modules/google_analytics.py:279
-#, python-format
-msgid ""
-"Please <a href=\"%s\">select Google Analytics counter</a> to start using "
-"widget"
-msgstr ""
-"Пожалуйста <a href=\"%s\">выберите счетчик Google Analytics</a> для виджета"
-
-#: dashboard/dashboard_modules/google_analytics.py:298
-#: dashboard/dashboard_modules/google_analytics_views.py:42
-#: 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: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:310
-msgid "Google Analytics visitors totals"
-msgstr "Данные о посещениях Google Analytics"
-
-#: dashboard/dashboard_modules/google_analytics.py:325
-msgid "users"
-msgstr "пользователи"
-
-#: dashboard/dashboard_modules/google_analytics.py:326
-msgid "sessions"
-msgstr "сессии"
-
-#: dashboard/dashboard_modules/google_analytics.py:327
-#: dashboard/dashboard_modules/yandex_metrika.py:266
-msgid "views"
-msgstr "просмотры"
-
-#: 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:339
-msgid "Google Analytics visitors chart"
-msgstr "График посещений Google Analytics"
-
-#: dashboard/dashboard_modules/google_analytics.py:397
-msgid "Google Analytics period visitors"
-msgstr "Посещения Google Analytics за период"
-
-#: dashboard/dashboard_modules/google_analytics_views.py:26
-#: dashboard/dashboard_modules/google_analytics_views.py:46
-#: dashboard/dashboard_modules/yandex_metrika_views.py:23
-#: dashboard/dashboard_modules/yandex_metrika_views.py:45
-msgid "Module not found"
-msgstr "Модуль не найден"
-
-#: dashboard/dashboard_modules/google_analytics_views.py:44
-#: dashboard/dashboard_modules/yandex_metrika_views.py:43
-msgid "Bad arguments"
-msgstr "Некорректные аргументы"
-
-#: 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:144
-#: dashboard/templates/jet.dashboard/modules/yandex_metrika_period_visitors.html:16
-msgid "Visits"
-msgstr "Визиты"
-
-#: 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 ""
-"Пожалуйста <a href=\"%s\">прикрепите аккаунт Яндекс и выберите счетчик "
-"Яндекс Метрики</a> для виджета"
-
-#: 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:249
-msgid "Yandex Metrika visitors totals"
-msgstr "Данные о посещениях Яндекс Метрики"
-
-#: dashboard/dashboard_modules/yandex_metrika.py:264
-msgid "visitors"
-msgstr "посетители"
-
-#: dashboard/dashboard_modules/yandex_metrika.py:265
-msgid "visits"
-msgstr "визиты"
-
-#: dashboard/dashboard_modules/yandex_metrika.py:278
-msgid "Yandex Metrika visitors chart"
-msgstr "График посещений Яндекс Метрики"
-
-#: dashboard/dashboard_modules/yandex_metrika.py:330
-msgid "Yandex Metrika period visitors"
-msgstr "Посещения Яндекс Метрики за период"
-
-#: dashboard/templates/admin/app_index.html:32
-#: dashboard/templates/jet.dashboard/update_module.html:14
-#: 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
-#: templates/admin/object_history.html:6
-#: templates/registration/logged_out.html:4
-#: templates/registration/password_change_done.html:6
-#: templates/registration/password_change_form.html:6
-msgid "Home"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard.html:17
-msgid "Delete widget"
-msgstr "Удалить виджет"
-
-#: dashboard/templates/jet.dashboard/dashboard.html:18
-msgid "Are you sure want to delete this widget?"
-msgstr "Вы точно хотите удалить этот виджет?"
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:7
-msgid "widgets"
-msgstr "виджеты"
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:8
-msgid "available"
-msgstr "доступные"
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:13
-msgid "inititals"
-msgstr "изначальные"
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:18
-#: dashboard/templates/jet.dashboard/modules/app_list.html:18
-#: dashboard/templates/jet.dashboard/modules/model_list.html:8
-#: templates/admin/change_form.html:20 templates/admin/index.html:34
-msgid "Add"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:21
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:27
-msgid "Reset widgets"
-msgstr "Сбросить виджеты"
-
-#: dashboard/templates/jet.dashboard/dashboard_tools.html:28
-msgid "Are you sure want to reset widgets?"
-msgstr "Вы точно хотите сбросить виджеты?"
-
-#: dashboard/templates/jet.dashboard/module.html:22
-#: templates/admin/delete_confirmation.html:12
-#: templates/admin/related_widget_wrapper.html:24
-#: templates/admin/submit_line.html:11
-msgid "Delete"
-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/login.html:27
-#: templates/admin/edit_inline/stacked.html:8
-#: templates/admin/edit_inline/tabular.html:10
-#: 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: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
-msgid "Remove"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/update_module.html:127
-#: templates/admin/edit_inline/stacked.html:76
-#: templates/admin/edit_inline/tabular.html:99
-#, python-format
-msgid "Add another %(verbose_name)s"
-msgstr ""
-
-#: dashboard/templates/jet.dashboard/update_module.html:135
-#: templates/admin/pagination.html:20 templates/admin/submit_line.html:4
-msgid "Save"
-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 ""
-
-#: templates/admin/actions.html:8
-msgid "Run the selected action"
-msgstr ""
-
-#: templates/admin/actions.html:8
-msgid "Go"
-msgstr ""
-
-#: templates/admin/actions.html:17
-msgid "Click here to select the objects across all pages"
-msgstr ""
-
-#: templates/admin/actions.html:17
-#, python-format
-msgid "Select all %(total_count)s %(module_name)s"
-msgstr ""
-
-#: templates/admin/actions.html:19
-msgid "Clear selection"
-msgstr ""
-
-#: templates/admin/base.html:80
-msgid "current theme"
-msgstr ""
-
-#: templates/admin/base.html:159
+#: templates/admin/base.html:133
 msgid "back"
 msgstr "назад"
 
-#: templates/admin/base.html:180
+#: templates/admin/base.html:60
 msgid "View site"
 msgstr "Открыть сайт"
 
-#: templates/admin/base.html:188
-msgid "Documentation"
-msgstr ""
-
-#: templates/admin/base.html:276 templates/admin/base.html.py:293
+#: templates/admin/base.html:273 templates/admin/base.html:292
 msgid "Add bookmark"
 msgstr "Добавить закладку"
 
-#: templates/admin/base.html:289
+#: templates/admin/base.html:286
 msgid "Delete bookmark"
 msgstr "Удалить закладку"
 
-#: templates/admin/base.html:290
+#: templates/admin/base.html:287
 msgid "Are you sure want to delete this bookmark?"
 msgstr "Вы точно хотите удалить эту закладку?"
 
-#: templates/admin/base.html:333
+#: templates/admin/base.html:339
 msgid "Application page"
 msgstr "Страница приложения"
 
-#: templates/admin/base_site.html:3
-#, fuzzy
-msgid "Django site admin"
-msgstr "IRC канал Django"
-
-#: templates/admin/change_form.html:35 templates/admin/object_history.html:10
-msgid "History"
-msgstr ""
-
-#: templates/admin/change_form.html:38
-#: templates/admin/edit_inline/stacked.html:49
-#: templates/admin/edit_inline/tabular.html:45
-msgid "View on site"
-msgstr ""
-
-#: templates/admin/change_list.html:51
-#, python-format
-msgid "Add %(name)s"
-msgstr ""
-
-#: templates/admin/change_list.html:61 templates/admin/login.html:27
-#: templates/registration/password_change_form.html:21
-msgid "Please correct the error below."
-msgstr ""
-
-#: templates/admin/change_list_results.html:17
-#, python-format
-msgid "Sorting priority: %(priority_number)s"
-msgstr ""
-
-#: templates/admin/change_list_results.html:18
-msgid "Remove from sorting"
-msgstr ""
-
-#: templates/admin/change_list_results.html:19
-msgid "Toggle sorting"
-msgstr ""
-
-#: templates/admin/change_list_results.html:35
-msgid "try to reset filters"
-msgstr "попробуйте сбросить фильтры"
-
-#: templates/admin/delete_confirmation.html:18
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(escaped_object)s' would result in deleting "
-"related objects, but your account doesn't have permission to delete the "
-"following types of objects:"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:25
-#, python-format
-msgid ""
-"Deleting the %(object_name)s '%(escaped_object)s' would require deleting the "
-"following protected related objects:"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:32
-#, python-format
-msgid ""
-"Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? "
-"All of the following related items will be deleted:"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:41
-#: templates/admin/delete_selected_confirmation.html:43
-msgid "Yes, I'm sure"
-msgstr ""
-
-#: templates/admin/delete_confirmation.html:42
-#: templates/admin/delete_selected_confirmation.html:44
-msgid "No, take me back"
-msgstr "Нет, отменить и вернуться к выбору"
-
-#: templates/admin/delete_confirmation.html:56
-#: templates/admin/delete_selected_confirmation.html:59
-msgid "Objects"
-msgstr "Объекты"
-
-#: templates/admin/delete_selected_confirmation.html:11
-msgid "Delete multiple objects"
-msgstr ""
-
-#: templates/admin/delete_selected_confirmation.html:17
-#, python-format
-msgid ""
-"Deleting the selected %(objects_name)s would result in deleting related "
-"objects, but your account doesn't have permission to delete the following "
-"types of objects:"
-msgstr ""
-
-#: templates/admin/delete_selected_confirmation.html:24
-#, python-format
-msgid ""
-"Deleting the selected %(objects_name)s would require deleting the following "
-"protected related objects:"
-msgstr ""
-
-#: templates/admin/delete_selected_confirmation.html:31
-#, python-format
-msgid ""
-"Are you sure you want to delete the selected %(objects_name)s? All of the "
-"following objects and their related items will be deleted:"
-msgstr ""
-
-#: templates/admin/filter.html:6
-#, python-format
-msgid "%(filter_title)s"
-msgstr ""
-
-#: templates/admin/index.html:56
-msgid "You don't have permission to edit anything."
-msgstr ""
-
-#: templates/admin/login.html:16
-msgid "<span class=\"bright\">Admin</span> Site"
-msgstr "Панель <span class=\"bright\">Администратора</span>"
-
-#: templates/admin/login.html:21 templates/admin/login.html.py:54
-msgid "Log in"
-msgstr ""
-
-#: templates/admin/login.html:50
-msgid "Forgotten your password or username?"
-msgstr ""
-
-#: templates/admin/object_history.html:21
-msgid "Date/time"
-msgstr ""
+#: templates/admin/base.html:276
+msgid "Title"
+msgstr "Название"
 
-#: templates/admin/object_history.html:22
-msgid "User"
-msgstr ""
+#: templates/admin/base.html:278
+msgid "URL"
+msgstr "URL"
 
-#: templates/admin/object_history.html:23
-#, fuzzy
-msgid "Action"
+#: templates/admin/base.html:217
+msgid "Applications"
 msgstr "Приложения"
 
-#: templates/admin/object_history.html:37
-msgid ""
-"This object doesn't have a change history. It probably wasn't added via this "
-"admin site."
-msgstr ""
-
-#: templates/admin/pagination.html:7 templates/admin/search_form.html:20
-msgid "Show all"
-msgstr ""
-
-#: templates/admin/related_widget_wrapper.html:8
-#, python-format
-msgid "Change selected %(model)s"
-msgstr "Изменить выбранный объект типа %(model)s"
-
-#: templates/admin/related_widget_wrapper.html:15
-#, python-format
-msgid "Add another %(model)s"
-msgstr "Добавить ещё один объект типа %(model)s"
-
-#: templates/admin/related_widget_wrapper.html:22
-#, python-format
-msgid "Delete selected %(model)s"
-msgstr "Удалить выбранный объект типа %(model)s"
-
-#: templates/admin/search_form.html:6 templates/admin/search_form.html:17
-msgid "Search"
-msgstr ""
-
-#: templates/admin/search_form.html:20
-#, python-format
-msgid "%(counter)s result"
-msgid_plural "%(counter)s results"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-
-#: templates/admin/search_form.html:20
-#, python-format
-msgid "%(full_result_count)s total"
-msgstr ""
-
-#: templates/admin/submit_line.html:5
-msgid "Save as new"
-msgstr ""
-
-#: templates/admin/submit_line.html:6
-msgid "Save and add another"
-msgstr ""
-
-#: templates/admin/submit_line.html:7
-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 ""
-
-#: templates/registration/logged_out.html:10
-msgid "Log in again"
-msgstr ""
-
-#: templates/registration/password_change_done.html:7
-#: templates/registration/password_change_form.html:7
-msgid "Password change"
-msgstr ""
-
-#: templates/registration/password_change_done.html:15
-msgid "Your password was changed."
-msgstr ""
+#: templates/admin/base.html:243
+msgid "Hide applications"
+msgstr "Скрыть приложения"
 
-#: templates/registration/password_change_form.html:25
-msgid ""
-"Please enter your old password, for security's sake, and then enter your new "
-"password twice so we can verify you typed it in correctly."
-msgstr ""
+#: templates/admin/base.html:244
+msgid "Show hidden"
+msgstr "Показать скрытые"
 
-#: templates/registration/password_change_form.html:50
-msgid "Change my password"
-msgstr ""
+#: templates/admin/base.html:363
+msgid "current theme"
+msgstr "текущая тема"

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


+ 9 - 25
jet/locale/ru/LC_MESSAGES/djangojs.po

@@ -15,46 +15,30 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: static/jet/js/main.js:266 static/jet/js/main.min.js:1
+#: static/jet/js/src/features/sidebar/bookmarks.js:80
 msgid "Add"
 msgstr "Добавить"
 
-#: static/jet/js/main.js:271 static/jet/js/main.js:315
-#: static/jet/js/main.js:766 static/jet/js/main.js:862
-#: static/jet/js/main.min.js:1 static/jet/js/main.min.js:2
-#: static/jet/js/main.min.js:3
+#: static/jet/js/src/features/sidebar/bookmarks.js:85 static/jet/js/src/features/sidebar/bookmarks.js:118
 msgid "Cancel"
 msgstr "Отмена"
 
-#: static/jet/js/main.js:310 static/jet/js/main.js:761
-#: static/jet/js/main.min.js:1 static/jet/js/main.min.js:2
+#: static/jet/js/src/features/sidebar/bookmarks.js:113
 msgid "Delete"
 msgstr "Удалить"
 
-#: static/jet/js/main.js:336 static/jet/js/main.min.js:1
-msgid "Hide applications"
-msgstr "Скрыть приложения"
-
-#: static/jet/js/main.js:338 static/jet/js/main.min.js:1
-msgid "Show hidden"
-msgstr "Показать скрытые"
-
-#: static/jet/js/main.js:857 static/jet/js/main.min.js:3
-msgid "Yes"
-msgstr "Да"
-
-#: static/jet/js/main.js:884 static/jet/js/main.min.js:3
+#: static/jet/js/src/features/changeform.js:11
 msgid "Warning: you have unsaved changes"
 msgstr "Внимание: у вас есть несохраненные изменения"
 
-#: static/jet/js/select2.jet.js:108 static/jet/js/select2.jet.min.js:1
+#: static/jet/js/src/features/selects.js:109
 msgid "select all"
 msgstr "выбрать все"
 
-#: static/jet/js/select2.jet.js:111 static/jet/js/select2.jet.min.js:1
+#: static/jet/js/src/features/selects.js:112
 msgid "deselect all"
 msgstr "убрать все"
 
-#: static/jet/vendor/jquery-ui/jquery-ui.min.js:8
-msgid "'"
-msgstr ""
+#: static/jet/js/src/layout-updaters/changeform-tabs.js:15 static/jet/js/src/layout-updaters/changeform-tabs.js:30
+msgid "General"
+msgstr "Общее"

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


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


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


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


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


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


+ 0 - 3
jet/static/admin/js/SelectFilter2.js

@@ -1,3 +0,0 @@
-var SelectFilter = {
-    init: function($a, $b, $c, $d) {  } //stub
-};

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

@@ -1,204 +0,0 @@
-// 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
-    if (href.indexOf('_popup=1') == -1) {
-        if (href.indexOf('?') == -1) {
-            href += '?_popup=1';
-        } else {
-            href += '&_popup=1';
-        }
-    }
-
-    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', parent.document);
-        var $loading = $container.find('.loading-indicator', parent.document);
-        var $body = $('body').addClass('non-scrollable', parent.document);
-        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() {
-            $container.append($popup);
-        });
-        $body.addClass('non-scrollable', parent.document);
-    });
-}
-
-function closeRelatedPopup(win) {
-    jet.jQuery('select').trigger('select:init');
-    jet.jQuery(win.parent).trigger('related-popup:close');
-}
-
-django.jQuery(document).ready(function() {
-    jet.jQuery(function($){
-        function updateLinks() {
-            var $this = $(this);
-            var siblings = $this.nextAll('.change-related, .delete-related');
-            if (!siblings.length) return;
-            var value = $this.val();
-            if (value) {
-                siblings.each(function(){
-                    var elm = $(this);
-                    elm.attr('href', elm.attr('data-href-template').replace('__fk__', value));
-                });
-            } else siblings.removeAttr('href');
-        }
-        var container = $(document);
-        container.on('change', '.related-widget-wrapper select', updateLinks);
-        container.find('.related-widget-wrapper select').each(updateLinks);
-        container.on('click', '.related-widget-wrapper-link', function(event){
-            if (this.href) {
-                showRelatedObjectPopup(this);
-            }
-            event.preventDefault();
-        });
-    });
-});

File diff suppressed because it is too large
+ 0 - 0
jet/static/admin/js/admin/RelatedObjectLookups.min.js


+ 0 - 293
jet/static/admin/js/inlines.js

@@ -1,293 +0,0 @@
-/**
- * Django admin inlines
- *
- * Based on jQuery Formset 1.1
- * @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com)
- * @requires jQuery 1.2.6 or later
- *
- * Copyright (c) 2009, Stanislaus Madueke
- * All rights reserved.
- *
- * Spiced up with Code from Zain Memon's GSoC project 2009
- * and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip.
- *
- * Licensed under the New BSD License
- * See: http://www.opensource.org/licenses/bsd-license.php
- */
-(function($) {
-  $.fn.formset = function(opts) {
-    var options = $.extend({}, $.fn.formset.defaults, opts);
-    var $this = $(this);
-    var $parent = $this.parent();
-    var updateElementIndex = function(el, prefix, ndx) {
-      var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))");
-      var replacement = prefix + "-" + ndx;
-      if ($(el).prop("for")) {
-        $(el).prop("for", $(el).prop("for").replace(id_regex, replacement));
-      }
-      if (el.id) {
-        el.id = el.id.replace(id_regex, replacement);
-      }
-      if (el.name) {
-        el.name = el.name.replace(id_regex, replacement);
-      }
-    };
-    var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").prop("autocomplete", "off");
-    var nextIndex = parseInt(totalForms.val(), 10);
-    var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").prop("autocomplete", "off");
-    // only show the add button if we are allowed to add more items,
-        // note that max_num = None translates to a blank string.
-    var showAddButton = maxForms.val() === '' || (maxForms.val()-totalForms.val()) > 0;
-    $this.each(function(i) {
-      $(this).not("." + options.emptyCssClass).addClass(options.formCssClass);
-    });
-    if ($this.length && showAddButton) {
-      var addButton;
-      if ($this.prop("tagName") == "TR") {
-        // If forms are laid out as table rows, insert the
-        // "add" button in a new table row:
-        var numCols = this.eq(-1).children().length;
-        $parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="javascript:void(0)">' + options.addText + "</a></tr>");
-        addButton = $parent.find("tr:last a");
-      } else {
-        // Otherwise, insert it immediately after the last form:
-        $this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="javascript:void(0)">' + options.addText + "</a></div>");
-        addButton = $this.filter(":last").next().find("a");
-      }
-      addButton.click(function(e) {
-        e.preventDefault();
-        var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS");
-        var template = $("#" + options.prefix + "-empty");
-        var row = template.clone(true);
-        row.removeClass(options.emptyCssClass)
-          .addClass(options.formCssClass)
-          .attr("id", options.prefix + "-" + nextIndex);
-        if (row.is("tr")) {
-          // If the forms are laid out in table rows, insert
-          // the remove button into the last table cell:
-          row.children(":last").append('<div><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></div>");
-        } else if (row.is("ul") || row.is("ol")) {
-          // If they're laid out as an ordered/unordered list,
-          // insert an <li> after the last list item:
-          row.append('<li><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></li>");
-        } else {
-          // Otherwise, just insert the remove button as the
-          // last child element of the form's container:
-          row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>");
-        }
-        row.find("*").each(function() {
-          updateElementIndex(this, options.prefix, totalForms.val());
-        });
-        // Insert the new form when it has been fully edited
-        row.insertBefore($(template));
-        // Update number of total forms
-        $(totalForms).val(parseInt(totalForms.val(), 10) + 1);
-        nextIndex += 1;
-        // Hide add button in case we've hit the max, except we want to add infinitely
-        if ((maxForms.val() !== '') && (maxForms.val()-totalForms.val()) <= 0) {
-          addButton.parent().hide();
-        }
-        // The delete button of each row triggers a bunch of other things
-        row.find("a." + options.deleteCssClass).click(function(e) {
-          e.preventDefault();
-          // Remove the parent form containing this button:
-          var row = $(this).parents("." + options.formCssClass);
-          row.remove();
-          nextIndex -= 1;
-          // If a post-delete callback was provided, call it with the deleted form:
-          if (options.removed) {
-            options.removed(row);
-          }
-          // Update the TOTAL_FORMS form count.
-          var forms = $("." + options.formCssClass);
-          $("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length);
-          // Show add button again once we drop below max
-          if ((maxForms.val() === '') || (maxForms.val()-forms.length) > 0) {
-            addButton.parent().show();
-          }
-          // Also, update names and ids for all remaining form controls
-          // so they remain in sequence:
-          for (var i=0, formCount=forms.length; i<formCount; i++)
-          {
-            updateElementIndex($(forms).get(i), options.prefix, i);
-            $(forms.get(i)).find("*").each(function() {
-              updateElementIndex(this, options.prefix, i);
-            });
-          }
-        });
-        // If a post-add callback was supplied, call it with the added form:
-        if (options.added) {
-          options.added(row);
-        }
-      });
-    }
-    return this;
-  };
-
-  /* Setup plugin defaults */
-  $.fn.formset.defaults = {
-    prefix: "form",          // The form prefix for your django formset
-    addText: "add another",      // Text for the add link
-    deleteText: "remove",      // Text for the delete link
-    addCssClass: "add-row",      // CSS class applied to the add link
-    deleteCssClass: "delete-row",  // CSS class applied to the delete link
-    emptyCssClass: "empty-row",    // CSS class applied to the empty row
-    formCssClass: "dynamic-form",  // CSS class applied to each form in a formset
-    added: null,          // Function called each time a new form is added
-    removed: null          // Function called each time a form is deleted
-  };
-
-
-  // Tabular inlines ---------------------------------------------------------
-  $.fn.tabularFormset = function(options) {
-    var $rows = $(this);
-    var alternatingRows = function(row) {
-      $($rows.selector).not(".add-row").removeClass("row1 row2")
-        .filter(":even").addClass("row1").end()
-        .filter(":odd").addClass("row2");
-    };
-
-    var reinitDateTimeShortCuts = function() {
-      // Reinitialize the calendar and clock widgets by force
-      if (typeof DateTimeShortcuts != "undefined") {
-        $(".datetimeshortcuts").remove();
-        DateTimeShortcuts.init();
-      }
-    };
-
-    var updateSelectFilter = function() {
-      // If any SelectFilter widgets are a part of the new form,
-      // instantiate a new SelectFilter instance for it.
-      if (typeof SelectFilter != 'undefined'){
-        $('.selectfilter').each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix );
-        });
-        $('.selectfilterstacked').each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix );
-        });
-      }
-    };
-
-    var initPrepopulatedFields = function(row) {
-      row.find('.prepopulated_field').each(function() {
-        var field = $(this),
-            input = field.find('input, select, textarea'),
-            dependency_list = input.data('dependency_list') || [],
-            dependencies = [];
-        $.each(dependency_list, function(i, field_name) {
-          dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id'));
-        });
-        if (dependencies.length) {
-          input.prepopulate(dependencies, input.attr('maxlength'));
-        }
-      });
-    };
-
-    $rows.formset({
-      prefix: options.prefix,
-      addText: options.addText,
-      formCssClass: "dynamic-" + options.prefix,
-      deleteCssClass: "inline-deletelink",
-      deleteText: options.deleteText,
-      emptyCssClass: "empty-form",
-      removed: alternatingRows,
-      added: function(row) {
-        initPrepopulatedFields(row);
-        reinitDateTimeShortCuts();
-        updateSelectFilter();
-        alternatingRows(row);
-      }
-    });
-
-    return $rows;
-  };
-
-  // Stacked inlines ---------------------------------------------------------
-  $.fn.stackedFormset = function(options) {
-    var $rows = $(this);
-    var updateInlineLabel = function(row) {
-      $($rows.selector).find(".inline_label").each(function(i) {
-        var count = i + 1;
-        $(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
-      });
-    };
-
-    var reinitDateTimeShortCuts = function() {
-      // Reinitialize the calendar and clock widgets by force, yuck.
-      if (typeof DateTimeShortcuts != "undefined") {
-        $(".datetimeshortcuts").remove();
-        DateTimeShortcuts.init();
-      }
-    };
-
-    var updateSelectFilter = function() {
-      // If any SelectFilter widgets were added, instantiate a new instance.
-      if (typeof SelectFilter != "undefined"){
-        $(".selectfilter").each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix);
-        });
-        $(".selectfilterstacked").each(function(index, value){
-          var namearr = value.name.split('-');
-          SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix);
-        });
-      }
-    };
-
-    var initPrepopulatedFields = function(row) {
-      row.find('.prepopulated_field').each(function() {
-        var field = $(this),
-            input = field.find('input, select, textarea'),
-            dependency_list = input.data('dependency_list') || [],
-            dependencies = [];
-        $.each(dependency_list, function(i, field_name) {
-          dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id'));
-        });
-        if (dependencies.length) {
-          input.prepopulate(dependencies, input.attr('maxlength'));
-        }
-      });
-    };
-
-    $rows.formset({
-      prefix: options.prefix,
-      addText: options.addText,
-      formCssClass: "dynamic-" + options.prefix,
-      deleteCssClass: "inline-deletelink",
-      deleteText: options.deleteText,
-      emptyCssClass: "empty-form",
-      removed:  (function(row) {
-        //hack
-
-        updateInlineLabel(row);
-      }),
-      added: (function(row) {
-        initPrepopulatedFields(row);
-        reinitDateTimeShortCuts();
-        updateSelectFilter();
-        updateInlineLabel(row);
-
-        //hack
-        var $items = row.closest('.stacked-inline').find('.stacked-inline-list');
-        var $emptyItem = $items.find('.stacked-inline-list-item.empty');
-        var $item = $emptyItem.clone();
-
-        row.find('.inline-deletelink').remove();
-
-        $item.removeClass('empty');
-        $item.find('.stacked-inline-list-item-link').attr('data-inline-related-id', row.attr('id'));
-
-        $emptyItem.before($item);
-
-        $items.find(".inline_label").each(function(i) {
-          var count = i + 1;
-          $(this).html($(this).html().replace(/(#\d+)/g, "#" + count));
-        });
-      })
-    });
-
-    return $rows;
-  };
-})(django.jQuery);

File diff suppressed because it is too large
+ 0 - 0
jet/static/admin/js/inlines.min.js


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

@@ -1 +0,0 @@
-

+ 127 - 38
jet/static/jet/css/_base.scss

@@ -1,73 +1,162 @@
+/*
+  DJANGO JET Admin styles
+*/
+
 @import "globals";
 
 html, body {
   margin: 0;
   padding: 0;
-  height: 100%;
+}
+
+html {
+  font-size: 87.5%;
+
+  @include for-mobile {
+    font-size: 100%;
+  }
 }
 
 body {
+  height: 100%;
+  background: $background-color;
   color: $text-color;
   font-family: $font;
-  font-size: $font-size;
+  text-size-adjust: 100%;
+
+  @include for-mobile {
+    padding-top: $sidebar-header-height;
+  }
 
   &.non-scrollable {
     overflow: hidden;
   }
+
+  &.popup {
+    @include for-mobile {
+      padding-top: 0;
+    }
+  }
+}
+
+/* PAGE STRUCTURE */
+
+#container {
+  padding: 0 0 0 $sidebar-width;
+  min-height: 100%;
+
+  @include for-mobile {
+    padding-left: 0;
+  }
+
+  .popup & {
+    padding-left: 0;
+  }
 }
 
-a, a:visited, a:hover {
-  color: $link-color;
-  font-weight: normal;
-  text-decoration: none;
+#content {
+  padding: 20px;
+
+  @include for-phone {
+    padding: 10px;
+  }
+
+  & > h1 {
+    display: none;
+  }
 }
 
-a:hover {
-  color: $hover-link-color;
+#content-main {
+  float: left;
+  width: 100%;
+
+  @include for-mobile {
+    float: none;
+  }
 }
 
-.container {
-  padding-left: $sidebar-width;
-  height: 100%;
+#content-related {
+  float: right;
+  width: 260px;
   position: relative;
+  margin-right: -300px;
+
+  @include for-mobile {
+    float: none;
+    width: 100%;
+    margin-left: 0;
+    position: static;
+  }
 }
 
-.sidebar {
-  position: fixed;
-  width: $sidebar-width;
-  height: 100%;
-  top: 0;
-  left: 0;
-  overflow-y: auto;
+#footer {
+  clear: both;
+  padding: 10px;
+
+  &:empty {
+    display: none;
+  }
 }
 
-.content {
-  width: 100%;
-  min-height: 100%;
-  z-index: 1;
-  box-shadow: -2px 0 6px 0 rgba(0, 0, 0, 0.25);
-  position: relative;
+.dialog-confirm {
+  display: none;
 }
 
-#content {
-  padding: 20px;
+/* COLUMN TYPES */
+
+.colMS {
+  margin-right: 300px;
+
+  @include for-mobile {
+    margin-right: 0;
+  }
 }
 
-.module {
-  border: 0;
-  margin: 0;
+.colSM {
+  margin-left: 300px;
+
+  @include for-mobile {
+    margin-left: 0;
+  }
 }
 
-@import "table";
-@import "buttongroup";
-@import "sidebar";
-@import "top";
+.colSM #content-related {
+  float: left;
+  margin-right: 0;
+  margin-left: -300px;
+
+  @include for-mobile {
+    float: none;
+    margin-left: 0;
+  }
+}
+
+.colSM #content-main {
+  float: right;
+
+  @include for-mobile {
+    float: none;
+  }
+}
+
+.popup .colM {
+  width: auto;
+}
+
+@import "jquery-ui/jquery-ui.theme";
+@import "select2/layout";
+@import "content";
 @import "forms";
+@import "tables";
 @import "messages";
-@import "changelist";
+@import "header";
+@import "breadcrumbs";
+@import "modules";
+@import "object-tools";
 @import "changeform";
-@import "delete";
-@import "login";
-@import "content";
+@import "changelist";
+@import "sidebar";
+@import "relatedpopup";
 @import "dashboard";
-@import "relatedpopup";
+@import "delete-confirmation";
+@import "login";

+ 45 - 0
jet/static/jet/css/_breadcrumbs.scss

@@ -0,0 +1,45 @@
+@import "globals";
+
+/* BREADCRUMBS */
+
+div.breadcrumbs {
+  font-size: 12px;
+  font-weight: bold;
+  text-transform: uppercase;
+  line-height: $top-height;
+  color: $top-text-color;
+  padding: 20px 175px + 20px + 20px 20px 20px;
+  visibility: hidden;
+
+  @include for-mobile {
+    padding: 20px 20px 10px 20px;
+    white-space: nowrap;
+    overflow: auto;
+  }
+
+  @include for-phone {
+    padding: 10px;
+  }
+
+  &.initialized {
+    visibility: inherit;
+  }
+
+  a {
+    &, &:visited {
+      color: $top-link-color;
+    }
+
+    &:focus, &:hover {
+      color: $top-hover-link-color;
+    }
+  }
+}
+
+.breadcrumbs-separator {
+  color: $top-separator-color;
+  margin: 0 6px 0 6px;
+  font-weight: bold !important;
+  font-size: 15px;
+  vertical-align: middle;
+}

+ 0 - 47
jet/static/jet/css/_buttongroup.scss

@@ -1,47 +0,0 @@
-@import "globals";
-
-.button-group {
-  margin: 0;
-  line-height: normal;
-
-  &-buttons {
-    span, a {
-      padding: 6px 10px;
-      display: inline-block;
-
-      &:first-child {
-        border-radius: 4px 0 0 4px;
-      }
-
-      &:last-child {
-        border-radius: 0 4px 4px 0;
-      }
-
-      &:first-child:last-child {
-        border-radius: 4px;
-      }
-    }
-
-    span {
-      background-color: $button-active-background-color;
-      color: $button-active-text-color;
-    }
-
-    a {
-      &, &:visited, &:hover {
-        background-color: $button-background-color;
-        color: $button-text-color;
-        text-decoration: none;
-      }
-
-      &:hover {
-        background-color: $button-hover-background-color;
-        color: $button-hover-text-color;
-      }
-    }
-  }
-
-  &-label {
-    margin-right: 10px;
-  }
-}

+ 741 - 357
jet/static/jet/css/_changeform.scss

@@ -1,498 +1,882 @@
 @import "globals";
 
-.module {
-  &-separator {
-    height: 1em;
+/* FORM ROWS */
+
+.form-row {
+  overflow: hidden;
+  padding: 10px;
+
+  img, input {
+    vertical-align: middle;
   }
 
-  .form-row {
-    padding: 6px 0;
-    overflow: hidden;
+  label input[type="checkbox"] {
+    margin-top: 0;
+    vertical-align: 0;
+  }
 
-    label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 150px;
-      word-wrap: break-word;
+  p {
+    padding-left: 0;
+  }
 
-      + p {
-        padding-top: 6px;
-        margin: 4px 0 4px (150px + 10px);
-      }
+  .select2 {
+    @include for-phone {
+      width: auto !important;
+      max-width: 100%;
     }
+  }
+}
 
-    br {
-      clear: both;
+.hidden {
+  display: none;
+}
+
+/* FORM LABELS */
+
+label {
+  .required &, &.required {
+    font-weight: bold;
+
+    &:after {
+      content: "*";
     }
+  }
+
+  .form-row.errors & {
+    color: $error-text-color;
+  }
+}
+
+/* RADIO BUTTONS */
 
-    &.errors label {
-      color: $error-text-color;
+form {
+  ul.radiolist {
+    li {
+      list-style-type: none;
     }
 
-    .checkbox-row label {
+    label {
       float: none;
       display: inline;
     }
 
-    .help {
-      @extend .small;
-      clear: left;
-      color: $dim-text-color;
-      margin: 12px 0 0 160px;
+    input[type="radio"] {
+      margin: -2px 4px 0 0;
+      padding: 0;
     }
+  }
 
-    .checkbox-row .help {
-      margin-left: 0;
-    }
+  ul.inline {
+    margin-left: 0;
+    padding: 0;
 
-    .errorlist {
-      @extend .clear-list;
-      @extend .small;
-      color: $error-text-color;
-      margin-bottom: 10px !important;
+    li {
+      float: left;
+      padding-right: 7px;
     }
+  }
+}
 
-    .datetime {
-      margin-left: 160px;
-    }
+/* ALIGNED FIELDSETS */
 
-    .add-related span {
-      font-size: 18px;
-      vertical-align: middle;
+.aligned {
+  label {
+    display: block;
+    padding: 8px 10px 0 0;
+    float: left;
+    width: 160px;
+    word-wrap: break-word;
+    line-height: 1;
+
+    @include for-mobile {
+      display: block;
+      padding: 0 0 0 2px;
+      margin-bottom: 8px;
+      float: none;
+      width: auto;
     }
+  }
 
-    .change-related span {
-      font-size: 20px;
-      vertical-align: middle;
+  label + p {
+    padding: 6px 0;
+    margin-top: 0;
+    margin-bottom: 0;
+    margin-left: 170px;
+
+    @include for-mobile {
+      margin-left: 0;
     }
+  }
 
-    .add-another {
-      margin-left: 4px;
+  ul label {
+    display: inline;
+    float: none;
+    width: auto;
+  }
 
-      &:before {
-        @include font-icon;
-        vertical-align: middle;
-        font-size: 18px;
-        content: $icon-add3;
-      }
+  .form-row input {
+    margin-bottom: 0;
+  }
 
-      img {
-        display: none;
-      }
-    }
+  .vCheckboxLabel {
+    float: none;
+    width: auto;
+    display: inline-block;
+    vertical-align: -3px;
+    padding: 0 0 5px 0;
 
-    .field-box {
-      margin-right: 20px;
-      float: left;
+    & + p.help {
+      margin-top: -4px;
     }
+  }
+}
 
-    .file-upload {
-      background: $content-contrast-background-color;
-      display: inline-block;
-      margin: 0;
-      line-height: 1.5em;
-      padding: 10px;
-      border-radius: 4px;
+form .aligned {
+  ul {
+    margin-left: 160px;
+    padding-left: 10px;
 
-      .clearable-file-input label {
-        display: inline;
-        float: none;
-        padding: 0;
-        width: auto;
-        margin-left: 10px;
-      }
+    @include for-mobile {
+      margin-left: 0;
+      padding-left: 0;
     }
   }
 
-  &.aligned {
-    background-color: $content-background-color;
-    border-radius: 4px;
-    padding: 20px;
+  ul.radiolist {
+    display: inline-block;
+    margin: 0;
+    padding: 0;
+  }
+
+  p.help {
+    clear: left;
+    margin-top: 0;
+    margin-left: 160px;
+    padding-left: 10px;
 
-    ul label {
-      display: inline;
-      float: none;
-      width: auto;
+    @include for-mobile {
+      margin-left: 0;
+      padding-left: 0;
     }
+  }
 
-    ul {
-      margin: 0 0 0 160px;
-      padding: 0;
+  label + p.help {
+    margin-left: 0;
+    padding-left: 0;
+  }
+
+  p.help:last-child {
+    margin-bottom: 0;
+    padding-bottom: 0;
+  }
+
+  input + p.help,
+  textarea + p.help,
+  select + p.help {
+    margin-left: 160px;
+    padding-left: 10px;
+
+    @include for-mobile {
+      margin-left: 0;
+      padding-left: 0;
     }
   }
+
+  ul li {
+    list-style: none;
+  }
+
+  table p {
+    margin-left: 0;
+    padding-left: 0;
+  }
 }
 
-.submit-row {
-  padding: 20px 0;
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField {
+  width: 350px;
 
-  .deletelink-box {
-    float: right;
-    padding: 0;
-    margin: 0;
+  @include for-mobile {
+    width: 100%;
   }
 }
 
-.changeform {
-  background-color: $content-background-color;
-  border-radius: 4px;
-  min-width: 800px;
+.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField {
+  width: 510px;
+
+  @include for-mobile {
+    width: 100%;
+  }
+}
+
+.checkbox-row p.help {
+  margin-left: 0;
+  padding-left: 0;
+}
+
+/* FIELDSETS */
 
-  &-navigation {
+fieldset {
+  .field-box {
     float: left;
-    margin-bottom: 20px;
+    margin-right: 20px;
   }
 
-  &-tabs {
-    @extend .clear-list;
-    border-bottom: 2px solid $background-color;
-    padding-left: 16px !important;
+  &.monospace textarea {
+    font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+  }
+}
 
-    &-item {
-      display: inline-block;
+/* WIDE FIELDSETS */
 
-      & a, & a:hover, & a:visited {
-        display: inline-block;
-        padding: 12px 4px;
-        margin: 0 4px;
-        border-bottom: 2px solid transparent;
-        position: relative;
-        top: 2px;
-        color: $dim-text-color;
-        font-weight: bold;
-        font-size: 11px;
-        text-transform: uppercase;
-      }
+.wide label {
+  width: 200px;
+}
 
-      & a:hover {
-        color: $text-color;
-      }
+form .wide p, form .wide input + p.help {
+  margin-left: 200px;
 
-      &.selected {
-        & a, & a:hover, & a:visited {
-          color: $text-color;
-          border-color: $tab-selected-border-color;
-        }
+  @include for-mobile {
+    margin-left: 0;
+  }
+}
+
+form .wide p.help {
+  padding-left: 38px;
+
+  @include for-mobile {
+    padding-left: 0;
+  }
+}
+
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField {
+  width: 450px;
+
+  @include for-mobile {
+    width: 100%;
+  }
+}
+
+/* COLLAPSED FIELDSETS */
+
+//fieldset.collapsed * {
+//    display: none;
+//}
+//
+//fieldset.collapsed h2, fieldset.collapsed {
+//    display: block;
+//}
+//
+//fieldset.collapsed {
+//    border: 1px solid #eee;
+//    border-radius: 4px;
+//    overflow: hidden;
+//}
+//
+//fieldset.collapsed h2 {
+//    background: #f8f8f8;
+//    color: #666;
+//}
+//
+//fieldset .collapse-toggle {
+//    color: #fff;
+//}
+//
+//fieldset.collapsed .collapse-toggle {
+//    background: transparent;
+//    display: inline;
+//    color: #447e9b;
+//}
+
+/* MONOSPACE TEXTAREAS */
+
+fieldset.monospace textarea {
+    font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+}
+
+/* SUBMIT ROW */
+
+.submit-row {
+  margin: 20px 0;
+  overflow: hidden;
+
+  @include for-mobile {
+    margin-bottom: 10px;
+  }
+
+  input {
+    &, &:visited, &:hover {
+      margin: 0 5px 5px 0;
+      padding: 0 20px;
+      font-size: 12px;
+
+      @include for-phone {
+        display: block;
+        width: 100%;
+        margin: 0 0 8px 0;
       }
+    }
 
-      &.errors {
-        & a, & a:hover, & a:visited {
-          border-color: $tab-error-border-color;
-        }
+    &.default {
+      margin: 0 8px 5px 0;
+
+      @include for-phone {
+        display: block;
+        width: 100%;
+        margin: 0 0 20px 0;
       }
     }
   }
 
-  &-tabs ~ .module {
-    display: none;
+  p {
+    margin: 0.3em;
+  }
 
-    &.selected {
+  p.deletelink-box {
+    display: block;
+    float: right;
+    padding: 0;
+    margin: 0 5px 5px 0;
+
+    @include for-phone {
+      float: none;
       display: block;
+      margin: 0 0 8px 0;
     }
+  }
 
-    .stacked.inline-related {
-      display: none;
+  a.deletelink {
+    &, &:visited, &:hover {
+      display: inline-block;
+      background-color: $danger-button-background-color;
+      color: $danger-button-text-color;
+      border: 0;
+      border-radius: 4px;
+      height: 32px;
+      line-height: 32px;
+      outline: 0;
+      font-size: 12px;
+      font-weight: lighter;
+      text-align: center;
+      padding: 0 20px;
+      text-transform: uppercase;
+      box-sizing: border-box;
+      transition: background $transitions-duration, box-shadow $transitions-duration, border $transitions-duration;
 
-      &.selected {
+      @include for-phone {
         display: block;
+        width: 100%;
       }
     }
-  }
 
-  .module {
-    .form-row {
-      .select2 {
-        max-width: 800px - 20px * 2 - 150px - 24px;
-      }
+    &:hover, &:focus {
+      background-color: $button-hover-background-color;
+      color: $button-hover-text-color;
     }
-  }
 
-  .inline-group {
-    .errornote {
-      color: $error-text-color;
-      margin: 0;
-      padding: 20px;
+    &:active {
+      background-color: $button-active-background-color;
+      color: $button-active-text-color;
     }
   }
+}
 
-  .tabular.inline-related {
-    .module {
-      border: 0;
-      margin: 0;
-      padding: 0;
+body.popup .submit-row {
+  overflow: auto;
+}
 
-      .errornote {
-        background-color: $content-contrast-background-color;
-      }
+/* CUSTOM FORM FIELDS */
 
-      .errorlist {
-        @extend .clear-list;
-        @extend .small;
-        color: $error-text-color;
-      }
+.vSelectMultipleField {
+  vertical-align: top;
+}
 
-      table {
-        border-collapse: collapse;
-        width: 100%;
+.vCheckboxField {
+  border: none;
+}
 
-        thead {
-          th {
-            background: -webkit-linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
-            background: linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
-            padding: 8px;
-            font-size: 12px;
-            font-weight: bold;
-            text-align: left;
-            text-transform: uppercase;
-
-            &.action-checkbox-column {
-              width: 20px;
-              text-align: center;
-            }
-          }
-        }
+.vDateField, .vTimeField {
+  margin-right: 2px;
+  margin-bottom: 4px;
+  border-radius: 4px 0 0 4px !important;
+  border-right: 0 !important;
 
-        tbody {
-          tr {
-            border-bottom: 1px solid $content-border-color;
-
-            &:last-child {
-              border-bottom: 0;
-            }
-
-            & th, & td {
-              padding: 8px;
-              text-align: left;
-              font-size: 13px;
-
-              &.original {
-                text-align: center;
-                font-size: 18px;
-                width: 36px;
-                padding-right: 0;
-                white-space: nowrap;
-
-                p {
-                  margin: 0;
-                }
-
-                .icon-new {
-                  font-size: 18px;
-                  vertical-align: middle;
-                }
-
-                .icon-edit {
-                  font-size: 18px;
-                  vertical-align: middle;
-                }
-
-                .icon-open-external {
-                  font-size: 18px;
-                  vertical-align: middle;
-                }
-              }
-            }
-          }
-
-          .add-row {
-            td {
-              padding: 16px;
-
-              a {
-                font-size: 12px;
-                font-weight: bold;
-
-                span {
-                  vertical-align: middle;
-                }
-              }
-            }
-          }
-        }
-      }
+  @include for-width(374px) {
+    border-radius: 4px !important;
+    border-right: 1px !important;
+  }
+
+  &-link {
+    vertical-align: top;
+    display: inline-block;
+
+    @include for-width(374px) {
+       display: none;
+    }
+
+    span {
+      width: 32px;
+      height: 32px;
+      line-height: 32px !important;
+      background-color: $button-background-color;
+      color: $button-text-color;
+      display: inline-block;
+      vertical-align: middle;
+      text-align: center;
+      border-radius: 0 4px 4px 0;
+    }
+
+    &:hover span {
+      background-color: $button-hover-background-color;
+      color: $button-hover-text-color;
     }
   }
+}
 
-  .stacked-inline {
-    $side-width: 250px;
+.vDateField {
+  min-width: 6.85em;
+}
 
-    position: relative;
+.vTimeField {
+  min-width: 4.7em;
+}
 
-    &.side {
-      margin-left: $side-width;
+.vDateField-link + .vTimeField {
+  margin-left: 10px;
+}
+
+.vURLField {
+  width: 30em;
+}
+
+.vLargeTextField, .vXMLLargeTextField {
+  width: 48em;
+
+  @include for-mobile {
+    width: 100%;
+  }
+}
+
+.flatpages-flatpage #id_content {
+  height: 40.2em;
+}
+
+.module table .vPositiveSmallIntegerField {
+  width: 2.2em;
+}
+
+.vTextField {
+  width: 20em;
+
+  @include for-phone {
+    width: 100%;
+  }
+}
+
+.vIntegerField {
+  width: 6em;
+}
+
+.vBigIntegerField {
+  width: 10em;
+}
+
+.vForeignKeyRawIdAdminField {
+  width: 5em;
+}
+
+/* INLINES */
+
+.inline-group {
+  padding: 0;
+  background-color: $content-background-color;
+  border-radius: 4px;
+  border: 0;
+
+  thead th {
+    padding: 8px 10px;
+  }
+
+  .aligned label {
+    width: 160px;
+  }
+
+  > fieldset.module {
+    padding: 0;
+  }
+}
+
+.inline-related {
+  position: relative;
+
+  h3 {
+    margin: 0;
+    background: linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
+    font-weight: bold;
+    color: $text-color;
+    padding: 20px 30px 0 30px;
+
+    @include for-mobile {
+      padding: 20px 20px 0 20px;
+      line-height: 2;
     }
 
-    &-side {
-      float: left;
-      width: $side-width;
-      margin-left: -$side-width;
-      background: $content-contrast-background-color;
-      max-height: 60vh;
-      overflow-y: auto;
-
-      &-top {
-        height: 40px;
-        background: -webkit-linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
-        background: linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
+    > b {
+      margin-right: 10px;
+    }
+
+    .inline_label {
+      display: inline-block;
+      background: $content-contrast2-background-color;
+      color: $content-contrast2-text-color;
+      padding: 4px 8px;
+      border-radius: 5px;
+      font-size: 10px;
+      font-weight: normal;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      max-width: 100%;
+      box-sizing: border-box;
+      vertical-align: middle;
+
+      @include for-mobile {
+        margin-right: 10px;
+        line-height: normal;
       }
 
-      &-bottom {
-        height: 40px;
-        background: -webkit-linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
-        background: linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
+      ~ .inlinechangelink, ~ .inlineviewlink {
+        font-size: 18px;
+        margin-left: 10px;
+        vertical-align: middle;
+
+        &:before {
+          margin: 0;
+        }
       }
     }
 
-    &-content {
+    span.delete, .inline-deletelink {
       float: right;
-      width: 100%;
+      margin-left: 10px;
+      display: inline-block;
+      background: $danger-button-background-color;
+      color: $danger-button-text-color;
+      padding: 4px 8px;
+      border-radius: 5px;
+      font-size: 10px;
+      font-weight: normal;
+      vertical-align: middle;
+      white-space: nowrap;
 
-      .actions {
-        margin: 20px 20px 0 20px;
+      @include for-mobile {
+        float: none;
+        margin-left: 0;
+        line-height: normal;
+      }
 
-        .icon-new {
-          font-size: 18px;
-          vertical-align: middle;
-        }
+      label {
+        font-size: 10px;
+        vertical-align: middle;
 
-        .icon-edit {
-          font-size: 18px;
+        &:before {
+          font-size: 10px;
+          color: $danger-button-text-color;
           vertical-align: middle;
         }
+      }
+    }
+  }
 
-        .icon-open-external {
-          font-size: 18px;
-          vertical-align: middle;
-        }
+  fieldset {
+    margin: 0;
+    background: #fff;
+    width: 100%;
+
+    &.module {
+      background-color: inherit;
+      box-sizing: border-box;
+
+      h3 {
+        margin: 0;
+        padding: 2px 5px 3px 5px;
+        font-size: 11px;
+        text-align: left;
+        font-weight: bold;
+        background: #bcd;
+        color: #fff;
       }
+    }
+  }
+}
+
+.inline-related.tabular fieldset.module {
+  padding: 0;
+
+  table {
+    width: 100%;
+  }
+}
+
+.inline-group {
+  .tabular {
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
 
-      .delete {
-        margin: 20px 20px 0 20px;
-        border-radius: 4px;
-        padding: 10px;
-        border: 2px solid $warning-color;
-        box-sizing: border-box;
+    table {
+      box-shadow: none;
+      margin: 0;
+    }
+
+    thead th, thead td {
+      background: linear-gradient(to top, $content-background-color 0%, $content-contrast-background-color 100%);
+      font-weight: bold;
+      color: $text-color;
+
+      a:link, a:visited {
+        color: $text-color;
       }
     }
 
-    .add-row {
-      position: absolute;
-      top: 0;
-      left: -$side-width;
-      width: $side-width;
-      height: 40px;
-      line-height: 40px;
-      padding: 0 20px;
-      overflow: hidden;
-      text-overflow: ellipsis;
+    td.original {
       white-space: nowrap;
-      box-sizing: border-box;
-      background: -webkit-linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
-      background: linear-gradient(to bottom, $content-background-color 0%, $content-contrast-background-color 100%);
+      width: 1px;
+      padding-right: 0;
 
-      a {
-        font-size: 12px;
-        font-weight: bold;
+      &.empty {
+        padding: 0;
+      }
 
-        span {
+      p {
+        padding: 0;
+
+        .inlinechangelink, .inlineviewlink {
+          font-size: 18px;
+          margin: 0;
           vertical-align: middle;
         }
       }
     }
 
-    &-list {
-      @extend .clear-list;
+    tr.add-row td {
+      padding: 8px 10px;
+      border-bottom: 1px solid #eee;
+    }
+  }
 
-      &-item {
-        &-link{
-          &-remove {
-            position: relative;
-            float: right;
-            display: none;
-          }
+  ul.tools {
+    padding: 0;
+    margin: 0;
+    list-style: none;
 
-          &:hover .stacked-inline-list-item-link-remove {
-            display: inline-block;
-          }
-        }
+    li {
+      display: inline;
+      padding: 0 5px;
+    }
+  }
 
-        a, a:visited, a:hover {
-          display: block;
-          padding: 8px 10px 8px 20px;
-          color: $dim-text-color;
-          overflow: hidden;
-          text-overflow: ellipsis;
-          white-space: nowrap;
-          @include transition-all(0.2s);
-        }
+  div.add-row, .tabular tr.add-row td {
+    padding: 16px;
+    border: 0;
+  }
 
-        a:hover {
-          color: $button-hover-text-color;
-          background-color: $button-hover-background-color;
-        }
+  ul.tools a.add, div.add-row a, .tabular tr.add-row td a {
+    font-size: 12px;
+    font-weight: bold;
+    vertical-align: middle;
 
-        &.selected {
-          a, a:visited, a:hover {
-            color: $text-color;
-          }
+    &:before {
+      @include font-icon;
+      content: $icon-add;
+      vertical-align: middle;
+      margin-right: 4px;
+    }
+  }
+}
 
-          a:hover {
-            color: $text-color;
-            background-color: transparent;
-          }
-        }
+.empty-form {
+  display: none;
+}
 
-        &:not(.has_original) {
-          a, a:visited {
+/* RELATED FIELD ADD ONE / LOOKUP */
 
-          }
-        }
+form .related-widget-wrapper ul {
+    display: inline-block;
+    margin-left: 0;
+    padding-left: 0;
+}
 
-        &.empty {
-          display: none;
-        }
+.clearable-file-input input {
+    margin-top: 0;
+}
 
-        &.delete {
-          a, a:visited, a:hover {
-            text-decoration: line-through;
-          }
-        }
+.changeform-navigation {
+  display: none;
+  float: left;
+  margin-bottom: 20px;
 
-        &.errors {
-          a, a:visited, a:hover {
-            color: $error-text-color;
-          }
-        }
-      }
+  @include for-mobile {
+    margin-bottom: 5px;
+    margin-right: 10px;
+  }
+
+  &.initialized {
+    display: block;
+  }
+
+  &-button {
+    font-weight: bold;
+    vertical-align: middle;
+  }
+}
+
+.related-widget-wrapper-link {
+  opacity: 0.5;
+  transition: opacity $transitions-duration;
+
+  &:link {
+    opacity: 1;
+  }
+}
+
+.add-related, .add-another, .change-related, .delete-related, .related-lookup {
+  display: none;
+
+  &.initialized {
+    display: inline-block;
+  }
+
+  .form-row & {
+    margin-top: 10px;
+  }
+}
+
+.related-widget-wrapper-icon {
+  &:before {
+    @include font-icon;
+    font-size: 20px;
+    vertical-align: middle;
+  }
+
+  .add-related &, .add-another & {
+    &:before {
+      content: $icon-add3;
     }
   }
 
-  .submit-row {
-    padding: 20px;
+  .change-related & {
+    &:before {
+      content: $icon-edit;
+    }
+  }
+
+  .delete-related & {
+    &:before {
+      content: $icon-cross;
+    }
   }
 }
 
 .related-lookup {
-  margin-left: 10px;
+  margin-left: 6px;
 
   &:before {
     @include font-icon;
-    color: $button-text-color;
-    vertical-align: middle;
     font-size: 20px;
+    vertical-align: middle;
     content: $icon-search;
   }
+}
 
-  img {
-    display: none;
+/* TABS */
+
+.changeform-tabs {
+  margin: 0;
+  padding: 0 0 0 16px;
+  border-bottom: 2px solid $background-color;
+  background-color: $content-background-color;
+  border-radius: 4px 4px 0 0;
+
+  @include for-mobile {
+    padding: 10px 10px 5px 10px;
   }
 
-  + strong {
-    font-weight: normal;
-    font-size: 12px;
+  &-item {
+    display: inline-block;
+    padding: 0;
+    line-height: normal;
+
+    a, a:hover, a:visited {
+      display: inline-block;
+      padding: 12px 4px;
+      margin: 0 8px 0 0;
+      border-bottom: 2px solid transparent;
+      position: relative;
+      top: 2px;
+      color: $dim-text-color;
+      font-weight: bold;
+      font-size: 11px;
+      text-transform: uppercase;
+      transition: background-color $fast-transitions-duration,
+                  color $fast-transitions-duration,
+                  border-color $transitions-duration;
+
+      @include for-mobile {
+        margin: 0 5px 5px 0;
+        padding: 8px 12px;
+        top: auto;
+        border: 0;
+        border-radius: 5px;
+        font-weight: normal;
+        background: $button-background-color;
+        color: $button-text-color;
+      }
+    }
+
+    a:hover {
+      color: $text-color;
+    }
+
+    &.errors {
+      & a, & a:hover, & a:visited {
+        border-color: $tab-error-border-color;
+
+        @include for-mobile {
+          background: $danger-button-background-color;
+          color: $danger-button-text-color;
+        }
+      }
+    }
+
+    &.selected {
+      & a, & a:hover, & a:visited {
+        color: $text-color;
+        border-color: $tab-selected-border-color;
+
+        @include for-mobile {
+          background: $button-hover-background-color;
+          color: $button-hover-text-color;
+        }
+      }
+    }
+  }
+
+  ~ .module, ~ .inline-group {
+    display: none !important;
+    border-radius: 0 0 4px 4px;
+
+    &.selected {
+      display: block !important;
+    }
   }
 }
 
-.related-widget-wrapper {
-  float: left;
-}
+
+body.change-form #content-main > form > div {
+  > .module, > .inline-group {
+    display: none;
+
+    &.initialized {
+      display: block;
+    }
+  }
+}

+ 387 - 37
jet/static/jet/css/_changelist.scss

@@ -1,67 +1,417 @@
 @import "globals";
 
+/* CHANGELISTS */
+
 #changelist {
-  .changelist-filter {
-    margin-bottom: 20px;
-    line-height: 40px;
+  position: relative;
+  width: 100%;
+
+  table {
+    width: 100%;
+  }
+
+  .results {
+    overflow-x: auto;
+    -webkit-overflow-scrolling: touch;
+
+    @include for-mobile {
+      position: relative;
+      left: -20px;
+      width: calc(100% + 40px);
+      margin-bottom: 0 !important;
+
+      table {
+        border-radius: 0;
+      }
+
+      thead th, tfoot td {
+        border-radius: 0
+      }
+    }
+
+    @include for-phone {
+      left: -10px;
+      width: calc(100% + 20px);
+    }
+  }
+
+  .paginator {
+    text-align: right;
+
+    @include for-mobile {
+      text-align: left;
+    }
+
+    @include for-phone {
+      text-align: center;
+    }
+  }
+}
+
+.change-list {
+  .hiddenfields {
+    display: none;
+  }
+
+  .filtered table {
+    border-right: none;
+  }
+
+  .filtered {
+    min-height: 400px;
+  }
+
+  .filtered table tbody th {
+    padding-right: 1em;
+  }
+}
+
+/* CHANGELIST TABLES */
+
+#changelist table {
+  thead th {
+    &.action-checkbox-column {
+      width: 1.5em;
+      text-align: center;
+    }
+  }
+
+  tbody td.action-checkbox {
+    text-align: center;
+  }
 
-    * {
+  tfoot {
+    color: #666;
+  }
+}
+
+/* TOOLBAR */
+
+#toolbar {
+  float: left;
+  margin-bottom: 20px;
+  display: none;
+
+  @include for-mobile {
+    float: none;
+  }
+
+  &.initialized {
+    display: block;
+  }
+
+  form {
+    label[for="searchbar"] {
+      display: none;
+    }
+
+    #searchbar {
+      margin-bottom: 2px;
+      margin-right: 2px;
       vertical-align: top;
+
+      @include for-mobile {
+        margin-right: 5px;
+        margin-bottom: 5px;
+      }
+
+      @include for-phone {
+        width: 100%;
+      }
     }
 
-    &-submit-block {
-      white-space: nowrap;
-      line-height: 32px;
-      display: inline-block;
+    input[type="submit"] {
+      &, &:visited, &:hover {
+        background-color: $primary-button-background-color;
+        color: $primary-button-text-color;
+        font-size: 12px;
+        font-weight: lighter;
+        padding: 0 20px;
+        text-transform: uppercase;
+        vertical-align: middle;
+      }
+
+      &:hover, &:focus {
+        background-color: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
+
+      &:active {
+        background-color: $button-active-background-color;
+        color: $button-active-text-color;
+      }
     }
   }
+}
 
-  .results {
-    overflow-x: auto;
+.changelist-filter-select {
+  &-wrapper {
+    margin-right: 2px;
+    margin-bottom: 2px;
+    display: inline-block;
+
+    @include for-mobile {
+      margin-right: 5px;
+      margin-bottom: 5px;
+    }
+
+    .select2-container--jet {
+      min-width: 100px;
+    }
   }
+}
 
-  table {
-    @extend .table;
-    box-shadow: 0 2px 0 0 $content-border2-color;
-    width: 100%;
+/* FILTER COLUMN */
+
+#changelist-filter {
+  display: none;
+}
+
+/* DATE DRILLDOWN */
+
+.change-list ul.toplinks {
+  display: block;
+  padding: 0;
+  margin: 0;
+
+  li {
+    list-style-type: none;
+    display: inline-block;
+    margin: 0 5px 5px 0;
+    background-color: $button-background-color;
+    color: $button-text-color;
+    text-decoration: none;
+    font-size: 14px;
+    padding: 6px 10px;
+    border-radius: 4px;
+  }
+
+  a {
+    &, &:visited {
+      color: $button-text-color;
+    }
+
+    &:focus, &:hover {
+      text-decoration: underline;
+    }
+  }
+}
+
+/* PAGINATOR */
+
+.paginator {
+  display: none;
+  line-height: normal;
+  padding: 0 !important;
+  margin: 0;
+  font-size: 12px;
+
+  &.initialized {
+    display: inherit;
+  }
+
+  span:not(.pages-wrapper), a {
+    font-size: 14px;
+    padding: 6px 10px;
+    display: inline-block;
+
+    &:first-child {
+      border-radius: 4px 0 0 4px;
+    }
+
+    &:last-child {
+      border-radius: 0 4px 4px 0;
+    }
+
+    &:first-child:last-child {
+      border-radius: 4px;
+    }
+  }
+
+  span:not(.pages-wrapper) {
+    background-color: $button-active-background-color;
+    color: $button-active-text-color;
+
+    &.disabled {
+      background-color: $button-background-color;
+      color: $button-text-color;
+    }
+  }
+
+  a:not(.showall) {
+    &:link, &:visited {
+      background-color: $button-background-color;
+      color: $button-text-color;
+      text-decoration: none;
+    }
+
+    &:focus, &:hover {
+      background-color: $button-hover-background-color;
+      color: $button-hover-text-color;
+    }
+  }
+
+  a.showall {
+    &:link, &:visited {
+      font-size: 12px;
+    }
+  }
+
+  .pages-wrapper {
+    margin-left: 10px;
+    display: inline-block;
+    margin-bottom: 5px;
+
+    @include for-mobile {
+      margin-left: 0;
+    }
+  }
+
+  .label  {
+    padding: 8px 0;
+  }
+
+  input[type="submit"] {
+    &, &:hover, &:focus {
+      font-size: 13px;
+      padding: 6px 10px;
+      height: auto;
+      line-height: normal;
+      margin: 0 0 0 10px;
+    }
   }
+}
 
-  .changelist-footer {
-    margin-top: 20px;
-    background: $background-color;
+/* ACTIONS */
 
-    &.fixed {
-      position: fixed;
-      left: 250px + 20px;
-      right: 20px;
-      bottom: 0;
+#changelist {
+  table {
+    input {
       margin: 0;
-      padding: 20px 0;
-      border-top: 2px solid $content-border2-color;
+      vertical-align: baseline;
     }
 
-    &.popup {
-      left: 20px;
+    tbody tr.selected {
+      border-color: $content-selected-border-color;
+      background-color: $content-selected-background-color;
+    }
+  }
+
+  .actions {
+    float: left;
+    display: none;
+
+    @include for-mobile {
+      float: none;
+      margin-bottom: 20px;
+    }
+
+    &.initialized {
+      display: inline-block;
+
+      @include for-mobile {
+        display: block;
+      }
+    }
+
+    label {
+      @include for-mobile {
+        margin-bottom: 5px;
+        display: inline-block;
+      }
+
+      @include for-phone {
+        display: block;
+      }
+    }
+
+    .select2 {
+      @include for-phone {
+        width: 100% !important;
+      }
     }
 
-    .actions {
-      float: left;
+    .labels {
+      padding: 8px 0;
 
-      &-label {
-        margin-left: 10px;
+      @include for-phone {
+        text-align: center;
       }
+    }
+
+    span.all, span.action-counter, span.clear, span.question {
+      display: none;
+    }
 
-      span {
-        .all, .action-counter, .clear, .question {
-          display: none;
+    span.clear {
+      margin-left: 5px;
+    }
+
+    .button {
+      &, &:visited, &:hover {
+        display: inline-block;
+        background-color: $primary-button-background-color;
+        color: $primary-button-text-color;
+        border: 0;
+        border-radius: 4px;
+        height: 32px;
+        line-height: 32px;
+        outline: 0;
+        font-size: 12px;
+        font-weight: lighter;
+        text-align: center;
+        padding: 0 20px;
+        text-transform: uppercase;
+        margin: 0 8px 5px 0;
+        transition: background $transitions-duration;
+
+        @include for-phone {
+          width: 100%;
         }
       }
+
+      &:hover, &:focus {
+        background-color: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
+
+      &:active {
+        background-color: $button-active-background-color;
+        color: $button-active-text-color;
+      }
+    }
+
+    span {
+      font-size: 12px;
     }
   }
 }
 
-table#change-history {
-  @extend .table;
-  box-shadow: 0 2px 0 0 $content-border2-color;
-  width: 100%;
+.changelist-footer {
+  padding: 20px 0;
+  background: $background-color;
+
+  &.fixed {
+    position: fixed;
+    left: $sidebar-width + 20px;
+    right: 20px;
+    bottom: 0;
+    border-top: 2px solid $content-border2-color;
+
+    body.popup & {
+      left: 20px;
+    }
+
+    @include for-mobile {
+      position: static;
+      left: auto;
+      right: auto;
+      bottom: auto;
+      border-top: 0;
+    }
+  }
+
+  &.popup {
+    left: 20px;
+  }
 }

+ 252 - 97
jet/static/jet/css/_content.scss

@@ -1,129 +1,270 @@
 @import "globals";
 
-.content {
-  background-color: $background-color;
+
+/* LINKS */
+
+a, a:visited, a:hover, a:focus {
+  color: $link-color;
+  font-weight: normal;
+  text-decoration: none;
 }
 
-.dashboard #content {
-  width: 500px;
+a:hover, a:focus {
+  color: $hover-link-color;
 }
 
-#content {
-  > h1 {
-    text-transform: uppercase;
-    font-size: 12px;
-    font-weight: bold;
-    line-height: $top-height;
-    color: $top-text-color;
-    margin: 0 0 2em 0;
-  }
+a img {
+  border: none;
+}
+
+//a.section:link, a.section:visited {
+//    color: #fff;
+//    text-decoration: none;
+//}
+//
+//a.section:focus, a.section:hover {
+//    text-decoration: underline;
+//}
+
+/* GLOBAL DEFAULTS */
+
+p, ol, ul, dl {
+  margin: .2em 0 .8em 0;
+}
+
+p {
+  padding: 0;
+  line-height: 140%;
+}
+
+h1, h2, h3, h4, h5 {
+  font-weight: bold;
+}
+
+h1 {
+  margin: 0 0 20px;
+  font-weight: 300;
+  font-size: 20px;
 }
 
+h2 {
+  font-size: 16px;
+  margin: 1em 0 .5em 0;
+}
+
+h2.subhead {
+  font-weight: normal;
+  margin-top: 0;
+}
+
+h3 {
+  font-size: 14px;
+  margin: .8em 0 .3em 0;
+  font-weight: bold;
+}
+
+h4 {
+  font-size: 12px;
+  margin: 1em 0 .8em 0;
+  padding-bottom: 3px;
+}
+
+h5 {
+  font-size: 10px;
+  margin: 1.5em 0 .5em 0;
+  text-transform: uppercase;
+  letter-spacing: 1px;
+}
+
+ul li {
+  list-style-type: square;
+  padding: 0;
+}
+
+li ul {
+  margin-bottom: 0;
+}
+
+dt, dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+  margin-top: 4px;
+}
+
+dd {
+  margin-left: 0;
+}
+
+form {
+  margin: 0;
+  padding: 0;
+}
+
+fieldset {
+  margin: 0;
+  padding: 0;
+  border: none;
+}
+
+blockquote {
+  font-size: 11px;
+  color: #777;
+  margin-left: 2px;
+  padding-left: 10px;
+  border-left: 5px solid #ddd;
+}
+
+code, pre {
+  font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace;
+  color: #666;
+  font-size: 12px;
+}
+
+pre.literal-block {
+  margin: 10px;
+  background: #eee;
+  padding: 6px 8px;
+}
+
+code strong {
+  color: #930;
+}
+
+hr {
+  clear: both;
+  color: #eee;
+  background-color: #eee;
+  height: 1px;
+  border: none;
+  margin: 0;
+  padding: 0;
+  font-size: 1px;
+  line-height: 1px;
+}
+
+/* TEXT STYLES & MODIFIERS */
+
 .small {
+  font-size: 11px;
+}
+
+.tiny {
+  font-size: 10px;
+}
+
+p.tiny {
+  margin-top: -2px;
+}
+
+.mini {
+  font-size: 10px;
+}
+
+p.mini {
+  margin-top: -3px;
+}
+
+.help, p.help, form p.help {
+  color: $dim-text-color;
   font-size: 12px;
 }
 
-.changeform-object-tools {
-  text-align: right;
-  overflow: auto;
+.help-tooltip {
+  cursor: help;
+}
+
+p img, h1 img, h2 img, h3 img, h4 img, td img {
+  vertical-align: middle;
 }
 
-ul.object-tools {
-  @extend .clear-list;
-  margin-bottom: 20px !important;
+.quiet, a.quiet:link, a.quiet:visited {
+  font-weight: normal;
+}
+
+.float-right {
   float: right;
+}
 
-  li {
-    margin-top: 10px;
-    text-align: right;
-
-    &:first-child {
-      margin-top: 0;
-    }
-
-    a {
-      display: inline-block;
-      background-color: $button-background-color;
-      padding: 8px;
-      border-radius: 4px;
-
-      &.addlink:before {
-        @include font-icon;
-        color: $button-text-color;
-        font-size: 13px;
-        content: $icon-add;
-      }
-
-      &, &:visited, &:hover {
-        color: $button-text-color;
-      }
-
-      &:hover {
-        background-color: $button-hover-background-color;
-        color: $button-hover-text-color;
-
-        &.addlink:before {
-          color: $button-hover-text-color;
-        }
-      }
-
-      &:active {
-        background-color: $button-active-background-color;
-        color: $button-active-text-color;
-
-        &.addlink:before {
-          color: $button-active-text-color;
-        }
-      }
-    }
-  }
+.float-left {
+  float: left;
+}
 
-  &.horizontal {
-    line-height: 40px;
+.clear {
+  clear: both;
+}
 
-    li {
-      display: inline;
-      margin-top: 0;
-      line-height: normal;
-    }
-  }
+.align-left {
+  text-align: left;
 }
 
-.content-sidebar {
-  float: right;
-  width: 24em;
-  margin: 0 20px;
+.align-right {
+  text-align: right;
 }
 
-.dashboard .module table td a {
-  display: inline !important;
+.example {
+  margin: 10px 0;
+  padding: 5px 10px;
+  background: #efefef;
 }
 
-.dialog-confirm {
-  display: none;
+.nowrap {
+  white-space: nowrap;
 }
 
-.cleared {
-  clear: both;
+/* ACTION ICONS */
+
+.addlink {
+  vertical-align: middle;
+
+  &:before {
+    @include font-icon;
+    content: $icon-add3;
+    vertical-align: middle;
+    margin-right: 4px;
+  }
 }
 
-.loading-indicator {
-  font-size: 32px;
-  color: $button-hover-background-color;
-  -webkit-animation: spin 4s linear infinite;
-  -moz-animation: spin 4s linear infinite;
-  animation: spin 4s linear infinite;
+.changelink, .inlinechangelink {
+  vertical-align: middle;
 
-  &-wrapper {
-    text-align: center;
-    padding: 40px 0;
+  &:before {
+    @include font-icon;
+    content: $icon-edit;
+    vertical-align: middle;
+    margin-right: 4px;
+  }
+}
+
+.deletelink {
+  vertical-align: middle;
+
+  &:before {
+    @include font-icon;
+    content: $icon-cross;
+    vertical-align: middle;
+    margin-right: 4px;
   }
 }
-@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } }
-@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } }
-@keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } }
 
-img[src$="admin/img/icon-yes.gif"], img[src$="admin/img/icon-no.gif"], img[src$="admin/img/icon-unknown.gif"] {
+.inlineviewlink {
+  vertical-align: middle;
+
+  &:before {
+    @include font-icon;
+    content: $icon-open-external;
+    vertical-align: middle;
+    margin-right: 4px;
+  }
+}
+
+/* BOOLEAN ICONS */
+
+img[src$="admin/img/icon-yes.gif"], img[src$="admin/img/icon-yes.svg"],
+img[src$="admin/img/icon-no.gif"], img[src$="admin/img/icon-no.svg"],
+img[src$="admin/img/icon-unknown.gif"], img[src$="admin/img/icon-unknown.svg"] {
   display: none;
 
   + span {
@@ -132,10 +273,24 @@ img[src$="admin/img/icon-yes.gif"], img[src$="admin/img/icon-no.gif"], img[src$=
   }
 }
 
-img[src$="admin/img/icon-yes.gif"] + span {
+img[src$="admin/img/icon-yes.gif"] + span, img[src$="admin/img/icon-yes.svg"] + span {
   color: $success-text-color;
 }
 
-img[src$="admin/img/icon-no.gif"] + span {
+img[src$="admin/img/icon-no.gif"] + span, img[src$="admin/img/icon-no.svg"] + span {
   color: $warning-text-color;
-}
+}
+
+/* LOADING INDOCATOR */
+
+.loading-indicator {
+  display: inline-block;
+  font-size: 32px;
+  color: $button-hover-background-color;
+  animation: spin 4s linear infinite;
+
+  &-wrapper {
+    text-align: center;
+    padding: 40px 0;
+  }
+}

+ 240 - 13
jet/static/jet/css/_dashboard.scss

@@ -1,11 +1,146 @@
 @import "globals";
 
+/* DASHBOARD */
+
 .dashboard {
-  min-height: 100%;
+  .module {
+    margin-bottom: 10px;
+
+    table {
+      th {
+        width: 100%;
+      }
+
+      td {
+        white-space: nowrap;
+
+        a {
+          display: block;
+          padding-right: .6em;
+        }
+      }
+    }
+  }
+
+  #content {
+    max-width: 600px;
+
+    @include for-mobile {
+      max-width: none;
+    }
+  }
+
+  &.jet #content {
+    max-width: none;
+  }
+
+  .breadcrumbs {
+    margin-bottom: 20px;
+
+    @include for-mobile {
+      display: none;
+    }
+  }
+}
+
+/* RECENT ACTIONS MODULE */
+
+#recent-actions-module {
+  > h2 {
+    padding: 6px;
+    text-transform: uppercase;
+    font-size: 11px;
+    font-weight: bold;
+    margin: 0;
+  }
+
+  > h3 {
+    display: none;
+  }
+}
+
+.module ul.actionlist {
+  padding: 0;
+  margin: 0 0 2px 0;
+  border-collapse: collapse;
+  background: $content-background-color;
+  border-radius: 4px;
+  overflow-x: auto;
+  box-shadow: 0 2px 0 0 $content-border2-color;
+}
+
+ul.actionlist li {
+  padding: 8px;
+  list-style-type: none;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  border-bottom: 1px solid $content-border-color;
+}
+
+/* JET DASHBOARD */
+
+.dashboard {
+  &-container {
+    min-height: 100%;
+  }
 
   @for $i from 1 through 5 {
-    &.columns_#{$i} &-column-wrapper {
+    &-container.columns_#{$i} &-column-wrapper {
       width: (100% / $i);
+
+      @include for-mobile {
+        width: 100%;
+      }
+    }
+  }
+
+  &-tools {
+    position: absolute;
+    top: 20px;
+    right: 20px + 175px + 20px;
+
+    @include for-mobile {
+      display: none;
+      position: static;
+      margin: 10px 20px 0 20px;
+      padding: 10px;
+      background: $content-background-color;
+      border-radius: 5px;
+    }
+
+    @include for-phone {
+      margin: 10px 10px 0 10px;
+    }
+
+    .button {
+      vertical-align: middle;
+    }
+
+    &.visible {
+      @include for-mobile {
+        display: block;
+      }
+    }
+
+    &-toggle {
+      &-icon {
+        vertical-align: middle;
+      }
+
+      &-container {
+        display: none;
+        margin: 20px 20px 0 20px;
+        text-align: right;
+
+        @include for-mobile {
+          display: block;
+        }
+
+        @include for-phone {
+          margin: 10px 10px 0 10px;
+        }
+      }
     }
   }
 
@@ -15,6 +150,11 @@
     min-height: 100px;
     border-radius: 4px;
 
+    @include for-mobile {
+      margin-left: 0;
+      min-height: 0;
+    }
+
     &-wrapper {
       float: left;
       min-width: 200px;
@@ -35,10 +175,18 @@
     background: $background-color;
     border-radius: 4px;
     margin-bottom: 20px;
-    @include transition(background $transitions-duration);
+    transition: background $transitions-duration;
+
+    @include for-mobile {
+      margin-bottom: 10px;
+    }
 
     &:last-child {
       margin-bottom: 0;
+
+      @include for-mobile {
+        margin-bottom: 10px;
+      }
     }
 
     &.collapsed {
@@ -66,6 +214,10 @@
       &-drag {
         float: right;
         line-height: 30px !important;
+
+        html.touchevents & {
+          display: none;
+        }
       }
 
       &-collapse-button {
@@ -79,6 +231,11 @@
         font-size: 13px;
         vertical-align: middle;
         visibility: hidden;
+
+        html.touchevents & {
+          visibility: visible;
+          float: right;
+        }
       }
 
       &:hover &-buttons {
@@ -109,12 +266,6 @@
           font-size: 13px;
           padding: 8px;
 
-          &.nowrap {
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-          }
-
           &.contrast {
             background: $content-contrast2-background-color;
             font-size: 12px;
@@ -196,6 +347,13 @@
         color: $dim-text-color;
       }
 
+      .nowrap {
+        display: block;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+
       canvas {
         .chart {
           &-fillColor {
@@ -227,6 +385,11 @@
           }
         }
       }
+
+      table {
+        width: 100%;
+        box-shadow: none;
+      }
     }
 
     &-collapse .icon-arrow-up {
@@ -252,13 +415,77 @@
 }
 
 .add-dashboard {
-  & + .select2 {
-    border-radius: 4px 0 0 4px !important;
-    background-color: $input-background-color;
+  + .select2 {
+    background-color: transparent;
+
+    @include for-mobile {
+      min-width: 160px;
+      max-width: 160px;
+    }
+
+    @include for-phone {
+      width: 100% !important;
+      max-width: none;
+      margin-bottom: 5px;
+    }
+
+    .select2-selection {
+      border-radius: 4px 0 0 4px !important;
+      border-width: 0;
+
+      @include for-mobile {
+        border-radius: 4px !important;
+        border-width: 1px;
+      }
+    }
   }
 
   &-link {
     border-radius: 0 4px 4px 0 !important;
     padding: 0 10px !important;
+
+    @include for-mobile {
+      margin-left: 6px;
+      border-radius: 4px !important;
+      margin-right: 5px;
+    }
+
+    @include for-phone {
+      margin-left: 0;
+    }
+
+    &-icon {
+      vertical-align: middle;
+    }
+
+    &-label {
+      display: none;
+      vertical-align: middle;
+      margin-left: 4px;
+    }
   }
-}
+}
+
+.reset-dashboard-link {
+  @include for-mobile {
+    float: right;
+  }
+
+  @include for-phone {
+    float: none;
+  }
+
+  &-icon {
+    vertical-align: middle;
+  }
+
+  &-label {
+    display: none;
+    vertical-align: middle;
+    margin-left: 6px;
+
+    @include for-mobile {
+      display: inline;
+    }
+  }
+}

+ 91 - 0
jet/static/jet/css/_delete-confirmation.scss

@@ -0,0 +1,91 @@
+@import "globals";
+
+.delete-confirmation {
+  #content > h1 + p + h2 + ul {
+    background: $warning-color;
+    color: $warning-text-color;
+    border-radius: 4px;
+    padding: 20px;
+    list-style-type: none;
+    margin: 0;
+
+    li {
+      list-style: none;
+      line-height: 1.8;
+    }
+  }
+
+  #content > ul:nth-of-type(2), #content > h1 + p + ul {
+    background: $content-background-color;
+    border-radius: 4px;
+    box-shadow: 0 2px 0 0 $content-border2-color;
+
+    &, ul {
+      list-style-type: none;
+      margin: 0;
+      padding: 0;
+
+      li {
+        list-style: disc;
+        line-height: 1.8;
+      }
+    }
+
+    ul {
+      margin-left: 20px;
+    }
+
+    > li {
+      padding: 8px;
+      border-bottom: 1px solid $content-border-color;
+      font-size: 13px;
+      list-style: none;
+
+      &:last-child {
+        border-bottom: 0;
+      }
+    }
+  }
+
+  #content form {
+    margin-top: 20px;
+
+    input[type="submit"] {
+      background-color: $danger-button-background-color;
+      color: $danger-button-text-color;
+      font-size: 12px;
+      font-weight: lighter;
+      padding: 0 20px;
+      text-transform: uppercase;
+      margin-bottom: 5px;
+
+      @include for-mobile {
+        display: block;
+        width: 100%;
+      }
+
+      &:hover, &:focus {
+        background-color: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
+
+      &:active {
+        background-color: $button-active-background-color;
+        color: $button-active-text-color;
+      }
+    }
+
+    .button {
+      vertical-align: middle;
+      margin-left: 10px;
+      margin-bottom: 5px;
+      box-sizing: border-box;
+
+      @include for-mobile {
+        margin-left: 0;
+        display: block;
+        width: 100%;
+      }
+    }
+  }
+}

+ 0 - 68
jet/static/jet/css/_delete.scss

@@ -1,68 +0,0 @@
-@import "globals";
-
-.delete {
-  &-summary {
-    background: $warning-color;
-    color: $warning-text-color;
-    border-radius: 4px;
-    padding: 20px;
-    margin-bottom: 20px;
-
-    h2 {
-      font-size: 14px;
-      font-weight: bold;
-      margin: 0 0 10px 0;
-    }
-
-    ul {
-      @extend .clear-list;
-    }
-
-    &-buttons {
-      float: right;
-    }
-  }
-
-  &-objects {
-    background: $content-background-color;
-    border-radius: 4px;
-    box-shadow: 0 2px 0 0 $content-border2-color;
-
-    &-list {
-      @extend .clear-list;
-
-      &-item {
-        border-bottom: 1px solid $content-border-color;
-        font-size: 13px;
-
-        &:last-child {
-          border-bottom: 0;
-        }
-
-        &-row {
-          padding: 8px;
-
-          &-collapse {
-            float: right;
-
-            span {
-              vertical-align: middle;
-              font-weight: bold;
-              font-size: 16px;
-            }
-          }
-        }
-
-        &-collapsable {
-          background-color: $content-contrast3-background-color;
-          padding: 20px 20px 20px 0;
-          display: none;
-
-          &-list {
-            list-style-type: disc;
-          }
-        }
-      }
-    }
-  }
-}

+ 77 - 128
jet/static/jet/css/_forms.scss

@@ -1,80 +1,45 @@
 @import "globals";
 
-.base_input {
-  border: 0;
-  border-radius: 4px;
-  font-size: 13px;
-  height: 32px;
-  white-space: nowrap;
-  outline: 0;
-  box-sizing: border-box;
-  margin: 0;
-  @include transition(background $transitions-duration, box-shadow $transitions-duration, border $transitions-duration);
-}
-
-.input {
-  @extend .base_input;
-  @include placeholder {
-    color: $input-placeholder-color;
-  }
-  background-color: $input-background-color;
-  color: $input-text-color;
-  border: 1px solid $input-border-color;
-  padding: 0 12px;
-
-  &:focus {
-    box-shadow: 0 0 4px 0 $input-shadow-color;
-    border-color: $input-background-color;
-  }
-}
+/* FORM BUTTONS */
 
-.background-form .input {
-  @extend .input;
-  background-color: $background-input-background-color;
-  color: $background-input-text-color;
-  border-color: $background-input-border-color;
-}
-
-.button {
+.button, input[type="submit"], input[type="button"], .object-tools a {
   &, &:visited, &:hover {
-    @extend .base_input;
-    font-weight: lighter;
-    font-size: 12px;
-    text-align: center;
-    background-color: $primary-button-background-color;
-    color: $primary-button-text-color;
-    padding: 0 20px;
     display: inline-block;
-    text-transform: uppercase;
-  }
-
-  &.button-secondary {
     background-color: $button-background-color;
     color: $button-text-color;
-    text-transform: none;
+    border: 0;
+    border-radius: 4px;
+    height: 32px;
+    line-height: 32px;
+    outline: 0;
+    font-size: 12px;
     font-weight: normal;
+    text-align: center;
+    padding: 0 10px;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    max-width: 100%;
+    appearance: none;
+    transition: background $transitions-duration;
   }
 
-  &.button-red {
-    background-color: $danger-button-background-color;
-    color: $danger-button-text-color;
-  }
-
-  &.button-background {
-    background-color: $background-button-background-color;
-    color: $background-button-text-color;
+  &.default {
+    font-weight: lighter;
+    background-color: $primary-button-background-color;
+    color: $primary-button-text-color;
+    text-transform: uppercase;
+    margin: 0 8px 0 0;
+    padding: 0 20px;
   }
 
-  &.button-transparent {
+  &.transparent {
     background-color: transparent;
-    color: $text-color;
-    padding: 0 10px;
   }
 
-  &:hover {
+  &:hover, &:focus {
     background-color: $button-hover-background-color;
     color: $button-hover-text-color;
-    font-weight: lighter;
   }
 
   &:active {
@@ -83,9 +48,55 @@
   }
 }
 
+.button[disabled], input[type=submit][disabled], input[type=button][disabled] {
+  opacity: 0.4;
+}
+
+input[type="text"], input[type="email"], input[type="password"], input[type="url"], input[type="number"], textarea, select, .vTextField {
+  border-radius: 4px;
+  font-size: 13px;
+  height: 32px;
+  white-space: nowrap;
+  outline: 0;
+  box-sizing: border-box;
+  margin: 0;
+  background-color: $input-background-color;
+  color: $input-text-color;
+  border: 1px solid $input-border-color;
+  padding: 0 12px;
+  appearance: none;
+  transition: background $transitions-duration, box-shadow $transitions-duration, border $transitions-duration;
+
+  //noinspection CssInvalidPseudoSelector
+  &::placeholder {
+    color: $input-placeholder-color;
+  }
+
+  @include for-mobile {
+    fieldset.module & {
+      box-shadow: inset 0 2px 6px 0 rgba(0, 0, 0, 0.04)
+    }
+  }
+
+  &:focus, fieldset.module &:focus {
+    box-shadow: 0 0 4px 0 $input-shadow-color;
+    border-color: $input-background-color;
+  }
+}
+
+textarea {
+  height: auto;
+  line-height: normal;
+  padding: 12px;
+  white-space: pre-wrap;
+  vertical-align: top;
+}
+
 .segmented-button {
   &, &:visited, &:hover {
-    @extend .base_input;
+    border: 0;
+    height: 32px;
+    line-height: 32px;
     font-size: 12px;
     text-align: center;
     background-color: $button-background-color;
@@ -94,9 +105,10 @@
     display: inline-block;
     text-transform: none;
     border-radius: 0;
+    transition: background $transitions-duration;
   }
 
-  &:hover {
+  &:hover, &:focus {
     background-color: $button-hover-background-color;
     color: $button-hover-text-color;
   }
@@ -121,26 +133,6 @@
   }
 }
 
-a.button, a.segmented-button {
-  line-height: 32px;
-}
-
-input[type="text"], input[type="email"], input[type="password"], input[type="url"], input[type="number"] {
-  @extend .input;
-}
-
-textarea {
-  @extend .input;
-  height: auto;
-  line-height: normal;
-  padding: 12px;
-  white-space: pre-wrap;
-}
-
-.button, input[type="submit"], input[type="button"] {
-  @extend .button;
-}
-
 input[type=checkbox] {
   display: none;
 
@@ -150,7 +142,6 @@ input[type=checkbox] {
 
   + label:before {
     @include font-icon;
-
     color: $input-icon-color;
     font-size: 12px;
     content: $icon-checkbox-outline;
@@ -166,50 +157,8 @@ input[type=checkbox] {
   }
 }
 
-.form-row {
-  .vDateField, .vTimeField {
-    border-radius: 4px 0 0 4px !important;
-
-    &-link {
-      vertical-align: top;
-      display: inline-block;
-
-      span {
-        width: 32px;
-        height: 32px;
-        line-height: 32px !important;
-        background-color: $button-background-color;
-        color: $button-text-color;
-        display: inline-block;
-        vertical-align: middle;
-        text-align: center;
-        border-radius: 0 4px 4px 0;
-      }
-
-      &:hover span {
-        background-color: $button-hover-background-color;
-        color: $button-hover-text-color;
-      }
-    }
-  }
-
-  .vDateField-link + .vTimeField {
-    margin-left: 10px;
-  }
-
-  label.required {
-    font-weight: bold;
-
-    &:after {
-      content: '*';
-    }
-  }
-
-  select {
-    min-width: 200px;
-  }
-}
+/* SELECTOR */
 
-.empty-form {
+.selector {
   display: none;
-}
+}

+ 1 - 1
jet/static/jet/css/_globals.scss

@@ -1,3 +1,3 @@
 @import "variables";
 @import "helpers";
-@import "icons/variables";
+@import "icons/variables";

+ 213 - 0
jet/static/jet/css/_header.scss

@@ -0,0 +1,213 @@
+@import "globals";
+
+/* HEADER */
+
+#branding {
+  display: none;
+  background-color: $sidebar-contrast-background-color;
+  color: $sidebar-contrast-text-color;
+  padding: 14px;
+  text-align: center;
+
+  &.initialized {
+    display: block;
+  }
+
+  h1, h2 {
+    padding: 0;
+    margin: 0;
+    text-transform: uppercase;
+    font-size: 11px;
+  }
+
+  a, a:visited, a:hover {
+    color: $sidebar-contrast-text-color;
+  }
+
+  a:hover {
+    color: $sidebar-hover-action-color;
+  }
+}
+
+#user-tools {
+  display: none;
+
+  &.initialized {
+    display: block;
+  }
+}
+
+.user-tools {
+  position: relative;
+
+  ul {
+    position: absolute;
+    top: $top-height - 12px;
+    right: 20px;
+    border: 1px solid $top-border-color;
+    border-radius: 4px;
+    font-size: 12px;
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    display: inline-block;
+    width: 175px;
+    z-index: 1;
+
+    @include for-mobile {
+      position: fixed;
+      top: 0;
+      right: 0;
+      z-index: 4;
+      width: auto;
+      max-width: 200px;
+      color: $sidebar-link-color;
+      border: 0;
+      border-left: 1px solid $sidebar-contrast-background-color;
+      border-radius: 0;
+      transform: none;
+      transition: transform $transitions-duration;
+
+      body.scroll-to-bottom & {
+        transform: translate3d(0, -100%, 0);
+      }
+    }
+
+    &.opened {
+      background-color: $top-dropdown-background-color;
+      border-color: transparent;
+      color: $top-dropdown-text-color;
+
+      @include for-mobile {
+        border-radius: 0 0 0 4px;
+        border: 0;
+      }
+    }
+
+    li {
+      display: block;
+      list-style-type: none;
+      margin: 0;
+      padding: 0;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+
+    li.user-tools-welcome-msg {
+      font-weight: bold;
+      padding: 0 10px 0 14px;
+      line-height: 30px;
+
+      @include for-mobile {
+        padding-left: 18px;
+        line-height: $sidebar-header-height;
+      }
+
+      &:before {
+        @include font-icon;
+        content: $icon-arrow-down;
+        font-weight: normal;
+        float: right;
+        color: #47bac1;
+        font-size: 24px;
+        vertical-align: middle;
+        line-height: 30px;
+        transition: color $transitions-duration;
+        margin-left: 5px;
+
+        @include for-mobile {
+          line-height: $sidebar-header-height;
+          font-size: 20px;
+          font-weight: bold;
+        }
+      }
+    }
+
+    &.opened .user-tools-welcome-msg {
+      border-bottom: 1px solid $top-dropdown-border-color;
+
+      &:before {
+        color: $top-dropdown-icon-color;
+        transform: rotate(180deg);
+      }
+    }
+
+    li.user-tools-link {
+      display: none;
+
+      a, a:visited, a:hover {
+        display: block;
+        line-height: 30px;
+        padding: 0 14px;
+        color: $top-dropdown-link-color;
+        text-decoration: none;
+
+        @include for-mobile {
+          line-height: $sidebar-header-height;
+        }
+      }
+
+      a:hover {
+        color: $top-dropdown-hover-link-color;
+        text-decoration: underline;
+      }
+    }
+
+    &.opened li.user-tools-link {
+      display: block;
+    }
+
+    li.user-tools-contrast-block {
+      display: none;
+      padding: 8px 14px;
+      background: $top-dropdown-contrast-background-color;
+      color: $top-dropdown-contrast-text-color;
+      white-space: normal;
+    }
+
+    &.opened li.user-tools-contrast-block {
+      display: block;
+    }
+  }
+
+  &-contrast-block {
+    &-title {
+      text-transform: uppercase;
+      font-size: 10px;
+      font-weight: bold;
+      margin-bottom: 6px;
+    }
+  }
+
+  &-theme-link {
+    display: inline-block;
+    margin: 0 5px 5px 0;
+    width: 14px;
+    height: 14px;
+    border: 1px solid $top-dropdown-contrast-background-color;
+    border-radius: 3px;
+
+    @include for-mobile {
+      width: 24px;
+      height: 24px;
+      margin: 0 8px 8px 0;
+    }
+
+    &:last-child {
+      margin-right: 0;
+    }
+
+    &.selected {
+      box-shadow: 0 0 1px 1px $top-dropdown-selected-color;
+    }
+  }
+}
+
+.theme-chooser {
+  display: none;
+
+  &.initialized {
+    display: block;
+  }
+}

+ 11 - 55
jet/static/jet/css/_helpers.scss

@@ -1,5 +1,5 @@
 .hidden {
-    display: none;
+  display: none;
 }
 
 .clear-list {
@@ -47,69 +47,25 @@
   width: 100% !important;
 }
 
-@mixin placeholder {
-  &::-webkit-input-placeholder {@content}
-  &:-moz-placeholder           {@content}
-  &::-moz-placeholder          {@content}
-  &:-ms-input-placeholder      {@content}
-}
-
-@mixin transition-all($duration) {
-  -webkit-transition: all $duration;
-  -moz-transition: all $duration;
-  -o-transition: all $duration;
-  transition: all $duration;
-}
-
-@function prefix($property, $prefixes: (webkit moz o ms)) {
-  $vendor-prefixed-properties: transform background-clip background-size;
-  $result: ();
-  @each $prefix in $prefixes {
-    @if index($vendor-prefixed-properties, $property) {
-      $property: -#{$prefix}-#{$property}
-    }
-    $result: append($result, $property);
+@mixin for-width($width) {
+  @media only screen and (max-width: $width) {
+    @content;
   }
-  @return $result;
 }
 
-@function trans-prefix($transition, $prefix: moz) {
-  $prefixed: ();
-  @each $trans in $transition {
-    $prop-name: nth($trans, 1);
-    $vendor-prop-name: prefix($prop-name, $prefix);
-    $prop-vals: nth($trans, 2);
-    $prefixed: append($prefixed, ($vendor-prop-name $prop-vals), comma);
+@mixin for-mobile {
+  @include for-width($mobile-max-width) {
+    @content;
   }
-
-  @return $prefixed;
 }
 
-@mixin transition($values...) {
-  $transitions: ();
-  @each $declaration in $values {
-    $prop: nth($declaration, 1);
-    $prop-opts: ();
-    $length: length($declaration);
-    @for $i from 2 through $length {
-      $prop-opts: append($prop-opts, nth($declaration, $i));
-    }
-    $trans: ($prop, $prop-opts);
-    $transitions: append($transitions, $trans, comma);
+@mixin for-phone {
+  @include for-width($phone-max-width) {
+    @content;
   }
-
-  -webkit-transition: trans-prefix($transitions, webkit);
-  -moz-transition: trans-prefix($transitions, moz);
-  -o-transition: trans-prefix($transitions, o);
-  transition: $values;
 }
 
-@mixin transform($transform) {
-  -webkit-transform: $transform;
-  -moz-transform: $transform;
-  -o-transform: $transform;
-  transform: $transform;
-}
+@keyframes spin { 100% { transform: rotate(360deg); } }
 
 @mixin font-icon {
   font-family: 'jet-icons';

+ 91 - 64
jet/static/jet/css/_login.scss

@@ -1,90 +1,117 @@
 @import "globals";
 
-.login {
-  $width: 400px;
-  $expected-height: 230px;
+/* LOGIN FORM */
 
+body.login {
   background: $login-background-color;
-  position: relative;
+  padding: 100px 30px 30px 30px;
 
-  &-title {
-    width: 100%;
-    color: $login-title-text-color;
-    font-size: 36px;
-    text-transform: uppercase;
-    text-align: center;
-    position: absolute;
-    top: 50%;
-    margin-top: -($expected-height / 2) - 60px;
-
-    .bright {
-      color: $login-title-contrast-text-color;
-      font-weight: bold;
-    }
+  @include for-phone {
+    padding: 30px 10px 10px 10px;
   }
 
-  &-container {
+  #container {
+    background: $login-content-background-color;
     border-radius: 4px;
-    width: $width;
-    overflow: hidden;
-    position: absolute;
-    top: 50%;
-    left: 50%;
-    margin-left: -($width / 2);
-    margin-top: -($expected-height / 2);
-
-    &-header {
-      background: $login-header-background-color;
-      color: $login-header-text-color;
-      text-transform: uppercase;
-      padding: 10px;
-      font-size: 11px;
-      font-weight: bold;
-    }
+    min-height: 0;
+    padding: 0;
+    margin-left: auto;
+    margin-right: auto;
+    width: 400px;
 
-    &-content {
-      background: $login-content-background-color;
-      height: 100%;
-      padding: 30px;
+    @include for-phone {
+      width: 100%;
     }
+  }
 
-    &-submit-row {
-      text-align: center;
-      margin-top: 20px;
-    }
+  #header {
+    background: $login-header-background-color;
+    color: $login-header-text-color;
+    text-transform: uppercase;
+    font-size: 11px;
+    font-weight: bold;
+    border-radius: 4px 4px 0 0;
+  }
+
+  #content {
+    padding: 30px;
+  }
+
+  .sidebar {
+    display: none;
+  }
+
+  .sidebar-header {
+    display: none;
+  }
+
+  .breadcrumbs {
+    display: none;
+  }
+
+  #content-main {
+    width: 100%;
   }
-}
 
-.login-form {
   .form-row {
-    padding: 6px 0;
-    clear: both;
+    padding: 4px;
+    float: left;
+    width: 100%;
 
     label {
-      display: block;
-      padding: 6px 10px 0 0;
-      float: left;
-      width: 130px;
-      word-wrap: break-word;
-    }
+      padding-right: 0.5em;
+      line-height: 2em;
+      font-size: 1em;
+      clear: both;
 
-    &.errors label {
-      color: $error-text-color;
+      &.required:after {
+        content: '';
+      }
     }
 
-    input[type="text"], input[type="password"] {
-      width: 170px;
+    #id_username, #id_password {
+      clear: both;
+      padding: 6px;
+      width: 100%;
+      box-sizing: border-box;
     }
+  }
 
-    .errorlist {
-      @extend .clear-list;
-      @extend .small;
-      color: $error-text-color;
-    }
+  span.help {
+    font-size: 10px;
+    display: block;
   }
 
   .submit-row {
-    margin-top: 20px;
+    clear: both;
+    padding: 20px 0 0 0;
+    margin: 0;
     text-align: center;
+
+    input[type="submit"] {
+      font-size: 12px;
+      font-weight: lighter;
+      background-color: $primary-button-background-color;
+      color: $primary-button-text-color;
+      text-transform: uppercase;
+
+      &:hover, &:focus {
+        background-color: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
+
+      &:active {
+        background-color: $button-active-background-color;
+        color: $button-active-text-color;
+      }
+    }
   }
-}
+
+  .password-reset-link {
+    text-align: center;
+  }
+
+  #footer {
+    padding: 0;
+  }
+}

+ 83 - 17
jet/static/jet/css/_messages.scss

@@ -1,29 +1,95 @@
 @import "globals";
 
-.messagelist {
-  @extend .clear-list;
+/* MESSAGES & ERRORS */
 
-  @mixin message-item {
+ul.messagelist {
+  padding: 0;
+  margin: 0;
+
+  li {
+    display: block;
     margin: 0 20px 10px 20px;
     border-radius: 6px;
-    padding: 10px
+    padding: 10px;
+
+    &.success {
+      background: $success-color;
+      color: $success-text-color;
+    }
+
+    &.warning, &.error {
+      background: $warning-color;
+      color: $warning-text-color;
+    }
+
+    &.info, &.debug {
+      background: $info-color;
+      color: $info-text-color;
+    }
   }
+}
+
+.errornote {
+  display: block;
+  margin: 0 0 10px 0;
+  border-radius: 6px;
+  padding: 10px;
+  background: $warning-color;
+  color: $warning-text-color;
+}
+
+ul.errorlist {
+  margin: 0 0 4px;
+  padding: 0;
+  color: #ba2121;
+  background: #fff;
 
-  .warning, .error {
-    @include message-item;
-    background: $warning-color;
-    color: $warning-text-color;
+  li {
+    font-size: 13px;
+    display: block;
+    margin-bottom: 4px;
+
+    &:first-child {
+      margin-top: 0;
+    }
+
+    a {
+      color: inherit;
+      text-decoration: underline;
+    }
   }
 
-  .info, .debug {
-    @include message-item;
-    background: $info-color;
-    color: $info-text-color;
+  td & {
+    margin: 0;
+    padding: 0;
+
+    li {
+      margin: 0;
+    }
   }
+}
 
-  .success {
-    @include message-item;
-    background: $success-color;
-    color: $success-text-color;
+.form-row.errors {
+  ul.errorlist li {
+    padding-left: 0;
   }
-}
+}
+
+div.system-message {
+    background: #ffc;
+    margin: 10px;
+    padding: 6px 8px;
+    font-size: .8em;
+}
+
+div.system-message p.system-message-title {
+    padding: 4px 5px 4px 25px;
+    margin: 0;
+    color: #c11;
+    background: #ffefef url(../img/icon-no.svg) 5px 5px no-repeat;
+}
+
+.description {
+    font-size: 12px;
+    padding: 5px 0 0 12px;
+}

+ 55 - 0
jet/static/jet/css/_modules.scss

@@ -0,0 +1,55 @@
+@import "globals";
+
+/* MODULES */
+
+fieldset.module {
+  background-color: $content-background-color;
+  border-radius: 4px;
+  padding: 20px;
+  border: 0;
+
+  @include for-mobile {
+    padding: 10px;
+  }
+
+  @include for-phone {
+    padding: 5px;
+  }
+}
+
+.module {
+  p, ul, h3, h4, dl, pre {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+
+  blockquote {
+    margin-left: 12px;
+  }
+
+  ul, .ol {
+    margin-left: 1.5em;
+  }
+
+  h3 {
+    margin-top: .6em;
+  }
+
+  table {
+    border-collapse: collapse;
+  }
+}
+
+.module h2, .module caption, .inline-group h2 {
+  padding: 6px;
+  text-align: left;
+  text-transform: uppercase;
+  font-size: 11px;
+  font-weight: bold;
+
+  a {
+    color: $text-color;
+    font-size: 11px;
+    font-weight: bold;
+  }
+}

+ 49 - 0
jet/static/jet/css/_object-tools.scss

@@ -0,0 +1,49 @@
+@import "globals";
+
+/* OBJECT TOOLS */
+
+.object-tools {
+  display: block;
+  text-align: right;
+  padding: 0;
+  margin: 0 0 20px 0;
+
+  @include for-mobile {
+    text-align: left;
+  }
+
+  .form-row & {
+    margin-top: 5px;
+    margin-bottom: 5px;
+    float: none;
+    height: 2em;
+    padding-left: 3.5em;
+  }
+
+  li {
+    display: inline-block;
+    margin-left: 5px;
+    margin-bottom: 5px;
+
+    @include for-mobile {
+      margin-left: 0;
+      margin-right: 5px;
+    }
+  }
+
+  a.addlink {
+    &:before {
+      @include font-icon;
+      color: $button-text-color;
+      font-size: 13px;
+      content: $icon-add;
+      vertical-align: middle;
+      margin-top: -3px;
+      margin-right: 3px;
+    }
+
+    &:hover:before {
+      color: $button-hover-text-color;
+    }
+  }
+}

+ 40 - 7
jet/static/jet/css/_relatedpopup.scss

@@ -1,5 +1,7 @@
 @import "globals";
 
+/* POPUP */
+
 .related-popup {
   position: absolute;
   top: 0;
@@ -7,14 +9,23 @@
   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;
+  -webkit-overflow-scrolling: touch;
+  overflow-y: scroll;
+
+  @include for-mobile {
+    padding-left: 0;
+  }
+
+  iframe {
+    border: 0;
+    width: 100%;
+    height: 100%;
+  }
 
   &-container {
     display: none;
@@ -24,7 +35,7 @@
     left: 0;
     bottom: 0;
     right: 0;
-    z-index: 3;
+    z-index: 5;
 
     .loading-indicator {
       display: none;
@@ -35,6 +46,7 @@
       left: 50%;
       margin-left: -48px;
       margin-top: -48px;
+      animation: spin 4s linear infinite;
     }
   }
 
@@ -54,18 +66,39 @@
       box-sizing: border-box;
       text-transform: uppercase;
       border-radius: 6px 0 0 6px;
-      @include transition(background-color $transitions-duration, color $transitions-duration);
+      transition: background-color $transitions-duration, color $transitions-duration;
+
+      @include for-mobile {
+        margin-left: 0;
+        top: auto;
+        bottom: 10px;
+        left: 10px;
+        width: auto;
+        padding: 10px;
+        border-radius: 6px;
+      }
     }
 
-    &:hover {
+    &:hover, &:focus {
       background: $background-color;
       color: $text-color;
+
+      @include for-mobile {
+        background: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
     }
 
-    span {
+    &-icon {
       vertical-align: middle;
       font-weight: bold;
       font-size: 18px;
     }
+
+    &-label {
+      @include for-mobile {
+        display: none;
+      }
+    }
   }
 }

+ 381 - 211
jet/static/jet/css/_sidebar.scss

@@ -1,246 +1,403 @@
 @import "globals";
 
 .sidebar {
+  position: fixed;
+  width: $sidebar-width;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 4;
   background-color: $sidebar-background-color;
-  @include transition(background-color $transitions-duration);
-
-  &-menu {
-    @extend .clear-list;
-    margin-bottom: 32px !important;
+  color: $sidebar-text-color;
+  transition: background-color $transitions-duration;
+  padding-bottom: 32px;
+
+  @include for-mobile {
+    min-width: 280px;
+    max-width: 360px;
+    width: 80%;
+    padding-bottom: 0;
+    transform: translate3d(-100%, 0, 0);
+    transition: transform $transitions-duration cubic-bezier(0, 0.5, 0.5, 1);
+  }
 
-    &-wrapper {
-      overflow: hidden;
-      height: 100%;
-      position: relative;
+  &.sidebar-opened {
+    @include for-mobile {
+      transform: none;
+      box-shadow: 0 0 30px 10px rgba(0, 0, 0, 0.2);
     }
+  }
 
-    &-item {
-      padding: 20px 24px;
-      border-bottom: 1px solid $sidebar-contrast-background-color;
-      @include transition(border-bottom-color $transitions-duration);
+  &-header {
+    display: none;
+    background-color: $sidebar-background-color;
+    color: $sidebar-text-color;
+    height: $sidebar-header-height;
+    line-height: $sidebar-header-height;
+    position: fixed;
+    top: 0;
+    right: 0;
+    left: 0;
+    z-index: 3;
+    transition: background-color $transitions-duration, transform $transitions-duration;
+
+    @include for-mobile {
+      display: block;
 
-      &:last-child {
-        border-bottom: 0;
+      body.scroll-to-bottom & {
+        transform: translate3d(0, -100%, 0);
       }
+    }
 
-      &.no-horizontal-padding {
-        padding-left: 0;
-        padding-right: 0;
+    &-menu {
+      &, &:visited, &:hover {
+        display: inline-block;
+        font-size: 14px;
+        text-transform: uppercase;
+        color: $sidebar-link-color;
+        line-height: $sidebar-header-height;
+        padding: 0 16px;
+        border-right: 1px solid $sidebar-contrast-background-color;
       }
 
       &-icon {
-        font-size: 18px;
+        font-size: 16px;
         vertical-align: middle;
-        margin-right: 6px;
-        color: $sidebar-icon-color;
-        @include transition(color $transitions-duration);
       }
+    }
+  }
 
-      &-link {
-        &, &:visited, &:hover {
-          color: $sidebar-link-color;
-          font-weight: bold;
-          overflow: hidden;
-          text-overflow: ellipsis;
-          white-space: nowrap;
-          width: 100%;
-          display: inline-block;
-          box-sizing: border-box;
-          @include transition(color $transitions-duration);
-        }
+  &-close {
+    display: none;
+    position: absolute;
+    right: 0;
+    padding: 4px;
+    margin: 12px 18px 0 12px;
+    background: $sidebar-contrast-background-color;
+    border-radius: 5px;
+    z-index: 1;
+
+    @include for-mobile {
+      display: inline-block;
+    }
 
-        &:hover {
-          color: $sidebar-hover-link-color;
-        }
+    &.popup {
+      background-color: $sidebar-popup-search-input-background-color;
+    }
+
+    &-icon {
+      color: $sidebar-action-color;
+      font-size: 28px;
+      font-weight: bold;
+      vertical-align: middle;
+    }
+
+    &.popup &-icon {
+      color: $sidebar-popup-search-input-text-color;
+    }
+  }
+
+  &-wrapper {
+    height: 100%;
+    overflow-y: auto;
+    -webkit-overflow-scrolling: touch;
+    position: relative;
+  }
+
+  &-section {
+    padding: 20px 0;
+    border-bottom: 1px solid $sidebar-contrast-background-color;
+    transition: border-bottom-color 0.3s;
+
+    @include for-mobile {
+      padding: 10px 0;
+    }
+
+    &:last-child, &.last {
+      border-bottom: 0;
+    }
+  }
+
+  &-title {
+    display: block;
+    color: $sidebar-text-color;
+    text-transform: uppercase;
+    font-size: 11px;
+    font-weight: bold;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    padding: 0 14px 0 24px;
+    margin-bottom: 10px;
+    transition: color $transitions-duration;
+
+    @include for-mobile {
+      padding: 12px 18px 12px 30px;
+      margin-bottom: 0;
+
+      html.touchevents & {
+        padding-left: 20px;
       }
+    }
 
-      &-title {
+    &-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 14px 0 24px;
-        width: 100%;
-        display: inline-block;
-        box-sizing: border-box;
-        @include transition(color $transitions-duration);
+        transition: color $transitions-duration;
+      }
 
-        &-icon {
-          float: right;
-          font-size: 14px;
-          font-weight: bold !important;
+      &:hover {
+        color: $sidebar-hover-title-action-item-color;
+      }
+    }
+  }
 
-          &, &:visited, &:hover {
-            color: $sidebar-title-action-color;
-            @include transition(color $transitions-duration);
-          }
+  &-link {
+    &, &:visited, &:hover {
+      display: block;
+      color: $sidebar-link-color;
+      padding: 8px 12px 8px 24px;
+      vertical-align: middle;
+      transition: color $transitions-duration, background-color $transitions-duration;
+      position: relative;
 
-          &:hover {
-            color: $sidebar-hover-title-action-item-color;
-          }
+      @include for-mobile {
+        padding: 12px 18px 12px 30px;
+
+        html.touchevents & {
+          padding-left: 20px;
         }
       }
 
-      &-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);
-        }
+      &.icon {
+        font-size: 11px;
+        text-transform: uppercase;
+      }
+    }
 
-        &:hover {
-          color: $sidebar-hover-title-action-item-color;
-        }
+    &:hover, &.selected {
+      color: $sidebar-hover-link-color;
+      background-color: $sidebar-hover-background-color;
+    }
+
+    &-icon {
+      font-size: 18px;
+      vertical-align: middle;
+      margin-right: 6px;
+      color: $sidebar-icon-color;
+      transition: color $transitions-duration;
+    }
+
+    &-label {
+      vertical-align: middle;
+      display: block;
+      transition: transform $transitions-duration;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+
+      html.touchevents .editing & {
+        transform: translate3d(20px, 0, 0);
       }
+    }
+  }
 
-      &-action {
-        &, &:visited, &:hover {
-          display: block;
-          color: $sidebar-action-color;
-          font-size: 11px;
-          text-align: center;
-          margin-top: 10px;
-          padding: 8px 0;
-          text-transform: uppercase;
-          @include transition(color $transitions-duration, background-color $transitions-duration);
-        }
+  &-center-link {
+    &, &:visited, &:hover {
+      display: block;
+      color: $sidebar-action-color;
+      font-size: 11px;
+      text-align: center;
+      padding: 8px 0;
+      text-transform: uppercase;
+      transition: color $transitions-duration, background-color $transitions-duration;
 
-        &:hover {
-          color: $sidebar-hover-action-color;
-          background-color: $sidebar-hover-background-color;
-        }
+      @include for-mobile {
+        padding: 12px 20px;
       }
+    }
+
+    &:hover {
+      color: $sidebar-hover-action-color;
+      background-color: $sidebar-hover-background-color;
+    }
+  }
+
+  &-left {
+    position: absolute;
+    left: 4px;
+
+    html.touchevents & {
+      top: 0;
+      bottom: 0;
+      transition: opacity $transitions-duration, transform $transitions-duration;
+    }
 
-      &-list {
-        @extend .clear-list;
+    &.collapsible {
+      display: none;
+
+      html.touchevents & {
+        display: inline-block;
+        width: 0;
+        opacity: 0;
+        transform: scale(0);
+        overflow: hidden;
+      }
+    }
 
-        .sidebar-menu-item-title + &:not(:empty), .sidebar-menu-item-link + &:not(:empty) {
-          margin-top: 10px !important;
+    &-pin, &-unpin {
+      &, &:visited, &:hover {
+        display: inline-block;
+        position: absolute;
+        top: 1px;
+        font-size: 14px;
+        color: $sidebar-action-color;
+        transition: color $transitions-duration;
+
+        html.touchevents & {
+          position: static;
+          padding: 6px;
+          margin-top: 6px;
+          font-size: 18px;
         }
+      }
 
-        &-item {
-          &.empty {
-            display: none;
-          }
+      &:hover {
+        color: $sidebar-hover-action-color;
+      }
+    }
 
-          &-icon {
-            font-size: 18px;
-            vertical-align: middle;
-            margin-right: 6px;
-            color: $sidebar-icon-color;
-            @include transition(color $transitions-duration);
-          }
+    .apps-list-pinned &-pin {
+      display: none;
+    }
 
-          &.compact &-icon {
-            font-size: 16px;
-          }
+    .apps-list &-unpin {
+      display: none;
+    }
+  }
 
-          &-link {
-            &, &:visited, &:hover {
-              display: block;
-              color: $sidebar-link-color;
-              overflow: hidden;
-              text-overflow: ellipsis;
-              white-space: nowrap;
-              padding: 8px 12px 8px 24px;
-              vertical-align: middle;
-              position: relative;
-              @include transition(color $transitions-duration, background-color $transitions-duration);
-            }
-
-            &:hover, &.hovered {
-              color: $sidebar-hover-link-color;
-              background-color: $sidebar-hover-background-color;
-            }
-
-            &-remove {
-              &, &:visited, &:hover {
-                position: relative;
-                float: right;
-                display: none;
-                color: $sidebar-action-color;
-                @include transition(color $transitions-duration);
-              }
-
-              &:hover {
-                color: $sidebar-hover-action-color;
-              }
-            }
-
-            &-pin, &-unpin {
-              &, &:visited, &:hover {
-                position: absolute;
-                display: none;
-                left: 4px;
-                font-size: 14px;
-                color: $sidebar-action-color;
-                @include transition(color $transitions-duration);
-              }
-
-              &:hover {
-                color: $sidebar-hover-action-color;
-              }
-            }
-
-            &:hover &-remove {
-              display: inline-block;
-            }
-          }
+  html.no-touchevents &-link:hover &-left.collapsible {
+    display: inline-block;
+  }
 
-          &:not(.pinned):hover &-link-pin {
-            display: inline-block;
-          }
+  html.touchevents .editing &-left.collapsible {
+    opacity: 1;
+    transform: scale(1);
+    width: auto;
+  }
 
-          &.pinned:hover &-link-unpin {
-            display: inline-block;
-          }
+  &-right {
+    float: right;
+    margin-left: 10px;
 
-          &-arrow {
-            float: right;
-            color: $sidebar-arrow-color;
-            font-size: 16px;
-            font-weight: bold !important;
-            margin-left: 4px;
-            @include transition(color $transitions-duration);
-          }
+    &.collapsible {
+      display: none;
 
-          &-link:hover &-arrow {
-            color: $sidebar-hover-arrow-color;
-          }
-        }
+      html.touchevents & {
+        display: inline;
+      }
+    }
 
-        &.compact &-item-link {
-          &, &:visited, &:hover {
-            font-size: 11px;
-            padding: 6px 12px 6px 24px;
-            text-transform: uppercase;
-          }
+    &-edit {
+      display: none;
+      font-size: 18px;
 
-          &.padding-icon {
-            padding-left: 49px;
-          }
-        }
+      html.touchevents & {
+        display: inline;
       }
     }
+
+    &-plus {
+      font-size: 14px;
+      outline: 0;
+    }
+
+    &-arrow {
+      color: $sidebar-arrow-color;
+      font-size: 16px;
+      font-weight: bold !important;
+      transition: color $transitions-duration, opacity $transitions-duration;
+
+      html.touchevents .editing & {
+        opacity: 0;
+      }
+    }
+
+    &-remove {
+      &, &:visited, &:hover {
+        position: relative;
+        color: $sidebar-action-color;
+        transition: color $transitions-duration;
+      }
+
+      &:hover {
+        color: $sidebar-hover-action-color;
+      }
+    }
+  }
+
+  &-link:hover &-right.collapsible {
+    display: inline-block;
+  }
+
+  &-link:hover &-right-arrow {
+    color: $sidebar-hover-arrow-color;
+  }
+
+  .clone {
+    display: none;
+  }
+
+  .apps-hide {
+    &-label {
+      display: none;
+    }
+
+    &.apps-visible .apps-hide-label.apps-visible {
+      display: inline;
+    }
+
+    &.apps-hidden .apps-hide-label.apps-hidden {
+      display: inline;
+    }
+  }
+
+  &-copyright {
+    background-color: $sidebar-contrast-background-color;
+    color: $sidebar-contrast-text-color;
+    height: 32px;
+    line-height: 32px;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    text-align: center;
+    font-size: 11px;
+    font-weight: bold;
+    transition: background-color $transitions-duration, color $transitions-duration;
+
+    @include for-mobile {
+      display: none;
+    }
   }
 
   &-popup {
     position: absolute;
     top: 0;
     bottom: 0;
+    left: 0;
     width: $sidebar-width;
     color: $sidebar-popup-text-color;
     background-color: $sidebar-popup-background-color;
     overflow-y: auto;
+    -webkit-overflow-scrolling: touch;
+
+    @include for-mobile {
+      min-width: 280px;
+      max-width: 360px;
+      width: 80%;
+    }
 
     &-container {
       display: none;
@@ -250,10 +407,14 @@
       left: $sidebar-width;
       bottom: 0;
       right: 0;
-      z-index: 3;
+      z-index: 5;
+
+      @include for-mobile {
+        left: 0;
+      }
     }
 
-    &-item {
+    &-section {
       display: none;
     }
 
@@ -265,31 +426,55 @@
       overflow: hidden;
       text-overflow: ellipsis;
       white-space: nowrap;
+
+      @include for-mobile {
+        padding: 24px 20px;
+        margin-bottom: 0;
+        font-size: 14px;
+      }
     }
 
     &-search {
-      @extend .base_input;
-      @include placeholder {
-        color: $sidebar-popup-search-input-placeholder-color;
-      }
       background-color: $sidebar-popup-search-input-background-color;
       color: $sidebar-popup-search-input-text-color;
-      border-radius: 0 !important;
       width: 100%;
       height: 32px;
-      padding: 0 !important;
       text-indent: 20px;
-      margin-bottom: 12px !important;
+      border: 0;
+      font-size: 13px;
+      outline: 0;
+      padding: 0;
+      margin: 0 0 12px 0;
+      border-radius: 0;
+
+      //noinspection CssInvalidPseudoSelector
+      &::placeholder {
+        color: $sidebar-popup-search-input-placeholder-color;
+      }
+
+      @include for-mobile {
+        font-size: 14px;
+        height: 40px;
+      }
     }
 
     &-list {
-      @extend .clear-list;
+      margin: 0;
+      padding: 0;
+      list-style: none;
 
       &-item {
         a, a:visited, a:hover {
           color: $sidebar-popup-link-text-color;
           padding: 8px 20px;
           display: block;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+
+          @include for-mobile {
+            padding: 12px 20px;
+          }
         }
 
         &.selected a {
@@ -299,19 +484,4 @@
       }
     }
   }
-
-  &-copyright {
-    background-color: $sidebar-contrast-background-color;
-    color: $sidebar-contrast-text-color;
-    height: 32px;
-    line-height: 32px;
-    position: absolute;
-    bottom: 0;
-    left: 0;
-    right: 0;
-    text-align: center;
-    font-size: 11px;
-    font-weight: bold;
-    @include transition(background-color $transitions-duration, color $transitions-duration);
-  }
 }

+ 0 - 169
jet/static/jet/css/_table.scss

@@ -1,169 +0,0 @@
-@import "globals";
-
-.table {
-  background: $content-background-color;
-  border-collapse: collapse;
-  border-radius: 4px;
-  margin-bottom: 2px;
-  overflow-x: auto;
-  width: 100%;
-
-  &.helper {
-    display: none;
-    position: fixed;
-    z-index: 2;
-    top: 0;
-    right: 20px;
-    width: auto;
-    border-radius: 0;
-    box-shadow: none;
-
-    thead {
-      th {
-        border-radius: 0 !important;
-      }
-    }
-  }
-
-  caption {
-    border-radius: 4px;
-    padding: 6px;
-    text-align: left;
-    text-transform: uppercase;
-    font-size: 11px;
-    font-weight: bold;
-
-    a {
-      color: $text-color;
-      font-size: 11px;
-      font-weight: bold;
-    }
-  }
-
-  thead {
-    th {
-      background: $content-contrast2-background-color;
-      padding: 8px;
-      font-size: 12px;
-      font-weight: normal;
-      text-align: left;
-      white-space: nowrap;
-
-      &, & a, & a:visited, & a:hover {
-        color: $content-contrast2-text-color;
-        text-decoration: none;
-        text-transform: uppercase;
-      }
-
-      &:first-child {
-        border-radius: 4px 0 0 0;
-      }
-
-      &:last-child {
-        border-radius: 0 4px 0 0;
-      }
-
-      &:first-child:last-child {
-        border-radius: 4px 4px 0 0;
-      }
-
-      &.action-checkbox-column {
-        width: 20px;
-        text-align: center;
-      }
-
-      &.sorted {
-        .sortoptions {
-          display: inline-block;
-
-          .sortpriority {
-            background: $content-background-color;
-            color: $text-color;
-            padding: 2px 8px;
-            margin-right: 2px;
-            border-radius: 12px;
-          }
-        }
-
-        .text {
-          display: inline-block;
-
-          &:after {
-            @include font-icon;
-            color: $content-contrast2-text-color;
-            font-size: 13px;
-            font-weight: bold;
-            margin-left: 4px;
-          }
-        }
-
-        &.ascending .text:after {
-          content: $icon-arrow-down;
-        }
-
-        &.descending .text:after {
-          content: $icon-arrow-up;
-        }
-      }
-    }
-  }
-
-  tbody {
-    tr {
-      border-bottom: 1px solid $content-border-color;
-
-      &:last-child {
-        border-bottom: 0;
-      }
-
-      & th {
-        text-align: left;
-      }
-
-      & th, & td {
-        padding: 8px;
-        font-size: 13px;
-
-        &.action-checkbox {
-          text-align: center;
-        }
-      }
-    }
-
-    tr.selected {
-      border-color: $content-selected-border-color;
-
-      &:last-child {
-        & th:first-child, & td:first-child {
-          border-radius: 0 0 0 4px;
-        }
-
-        & th:last-child, & td:last-child {
-          border-radius: 0 0 4px 0;
-        }
-      }
-
-      & th, & td {
-        background-color: $content-selected-background-color;
-      }
-    }
-
-    tr.contrast {
-      background: $content-contrast-background-color;
-    }
-
-    tr.contrast2 {
-      background: $content-contrast2-background-color;
-      color: $content-contrast2-text-color;
-      border: 0;
-
-      a, a:visited, a:hover {
-        color: $content-contrast2-text-color;
-      }
-    }
-
-    tr.contrast3 {
-      background: $content-contrast3-background-color;
-    }
-  }
-}

+ 193 - 0
jet/static/jet/css/_tables.scss

@@ -0,0 +1,193 @@
+@import "globals";
+
+
+/* TABLES */
+
+table {
+  border-collapse: collapse;
+  background: $content-background-color;
+  border-radius: 4px;
+  overflow-x: auto;
+  box-shadow: 0 2px 0 0 $content-border2-color;
+  margin-bottom: 2px;
+
+  &.helper {
+    display: none;
+    position: fixed;
+    z-index: 2;
+    top: 0;
+    right: 20px;
+    left: $sidebar-width + 20px;
+    width: auto;
+    border-radius: 0;
+    box-shadow: none;
+
+    body.popup & {
+      left: 20px;
+    }
+
+    @include for-mobile {
+      display: none !important;
+    }
+
+    thead {
+      th {
+        border-radius: 0 !important;
+      }
+    }
+  }
+
+  thead th {
+    background: $content-contrast2-background-color;
+    color: $content-contrast2-text-color;
+    text-transform: uppercase;
+    transition: background-color $fast-transitions-duration;
+
+    a:link, a:visited {
+      color: $content-contrast2-text-color;
+    }
+
+    .text {
+      a {
+        display: block;
+        cursor: pointer;
+      }
+    }
+  }
+}
+
+td, th {
+  padding: 8px;
+  font-size: 13px;
+}
+
+th {
+  text-align: left;
+}
+
+thead th,
+tfoot td {
+  font-weight: normal;
+  text-align: left;
+  white-space: nowrap;
+  vertical-align: middle;
+  font-size: 12px;
+
+  &:first-child {
+    border-radius: 4px 0 0 0;
+  }
+
+  &:last-child {
+    border-radius: 0 4px 0 0;
+  }
+
+  &:first-child:last-child {
+    border-radius: 4px 4px 0 0;
+  }
+}
+
+tfoot td {
+  border-bottom: none;
+  border-top: 1px solid #eee;
+}
+
+//tr.alt {
+  //background: #f6f6f6;
+//}
+
+tbody tr {
+  border-bottom: 1px solid $content-border-color;
+
+  &:last-child {
+    border-bottom: 0;
+  }
+}
+
+/* SORTABLE TABLES */
+
+table {
+  thead th {
+    &.sortable {
+      cursor: pointer;
+
+      &:hover {
+        background: $button-hover-background-color;
+      }
+    }
+
+    &.sorted {
+      position: relative;
+      padding-right: 32px;
+
+      .text {
+        display: inline-block;
+      }
+
+      .sortoptions {
+        display: inline-block;
+
+        a {
+          display: inline-block;
+          vertical-align: middle;
+
+          &.sortremove {
+            position: absolute;
+            top: 50%;
+            right: 18px;
+            margin-top: -6px;
+
+            &:after {
+              @include font-icon;
+              content: $icon-cross;
+            }
+          }
+
+          &.ascending {
+            position: absolute;
+            top: 50%;
+            right: 4px;
+            margin-top: -6px;
+
+            &:after {
+              @include font-icon;
+              content: $icon-arrow-down;
+              font-weight: bold;
+            }
+          }
+
+          &.descending {
+            position: absolute;
+            top: 50%;
+            right: 4px;
+            margin-top: -6px;
+
+            &:after {
+              @include font-icon;
+              content: $icon-arrow-up;
+              font-weight: bold;
+            }
+          }
+        }
+      }
+
+      .sortpriority {
+        background: $content-background-color;
+        color: $text-color;
+        padding: 1px 5px;
+        margin-right: 2px;
+        border-radius: 5px;
+        font-size: 10px;
+      }
+    }
+  }
+}
+
+/* OBJECT HISTORY */
+
+table#change-history {
+    width: 100%;
+}
+
+table#change-history tbody th {
+    width: 16em;
+}

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

@@ -1,151 +0,0 @@
-@import "globals";
-
-.breadcrumbs {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  padding-right: 200px;
-  overflow: hidden;
-}
-
-.top {
-  padding: 20px;
-
-  &-breadcrumbs {
-    text-transform: uppercase;
-    font-size: 12px;
-    font-weight: bold;
-    line-height: $top-height;
-    color: $top-text-color;
-
-    a, a:visited, a:hover {
-      color: $top-link-color;
-      text-decoration: none;
-      word-spacing: normal;
-    }
-
-    a:hover {
-      color: $top-hover-link-color;
-    }
-
-    &-separator {
-      color: $top-separator-color;
-      margin: 0 6px 0 6px;
-      font-weight: bold !important;
-      font-size: 15px;
-      vertical-align: middle;
-    }
-  }
-
-  &-right {
-    float: right;
-    position: relative;
-    padding-right: 175px + 10px;
-  }
-
-  &-user-tools {
-    @extend .clear-list;
-    position: absolute;
-    top: 0;
-    right: 0;
-    border: 1px solid $top-border-color;
-    border-radius: 4px;
-    font-size: 12px;
-    text-align: left;
-    width: 175px;
-    z-index: 1;
-
-    &-welcome-msg {
-      font-weight: bold;
-      line-height: $top-height - 2px;
-      padding: 0 10px 0 14px;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-
-      &-arrow {
-        float: right;
-        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 {
-      display: none;
-      padding: 8px 14px;
-      background: $top-dropdown-contrast-background-color;
-      color: $top-dropdown-contrast-text-color;
-
-      &-title {
-        text-transform: uppercase;
-        font-size: 10px;
-        font-weight: bold;
-        margin-bottom: 6px;
-      }
-    }
-
-    &.opened &-contrast-block {
-      display: block;
-    }
-
-    &-theme-link {
-      display: inline-block;
-      float: left;
-      margin-right: 6px;
-      margin-bottom: 6px;
-      width: 14px;
-      height: 14px;
-      border: 1px solid $top-dropdown-contrast-background-color;
-      border-radius: 3px;
-
-      &:last-child {
-        margin-right: 0;
-      }
-
-      &.selected {
-        box-shadow: 0 0 1px 1px $top-dropdown-selected-color;
-      }
-    }
-
-    &-user-link {
-      display: none;
-      padding: 8px 14px;
-
-      a, a:visited, a:hover {
-        color: $top-dropdown-link-color;
-        text-decoration: none;
-      }
-
-      a:hover {
-        color: $top-dropdown-hover-link-color;
-        text-decoration: underline;
-      }
-
-      &-icon {
-        color: $top-dropdown-icon-color;
-        font-size: 15px;
-        vertical-align: middle;
-      }
-    }
-
-    &.opened {
-      background-color: $top-dropdown-background-color;
-      border-color: transparent;
-      color: $top-dropdown-text-color;
-    }
-
-    &.opened &-welcome-msg {
-      border-bottom: 1px solid $top-dropdown-border-color;
-    }
-
-    &.opened &-user-link {
-      display: block;
-    }
-  }
-}

+ 6 - 1
jet/static/jet/css/_variables.scss

@@ -19,12 +19,17 @@ $font: Arial, sans-serif !default;
 $font-size: 14px !default;
 
 $transitions-duration: 0.3s !default;
+$fast-transitions-duration: 0.1s !default;
+
+$mobile-max-width: 960px;
+$phone-max-width: 480px;
 
 /*
  * Sidebar
  */
 
 $sidebar-width: 250px !default;
+$sidebar-header-height: 44px !default;
 
 $sidebar-background-color: #354052 !default;
 $sidebar-contrast-background-color: #2b3647 !default;
@@ -47,7 +52,7 @@ $sidebar-hover-background-color: #2b3647 !default;
 
 $sidebar-popup-search-input-background-color: #d0dbe6 !default;
 $sidebar-popup-search-input-text-color: #6f7e95 !default;
-$sidebar-popup-search-input-placeholder-color: #d0dbe6 !default;
+$sidebar-popup-search-input-placeholder-color: transparentize(#6f7e95, 0.5) !default;
 
 $sidebar-popup-background-color: #ecf2f6 !default;
 $sidebar-popup-text-color: #6f7e95 !default;

+ 5 - 0
jet/static/jet/css/icons/_variables.scss

@@ -1,3 +1,7 @@
+$icomoon-font-path: "fonts" !default;
+
+$icon-settings: "\e900";
+$icon-menu: "\e901";
 $icon-reset: "\e61e";
 $icon-search: "\e61d";
 $icon-user: "\e61c";
@@ -29,3 +33,4 @@ $icon-add: "\e603";
 $icon-add3: "\e604";
 $icon-expand: "\e605";
 $icon-checkbox: "\e606";
+

BIN
jet/static/jet/css/icons/fonts/jet-icons.eot


File diff suppressed because it is too large
+ 0 - 0
jet/static/jet/css/icons/fonts/jet-icons.svg


BIN
jet/static/jet/css/icons/fonts/jet-icons.ttf


BIN
jet/static/jet/css/icons/fonts/jet-icons.woff


+ 55 - 52
jet/static/jet/css/icons/style.css

@@ -1,123 +1,126 @@
 @font-face {
-    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;
+  font-family: 'jet-icons';
+  src:  url('fonts/jet-icons.eot?415d6s');
+  src:  url('fonts/jet-icons.eot?415d6s#iefix') format('embedded-opentype'),
+    url('fonts/jet-icons.ttf?415d6s') format('truetype'),
+    url('fonts/jet-icons.woff?415d6s') format('woff'),
+    url('fonts/jet-icons.svg?415d6s#jet-icons') format('svg');
+  font-weight: normal;
+  font-style: normal;
 }
 
 [class^="icon-"], [class*=" icon-"] {
-    /* 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;
+  /* 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-settings:before {
+  content: "\e900";
+}
+.icon-menu: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";
 }
 

+ 37 - 1
jet/static/jet/css/jquery-ui/_jquery-ui.theme.scss

@@ -1,6 +1,7 @@
 @import "../globals";
 
 .ui-widget-content {
+  color: $text-color;
   border-color: $content-border-color;
 }
 
@@ -60,6 +61,14 @@
   color: $jquery-ui-state-highlight-text-color;
 }
 
+.ui-dialog {
+  @include for-phone {
+    left: 10px !important;
+    right: 10px !important;
+    width: auto !important;
+  }
+}
+
 .ui-dialog-buttonpane {
   background: $jquery-ui-buttonpane-background;
   margin: .5em -0.2em -0.2em -0.2em;
@@ -105,4 +114,31 @@
   opacity: 0.8;
   font-size: 13px;
   pointer-events: none;
-}
+}
+
+.ui-datepicker, .ui-timepicker {
+  table {
+    margin: 0 0 .4em;
+    background: transparent;
+    border-radius: 0;
+    box-shadow: none;
+  }
+
+  th {
+    background: inherit;
+    color: inherit;
+    text-transform: inherit;
+  }
+
+  tbody tr {
+    border-bottom: inherit;
+  }
+}
+
+.ui-datepicker table {
+  margin: 0 0 .4em;
+}
+
+.ui-timepicker-table table {
+  margin: .15em 0 0;
+}

+ 9 - 8
jet/static/jet/css/select2/_layout.scss

@@ -5,7 +5,11 @@ $input-height: 32px;
 .select2-container--jet {
   @import "single";
   @import "multiple";
-  min-width: 100px;
+  min-width: 240px;
+
+  @include for-phone {
+    min-width: 160px;
+  }
 
   .select2-selection {
     background-color: $input-background-color;
@@ -14,19 +18,16 @@ $input-height: 32px;
     outline: 0;
     height: $input-height;
 
-    .background-form & {
-      background-color: $background-input-background-color;
-      border-color: $background-input-border-color;
+    @include for-mobile {
+      fieldset.module & {
+        box-shadow: inset 0 2px 6px 0 rgba(0, 0, 0, 0.04);
+      }
     }
 
     .select2-selection__rendered {
       color: $input-text-color;
       line-height: $input-height;
       font-size: 13px;
-
-      .background-form & {
-        color: $background-input-text-color;
-      }
     }
 
     .select2-selection__placeholder {

File diff suppressed because it is too large
+ 0 - 5746
jet/static/jet/css/themes/default/base.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/default/base.css.map


File diff suppressed because it is too large
+ 0 - 403
jet/static/jet/css/themes/default/jquery-ui.theme.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/default/jquery-ui.theme.css.map


File diff suppressed because it is too large
+ 0 - 920
jet/static/jet/css/themes/default/select2.theme.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/default/select2.theme.css.map


+ 1 - 1
jet/static/jet/css/themes/green/_variables.scss

@@ -45,7 +45,7 @@ $sidebar-hover-background-color: #254d49;
 
 $sidebar-popup-search-input-background-color: #cceae4;
 $sidebar-popup-search-input-text-color: #62a29c;
-$sidebar-popup-search-input-placeholder-color: #cceae4;
+$sidebar-popup-search-input-placeholder-color: transparentize(#6f7e95, 0.5);
 
 $sidebar-popup-background-color: #eff6f5;
 $sidebar-popup-text-color: #62a29c;

File diff suppressed because it is too large
+ 0 - 5777
jet/static/jet/css/themes/green/base.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/green/base.css.map


File diff suppressed because it is too large
+ 0 - 434
jet/static/jet/css/themes/green/jquery-ui.theme.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/green/jquery-ui.theme.css.map


File diff suppressed because it is too large
+ 0 - 951
jet/static/jet/css/themes/green/select2.theme.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/green/select2.theme.css.map


File diff suppressed because it is too large
+ 0 - 5777
jet/static/jet/css/themes/light-blue/base.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/light-blue/base.css.map


File diff suppressed because it is too large
+ 0 - 434
jet/static/jet/css/themes/light-blue/jquery-ui.theme.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/light-blue/jquery-ui.theme.css.map


File diff suppressed because it is too large
+ 0 - 951
jet/static/jet/css/themes/light-blue/select2.theme.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/light-blue/select2.theme.css.map


File diff suppressed because it is too large
+ 0 - 5777
jet/static/jet/css/themes/light-gray/base.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/light-gray/base.css.map


File diff suppressed because it is too large
+ 0 - 434
jet/static/jet/css/themes/light-gray/jquery-ui.theme.css


File diff suppressed because it is too large
+ 0 - 2
jet/static/jet/css/themes/light-gray/jquery-ui.theme.css.map


Some files were not shown because too many files changed in this diff