Browse Source

Merge feature/relayout into dev

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

+ 1 - 0
.gitignore

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

+ 8 - 0
CHANGELOG.rst

@@ -3,6 +3,14 @@ Changelog
 
 
 new
 new
 ---
 ---
+* 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
 * Fixed compatibility issue with Django 1.10
 
 
 
 

+ 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']);

+ 8 - 2
jet/dashboard/forms.py

@@ -17,6 +17,9 @@ class UpdateDashboardModulesForm(forms.Form):
     def clean(self):
     def clean(self):
         data = super(UpdateDashboardModulesForm, self).clean()
         data = super(UpdateDashboardModulesForm, self).clean()
 
 
+        if not self.request.user.is_authenticated():
+            raise ValidationError('error')
+
         try:
         try:
             modules = json.loads(data['modules'])
             modules = json.loads(data['modules'])
 
 
@@ -65,6 +68,9 @@ class AddUserDashboardModuleForm(forms.ModelForm):
     def clean(self):
     def clean(self):
         data = super(AddUserDashboardModuleForm, self).clean()
         data = super(AddUserDashboardModuleForm, self).clean()
 
 
+        if not self.request.user.is_authenticated():
+            raise ValidationError('error')
+
         if 'app_label' in data:
         if 'app_label' in data:
             index_dashboard_cls = get_current_dashboard('app_index' if data['app_label'] else 'index')
             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'])
             index_dashboard = index_dashboard_cls({'request': self.request}, app_label=data['app_label'])
@@ -104,7 +110,7 @@ class UpdateDashboardModuleCollapseForm(forms.ModelForm):
     def clean(self):
     def clean(self):
         data = super(UpdateDashboardModuleCollapseForm, self).clean()
         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')
             raise ValidationError('error')
 
 
         return data
         return data
@@ -122,7 +128,7 @@ class RemoveDashboardModuleForm(forms.ModelForm):
     def clean(self):
     def clean(self):
         cleaned_data = super(RemoveDashboardModuleForm, self).clean()
         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')
             raise ValidationError('error')
 
 
         return cleaned_data
         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" %}
 {% extends "admin/base_site.html" %}
 {% load i18n static jet_dashboard_tags %}
 {% 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 extrastyle %}
     {{ block.super }}
     {{ block.super }}
@@ -17,33 +14,24 @@
 
 
 {% block extrahead %}
 {% block extrahead %}
     {{ block.super }}
     {{ block.super }}
+
     {% for js in dashboard.media.js %}
     {% for js in dashboard.media.js %}
         <script src="{% static js %}"></script>
         <script src="{% static js %}"></script>
     {% endfor %}
     {% endfor %}
 {% endblock %}
 {% 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 sidebar %}{% endblock %}
 
 
-{% block top-right %}
+{% block breadcrumbs %}
+    {% if not is_popup %}
+        <div class="breadcrumbs"></div>
+    {% endif %}
+
     {{ dashboard.render_tools }}
     {{ dashboard.render_tools }}
 {% endblock %}
 {% endblock %}
 
 
 {% block content %}
 {% block content %}
     {{ dashboard.render }}
     {{ dashboard.render }}
-{% endblock %}
+{% endblock %}

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

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

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

@@ -1,6 +1,6 @@
 {% load i18n %}
 {% load i18n %}
 
 
-<div class="dashboard columns_{{ columns|length }} cf">
+<div class="dashboard-container columns_{{ columns|length }} cf">
     {% for i in columns %}
     {% for i in columns %}
         <div class="dashboard-column-wrapper">
         <div class="dashboard-column-wrapper">
             <div class="dashboard-column{% if forloop.first %} first{% endif %}">
             <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 %}
 {% 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">
     <form action="{% url "jet-dashboard:add_user_dashboard_module" %}" method="POST" id="add-dashboard-module-form">
         {% csrf_token %}
         {% csrf_token %}
         <select class="add-dashboard" name="module">
         <select class="add-dashboard" name="module">
@@ -15,10 +20,10 @@
                     <option value="{{ forloop.counter0 }}" data-type="children">{{ module.title }}</option>
                     <option value="{{ forloop.counter0 }}" data-type="children">{{ module.title }}</option>
                 {% endfor %}
                 {% endfor %}
             </optgroup>
             </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="app_label" value="{% if app_label %}{{ app_label }}{% endif %}">
         <input type="hidden" name="type" value="">
         <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>
     <form action="{% url "jet-dashboard:reset_dashboard" %}" method="POST" id="reset-dashboard-form">
     <form action="{% url "jet-dashboard:reset_dashboard" %}" method="POST" id="reset-dashboard-form">
         {% csrf_token %}
         {% csrf_token %}

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

@@ -15,13 +15,13 @@
             <li>
             <li>
                 <span class="float-right">
                 <span class="float-right">
                     {% if model.add_url %}
                     {% 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 %}
                     {% else %}
                         &nbsp;
                         &nbsp;
                     {% endif %}
                     {% endif %}
 
 
                     {% if model.admin_url %}
                     {% 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 %}
                     {% else %}
                         &nbsp;
                         &nbsp;
                     {% endif %}
                     {% endif %}

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

@@ -3,9 +3,9 @@
 <ul>
 <ul>
     {% if module.children %}
     {% if module.children %}
         {% for child in 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.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>
             </li>
         {% endfor %}
         {% endfor %}
     {% else %}
     {% else %}

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

@@ -5,13 +5,13 @@
         <li>
         <li>
             <span class="float-right">
             <span class="float-right">
                 {% if model.add_url %}
                 {% 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 %}
                 {% else %}
                     &nbsp;
                     &nbsp;
                 {% endif %}
                 {% endif %}
 
 
                 {% if model.admin_url %}
                 {% 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 %}
                 {% else %}
                     &nbsp;
                     &nbsp;
                 {% endif %}
                 {% endif %}

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

@@ -7,33 +7,35 @@
         </li>
         </li>
     {% else %}
     {% else %}
         {% for entry in module.children %}
         {% for entry in module.children %}
-            <li class="nowrap">
+            <li>
                 <span class="float-right">
                 <span class="float-right">
                     <span class="icon-user tooltip" title="{{ entry.user }}"></span>
                     <span class="icon-user tooltip" title="{{ entry.user }}"></span>
                     <span class="icon-clock tooltip" title="{{ entry.action_time }}"></span>
                     <span class="icon-clock tooltip" title="{{ entry.action_time }}"></span>
                 </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>
             </li>
         {% endfor %}
         {% endfor %}
     {% endif %}
     {% endif %}

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

@@ -20,120 +20,77 @@
     {% endblock %}
     {% endblock %}
 {% endif %}
 {% 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 %}
                 {% 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">
                     <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>
                     </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 %}
                                 {% 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 %}
                                         {% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %}
+
                                         {% include "jet.dashboard/update_module_fieldset.html" with form=form %}
                                         {% include "jet.dashboard/update_module_fieldset.html" with form=form %}
                                     </div>
                                     </div>
                                 {% endfor %}
                                 {% 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>
                                     </div>
                                 {% endwith %}
                                 {% endwith %}
-                            </div>
+                            </fieldset>
                         </div>
                         </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>
-       </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 %}
 {% load i18n jet_tags %}
 
 
-<fieldset class="module aligned">
+{% if wrap != False %}<fieldset class="module aligned">{% endif %}
     {% for field in form %}
     {% 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 %}
     {% endfor %}
-</fieldset>
+{% if wrap != False %}</fieldset>{% endif %}

+ 8 - 0
jet/dashboard/views.py

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

+ 13 - 0
jet/forms.py

@@ -67,6 +67,12 @@ class ToggleApplicationPinForm(forms.ModelForm):
         model = PinnedApplication
         model = PinnedApplication
         fields = ['app_label']
         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):
     def save(self, commit=True):
         if commit:
         if commit:
             try:
             try:
@@ -93,9 +99,16 @@ class ModelLookupForm(forms.Form):
     object_id = forms.IntegerField(required=False)
     object_id = forms.IntegerField(required=False)
     model_cls = None
     model_cls = None
 
 
+    def __init__(self, request, *args, **kwargs):
+        self.request = request
+        super(ModelLookupForm, self).__init__(*args, **kwargs)
+
     def clean(self):
     def clean(self):
         data = super(ModelLookupForm, self).clean()
         data = super(ModelLookupForm, self).clean()
 
 
+        if not self.request.user.is_authenticated():
+            raise ValidationError('error')
+
         try:
         try:
             self.model_cls = get_model(data['app_label'], data['model'])
             self.model_cls = get_model(data['app_label'], data['model'])
         except:
         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"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\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
 #: models.py:16 templates/admin/base.html:294
 msgid "bookmarks"
 msgid "bookmarks"
 msgstr ""
 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"
 msgid "back"
 msgstr ""
 msgstr ""
 
 
-#: templates/admin/base.html:180
+#: templates/admin/base.html:60
 msgid "View site"
 msgid "View site"
 msgstr ""
 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"
 msgid "Add bookmark"
 msgstr ""
 msgstr ""
 
 
-#: templates/admin/base.html:289
+#: templates/admin/base.html:286
 msgid "Delete bookmark"
 msgid "Delete bookmark"
 msgstr ""
 msgstr ""
 
 
-#: templates/admin/base.html:290
+#: templates/admin/base.html:287
 msgid "Are you sure want to delete this bookmark?"
 msgid "Are you sure want to delete this bookmark?"
 msgstr ""
 msgstr ""
 
 
-#: templates/admin/base.html:333
+#: templates/admin/base.html:339
 msgid "Application page"
 msgid "Application page"
 msgstr ""
 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 ""
 msgstr ""
 
 
-#: templates/registration/logged_out.html:10
-msgid "Log in again"
+#: templates/admin/base.html:278
+msgid "URL"
 msgstr ""
 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 ""
 msgstr ""
 
 
-#: templates/registration/password_change_done.html:15
-msgid "Your password was changed."
+#: templates/admin/base.html:243
+msgid "Hide applications"
 msgstr ""
 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 ""
 msgstr ""
 
 
-#: templates/registration/password_change_form.html:50
-msgid "Change my password"
+#: templates/admin/base.html:363
+msgid "current theme"
 msgstr ""
 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-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\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"
 msgid "Add"
 msgstr ""
 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"
 msgid "Cancel"
 msgstr ""
 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"
 msgid "Delete"
 msgstr ""
 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"
 msgid "Warning: you have unsaved changes"
 msgstr ""
 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"
 msgid "select all"
 msgstr ""
 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"
 msgid "deselect all"
 msgstr ""
 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"
 "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"
 "%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
 #: models.py:16 templates/admin/base.html:294
 msgid "bookmarks"
 msgid "bookmarks"
 msgstr "закладки"
 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"
 msgid "back"
 msgstr "назад"
 msgstr "назад"
 
 
-#: templates/admin/base.html:180
+#: templates/admin/base.html:60
 msgid "View site"
 msgid "View site"
 msgstr "Открыть сайт"
 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"
 msgid "Add bookmark"
 msgstr "Добавить закладку"
 msgstr "Добавить закладку"
 
 
-#: templates/admin/base.html:289
+#: templates/admin/base.html:286
 msgid "Delete bookmark"
 msgid "Delete bookmark"
 msgstr "Удалить закладку"
 msgstr "Удалить закладку"
 
 
-#: templates/admin/base.html:290
+#: templates/admin/base.html:287
 msgid "Are you sure want to delete this bookmark?"
 msgid "Are you sure want to delete this bookmark?"
 msgstr "Вы точно хотите удалить эту закладку?"
 msgstr "Вы точно хотите удалить эту закладку?"
 
 
-#: templates/admin/base.html:333
+#: templates/admin/base.html:339
 msgid "Application page"
 msgid "Application page"
 msgstr "Страница приложения"
 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 "Приложения"
 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-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\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"
 msgid "Add"
 msgstr "Добавить"
 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"
 msgid "Cancel"
 msgstr "Отмена"
 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"
 msgid "Delete"
 msgstr "Удалить"
 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"
 msgid "Warning: you have unsaved changes"
 msgstr "Внимание: у вас есть несохраненные изменения"
 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"
 msgid "select all"
 msgstr "выбрать все"
 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"
 msgid "deselect all"
 msgstr "убрать все"
 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";
 @import "globals";
 
 
 html, body {
 html, body {
   margin: 0;
   margin: 0;
   padding: 0;
   padding: 0;
-  height: 100%;
+}
+
+html {
+  font-size: 87.5%;
+
+  @include for-mobile {
+    font-size: 100%;
+  }
 }
 }
 
 
 body {
 body {
+  height: 100%;
+  background: $background-color;
   color: $text-color;
   color: $text-color;
   font-family: $font;
   font-family: $font;
-  font-size: $font-size;
+  text-size-adjust: 100%;
+
+  @include for-mobile {
+    padding-top: $sidebar-header-height;
+  }
 
 
   &.non-scrollable {
   &.non-scrollable {
     overflow: hidden;
     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;
   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 "forms";
+@import "tables";
 @import "messages";
 @import "messages";
-@import "changelist";
+@import "header";
+@import "breadcrumbs";
+@import "modules";
+@import "object-tools";
 @import "changeform";
 @import "changeform";
-@import "delete";
-@import "login";
-@import "content";
+@import "changelist";
+@import "sidebar";
+@import "relatedpopup";
 @import "dashboard";
 @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";
 @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;
       float: none;
       display: inline;
       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;
     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;
       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;
         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;
       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;
           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;
       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;
           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 {
 .related-lookup {
-  margin-left: 10px;
+  margin-left: 6px;
 
 
   &:before {
   &:before {
     @include font-icon;
     @include font-icon;
-    color: $button-text-color;
-    vertical-align: middle;
     font-size: 20px;
     font-size: 20px;
+    vertical-align: middle;
     content: $icon-search;
     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";
 @import "globals";
 
 
+/* CHANGELISTS */
+
 #changelist {
 #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;
       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;
       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";
 @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 {
 .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;
   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;
   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;
   display: none;
 
 
   + span {
   + 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;
   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;
   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";
 @import "globals";
 
 
+/* DASHBOARD */
+
 .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 {
   @for $i from 1 through 5 {
-    &.columns_#{$i} &-column-wrapper {
+    &-container.columns_#{$i} &-column-wrapper {
       width: (100% / $i);
       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;
     min-height: 100px;
     border-radius: 4px;
     border-radius: 4px;
 
 
+    @include for-mobile {
+      margin-left: 0;
+      min-height: 0;
+    }
+
     &-wrapper {
     &-wrapper {
       float: left;
       float: left;
       min-width: 200px;
       min-width: 200px;
@@ -35,10 +175,18 @@
     background: $background-color;
     background: $background-color;
     border-radius: 4px;
     border-radius: 4px;
     margin-bottom: 20px;
     margin-bottom: 20px;
-    @include transition(background $transitions-duration);
+    transition: background $transitions-duration;
+
+    @include for-mobile {
+      margin-bottom: 10px;
+    }
 
 
     &:last-child {
     &:last-child {
       margin-bottom: 0;
       margin-bottom: 0;
+
+      @include for-mobile {
+        margin-bottom: 10px;
+      }
     }
     }
 
 
     &.collapsed {
     &.collapsed {
@@ -66,6 +214,10 @@
       &-drag {
       &-drag {
         float: right;
         float: right;
         line-height: 30px !important;
         line-height: 30px !important;
+
+        html.touchevents & {
+          display: none;
+        }
       }
       }
 
 
       &-collapse-button {
       &-collapse-button {
@@ -79,6 +231,11 @@
         font-size: 13px;
         font-size: 13px;
         vertical-align: middle;
         vertical-align: middle;
         visibility: hidden;
         visibility: hidden;
+
+        html.touchevents & {
+          visibility: visible;
+          float: right;
+        }
       }
       }
 
 
       &:hover &-buttons {
       &:hover &-buttons {
@@ -109,12 +266,6 @@
           font-size: 13px;
           font-size: 13px;
           padding: 8px;
           padding: 8px;
 
 
-          &.nowrap {
-            overflow: hidden;
-            text-overflow: ellipsis;
-            white-space: nowrap;
-          }
-
           &.contrast {
           &.contrast {
             background: $content-contrast2-background-color;
             background: $content-contrast2-background-color;
             font-size: 12px;
             font-size: 12px;
@@ -196,6 +347,13 @@
         color: $dim-text-color;
         color: $dim-text-color;
       }
       }
 
 
+      .nowrap {
+        display: block;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+      }
+
       canvas {
       canvas {
         .chart {
         .chart {
           &-fillColor {
           &-fillColor {
@@ -227,6 +385,11 @@
           }
           }
         }
         }
       }
       }
+
+      table {
+        width: 100%;
+        box-shadow: none;
+      }
     }
     }
 
 
     &-collapse .icon-arrow-up {
     &-collapse .icon-arrow-up {
@@ -252,13 +415,77 @@
 }
 }
 
 
 .add-dashboard {
 .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 {
   &-link {
     border-radius: 0 4px 4px 0 !important;
     border-radius: 0 4px 4px 0 !important;
     padding: 0 10px !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";
 @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 {
   &, &: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;
     display: inline-block;
-    text-transform: uppercase;
-  }
-
-  &.button-secondary {
     background-color: $button-background-color;
     background-color: $button-background-color;
     color: $button-text-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;
     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;
     background-color: transparent;
-    color: $text-color;
-    padding: 0 10px;
   }
   }
 
 
-  &:hover {
+  &:hover, &:focus {
     background-color: $button-hover-background-color;
     background-color: $button-hover-background-color;
     color: $button-hover-text-color;
     color: $button-hover-text-color;
-    font-weight: lighter;
   }
   }
 
 
   &:active {
   &: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 {
 .segmented-button {
   &, &:visited, &:hover {
   &, &:visited, &:hover {
-    @extend .base_input;
+    border: 0;
+    height: 32px;
+    line-height: 32px;
     font-size: 12px;
     font-size: 12px;
     text-align: center;
     text-align: center;
     background-color: $button-background-color;
     background-color: $button-background-color;
@@ -94,9 +105,10 @@
     display: inline-block;
     display: inline-block;
     text-transform: none;
     text-transform: none;
     border-radius: 0;
     border-radius: 0;
+    transition: background $transitions-duration;
   }
   }
 
 
-  &:hover {
+  &:hover, &:focus {
     background-color: $button-hover-background-color;
     background-color: $button-hover-background-color;
     color: $button-hover-text-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] {
 input[type=checkbox] {
   display: none;
   display: none;
 
 
@@ -150,7 +142,6 @@ input[type=checkbox] {
 
 
   + label:before {
   + label:before {
     @include font-icon;
     @include font-icon;
-
     color: $input-icon-color;
     color: $input-icon-color;
     font-size: 12px;
     font-size: 12px;
     content: $icon-checkbox-outline;
     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;
   display: none;
-}
+}

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

@@ -1,3 +1,3 @@
 @import "variables";
 @import "variables";
 @import "helpers";
 @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 {
 .hidden {
-    display: none;
+  display: none;
 }
 }
 
 
 .clear-list {
 .clear-list {
@@ -47,69 +47,25 @@
   width: 100% !important;
   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 {
 @mixin font-icon {
   font-family: 'jet-icons';
   font-family: 'jet-icons';

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

@@ -1,90 +1,117 @@
 @import "globals";
 @import "globals";
 
 
-.login {
-  $width: 400px;
-  $expected-height: 230px;
+/* LOGIN FORM */
 
 
+body.login {
   background: $login-background-color;
   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;
     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 {
   .form-row {
-    padding: 6px 0;
-    clear: both;
+    padding: 4px;
+    float: left;
+    width: 100%;
 
 
     label {
     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 {
   .submit-row {
-    margin-top: 20px;
+    clear: both;
+    padding: 20px 0 0 0;
+    margin: 0;
     text-align: center;
     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";
 @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;
     margin: 0 20px 10px 20px;
     border-radius: 6px;
     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";
 @import "globals";
 
 
+/* POPUP */
+
 .related-popup {
 .related-popup {
   position: absolute;
   position: absolute;
   top: 0;
   top: 0;
@@ -7,14 +9,23 @@
   bottom: 0;
   bottom: 0;
   left: 0;
   left: 0;
   z-index: 4;
   z-index: 4;
-  border: 0;
-  width: 100%;
-  height: 100%;
   padding-left: 250px;
   padding-left: 250px;
   box-sizing: border-box;
   box-sizing: border-box;
   display: none;
   display: none;
   background: $background-color;
   background: $background-color;
   background-clip: content-box;
   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 {
   &-container {
     display: none;
     display: none;
@@ -24,7 +35,7 @@
     left: 0;
     left: 0;
     bottom: 0;
     bottom: 0;
     right: 0;
     right: 0;
-    z-index: 3;
+    z-index: 5;
 
 
     .loading-indicator {
     .loading-indicator {
       display: none;
       display: none;
@@ -35,6 +46,7 @@
       left: 50%;
       left: 50%;
       margin-left: -48px;
       margin-left: -48px;
       margin-top: -48px;
       margin-top: -48px;
+      animation: spin 4s linear infinite;
     }
     }
   }
   }
 
 
@@ -54,18 +66,39 @@
       box-sizing: border-box;
       box-sizing: border-box;
       text-transform: uppercase;
       text-transform: uppercase;
       border-radius: 6px 0 0 6px;
       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;
       background: $background-color;
       color: $text-color;
       color: $text-color;
+
+      @include for-mobile {
+        background: $button-hover-background-color;
+        color: $button-hover-text-color;
+      }
     }
     }
 
 
-    span {
+    &-icon {
       vertical-align: middle;
       vertical-align: middle;
       font-weight: bold;
       font-weight: bold;
       font-size: 18px;
       font-size: 18px;
     }
     }
+
+    &-label {
+      @include for-mobile {
+        display: none;
+      }
+    }
   }
   }
 }
 }

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

@@ -1,246 +1,403 @@
 @import "globals";
 @import "globals";
 
 
 .sidebar {
 .sidebar {
+  position: fixed;
+  width: $sidebar-width;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  z-index: 4;
   background-color: $sidebar-background-color;
   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 {
       &-icon {
-        font-size: 18px;
+        font-size: 16px;
         vertical-align: middle;
         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;
         color: $sidebar-text-color;
-        text-transform: uppercase;
-        font-size: 11px;
         font-weight: bold;
         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 {
   &-popup {
     position: absolute;
     position: absolute;
     top: 0;
     top: 0;
     bottom: 0;
     bottom: 0;
+    left: 0;
     width: $sidebar-width;
     width: $sidebar-width;
     color: $sidebar-popup-text-color;
     color: $sidebar-popup-text-color;
     background-color: $sidebar-popup-background-color;
     background-color: $sidebar-popup-background-color;
     overflow-y: auto;
     overflow-y: auto;
+    -webkit-overflow-scrolling: touch;
+
+    @include for-mobile {
+      min-width: 280px;
+      max-width: 360px;
+      width: 80%;
+    }
 
 
     &-container {
     &-container {
       display: none;
       display: none;
@@ -250,10 +407,14 @@
       left: $sidebar-width;
       left: $sidebar-width;
       bottom: 0;
       bottom: 0;
       right: 0;
       right: 0;
-      z-index: 3;
+      z-index: 5;
+
+      @include for-mobile {
+        left: 0;
+      }
     }
     }
 
 
-    &-item {
+    &-section {
       display: none;
       display: none;
     }
     }
 
 
@@ -265,31 +426,55 @@
       overflow: hidden;
       overflow: hidden;
       text-overflow: ellipsis;
       text-overflow: ellipsis;
       white-space: nowrap;
       white-space: nowrap;
+
+      @include for-mobile {
+        padding: 24px 20px;
+        margin-bottom: 0;
+        font-size: 14px;
+      }
     }
     }
 
 
     &-search {
     &-search {
-      @extend .base_input;
-      @include placeholder {
-        color: $sidebar-popup-search-input-placeholder-color;
-      }
       background-color: $sidebar-popup-search-input-background-color;
       background-color: $sidebar-popup-search-input-background-color;
       color: $sidebar-popup-search-input-text-color;
       color: $sidebar-popup-search-input-text-color;
-      border-radius: 0 !important;
       width: 100%;
       width: 100%;
       height: 32px;
       height: 32px;
-      padding: 0 !important;
       text-indent: 20px;
       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 {
     &-list {
-      @extend .clear-list;
+      margin: 0;
+      padding: 0;
+      list-style: none;
 
 
       &-item {
       &-item {
         a, a:visited, a:hover {
         a, a:visited, a:hover {
           color: $sidebar-popup-link-text-color;
           color: $sidebar-popup-link-text-color;
           padding: 8px 20px;
           padding: 8px 20px;
           display: block;
           display: block;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+
+          @include for-mobile {
+            padding: 12px 20px;
+          }
         }
         }
 
 
         &.selected a {
         &.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;
 $font-size: 14px !default;
 
 
 $transitions-duration: 0.3s !default;
 $transitions-duration: 0.3s !default;
+$fast-transitions-duration: 0.1s !default;
+
+$mobile-max-width: 960px;
+$phone-max-width: 480px;
 
 
 /*
 /*
  * Sidebar
  * Sidebar
  */
  */
 
 
 $sidebar-width: 250px !default;
 $sidebar-width: 250px !default;
+$sidebar-header-height: 44px !default;
 
 
 $sidebar-background-color: #354052 !default;
 $sidebar-background-color: #354052 !default;
 $sidebar-contrast-background-color: #2b3647 !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-background-color: #d0dbe6 !default;
 $sidebar-popup-search-input-text-color: #6f7e95 !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-background-color: #ecf2f6 !default;
 $sidebar-popup-text-color: #6f7e95 !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-reset: "\e61e";
 $icon-search: "\e61d";
 $icon-search: "\e61d";
 $icon-user: "\e61c";
 $icon-user: "\e61c";
@@ -29,3 +33,4 @@ $icon-add: "\e603";
 $icon-add3: "\e604";
 $icon-add3: "\e604";
 $icon-expand: "\e605";
 $icon-expand: "\e605";
 $icon-checkbox: "\e606";
 $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-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-"] {
 [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 {
 .icon-reset:before {
-    content: "\e61e";
+  content: "\e61e";
 }
 }
 .icon-search:before {
 .icon-search:before {
-    content: "\e61d";
+  content: "\e61d";
 }
 }
 .icon-user:before {
 .icon-user:before {
-    content: "\e61c";
+  content: "\e61c";
 }
 }
 .icon-jet:before {
 .icon-jet:before {
-    content: "\e61b";
+  content: "\e61b";
 }
 }
 .icon-refresh:before {
 .icon-refresh:before {
-    content: "\e61a";
+  content: "\e61a";
 }
 }
 .icon-grid:before {
 .icon-grid:before {
-    content: "\e619";
+  content: "\e619";
 }
 }
 .icon-star:before {
 .icon-star:before {
-    content: "\e618";
+  content: "\e618";
 }
 }
 .icon-pin:before {
 .icon-pin:before {
-    content: "\e617";
+  content: "\e617";
 }
 }
 .icon-new:before {
 .icon-new:before {
-    content: "\e616";
+  content: "\e616";
 }
 }
 .icon-edit:before {
 .icon-edit:before {
-    content: "\e615";
+  content: "\e615";
 }
 }
 .icon-clock:before {
 .icon-clock:before {
-    content: "\e611";
+  content: "\e611";
 }
 }
 .icon-calendar:before {
 .icon-calendar:before {
-    content: "\e612";
+  content: "\e612";
 }
 }
 .icon-book:before {
 .icon-book:before {
-    content: "\e60d";
+  content: "\e60d";
 }
 }
 .icon-open-external:before {
 .icon-open-external:before {
-    content: "\e60e";
+  content: "\e60e";
 }
 }
 .icon-data:before {
 .icon-data:before {
-    content: "\e60f";
+  content: "\e60f";
 }
 }
 .icon-question:before {
 .icon-question:before {
-    content: "\e613";
+  content: "\e613";
 }
 }
 .icon-tick:before {
 .icon-tick:before {
-    content: "\e614";
+  content: "\e614";
 }
 }
 .icon-cross:before {
 .icon-cross:before {
-    content: "\e610";
+  content: "\e610";
 }
 }
 .icon-key:before {
 .icon-key:before {
-    content: "\e60c";
+  content: "\e60c";
 }
 }
 .icon-arrow-right:before {
 .icon-arrow-right:before {
-    content: "\e60b";
+  content: "\e60b";
 }
 }
 .icon-arrow-left:before {
 .icon-arrow-left:before {
-    content: "\e60a";
+  content: "\e60a";
 }
 }
 .icon-arrow-down:before {
 .icon-arrow-down:before {
-    content: "\e608";
+  content: "\e608";
 }
 }
 .icon-arrow-up:before {
 .icon-arrow-up:before {
-    content: "\e609";
+  content: "\e609";
 }
 }
 .icon-checkbox-outline:before {
 .icon-checkbox-outline:before {
-    content: "\e607";
+  content: "\e607";
 }
 }
 .icon-remove:before {
 .icon-remove:before {
-    content: "\e600";
+  content: "\e600";
 }
 }
 .icon-add2:before {
 .icon-add2:before {
-    content: "\e601";
+  content: "\e601";
 }
 }
 .icon-exit:before {
 .icon-exit:before {
-    content: "\e602";
+  content: "\e602";
 }
 }
 .icon-add:before {
 .icon-add:before {
-    content: "\e603";
+  content: "\e603";
 }
 }
 .icon-add3:before {
 .icon-add3:before {
-    content: "\e604";
+  content: "\e604";
 }
 }
 .icon-expand:before {
 .icon-expand:before {
-    content: "\e605";
+  content: "\e605";
 }
 }
 .icon-checkbox:before {
 .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";
 @import "../globals";
 
 
 .ui-widget-content {
 .ui-widget-content {
+  color: $text-color;
   border-color: $content-border-color;
   border-color: $content-border-color;
 }
 }
 
 
@@ -60,6 +61,14 @@
   color: $jquery-ui-state-highlight-text-color;
   color: $jquery-ui-state-highlight-text-color;
 }
 }
 
 
+.ui-dialog {
+  @include for-phone {
+    left: 10px !important;
+    right: 10px !important;
+    width: auto !important;
+  }
+}
+
 .ui-dialog-buttonpane {
 .ui-dialog-buttonpane {
   background: $jquery-ui-buttonpane-background;
   background: $jquery-ui-buttonpane-background;
   margin: .5em -0.2em -0.2em -0.2em;
   margin: .5em -0.2em -0.2em -0.2em;
@@ -105,4 +114,31 @@
   opacity: 0.8;
   opacity: 0.8;
   font-size: 13px;
   font-size: 13px;
   pointer-events: none;
   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 {
 .select2-container--jet {
   @import "single";
   @import "single";
   @import "multiple";
   @import "multiple";
-  min-width: 100px;
+  min-width: 240px;
+
+  @include for-phone {
+    min-width: 160px;
+  }
 
 
   .select2-selection {
   .select2-selection {
     background-color: $input-background-color;
     background-color: $input-background-color;
@@ -14,19 +18,16 @@ $input-height: 32px;
     outline: 0;
     outline: 0;
     height: $input-height;
     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 {
     .select2-selection__rendered {
       color: $input-text-color;
       color: $input-text-color;
       line-height: $input-height;
       line-height: $input-height;
       font-size: 13px;
       font-size: 13px;
-
-      .background-form & {
-        color: $background-input-text-color;
-      }
     }
     }
 
 
     .select2-selection__placeholder {
     .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-background-color: #cceae4;
 $sidebar-popup-search-input-text-color: #62a29c;
 $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-background-color: #eff6f5;
 $sidebar-popup-text-color: #62a29c;
 $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


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


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


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