ab_admin 0.9.0 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +28 -24
  3. data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +1 -1
  4. data/app/assets/javascripts/ab_admin/core/init.js.coffee +1 -0
  5. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +21 -1
  6. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +8 -0
  7. data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +1 -0
  8. data/app/assets/javascripts/ab_admin/main.js +1 -2
  9. data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.scss +44 -23
  10. data/app/assets/stylesheets/ab_admin/components/_colored_tabs.scss +1 -1
  11. data/app/assets/stylesheets/ab_admin/components/_form.scss +3 -1
  12. data/app/assets/stylesheets/ab_admin/components/_navigation.scss +7 -2
  13. data/app/assets/stylesheets/ab_admin/components/_table_view.scss +75 -9
  14. data/app/assets/stylesheets/ab_admin/components/_tooltip.scss +1 -0
  15. data/app/assets/stylesheets/ab_admin/main.scss +1 -1
  16. data/app/controllers/admin/assets_controller.rb +1 -1
  17. data/app/controllers/admin/base_controller.rb +87 -107
  18. data/app/controllers/admin/manager_controller.rb +17 -47
  19. data/app/views/ab_admin/devise/sessions/new.html.slim +2 -0
  20. data/app/views/admin/assets/batch_edit.html.slim +2 -1
  21. data/app/views/admin/base/_search_layout.html.slim +1 -1
  22. data/app/views/admin/base/create.js.erb +1 -1
  23. data/app/views/admin/base/edit.js.erb +1 -1
  24. data/app/views/admin/base/new.js.erb +1 -1
  25. data/app/views/admin/base/update.js.erb +3 -3
  26. data/app/views/admin/manager/_show_table.html.slim +1 -1
  27. data/app/views/admin/manager/_stats.html.slim +4 -0
  28. data/app/views/admin/manager/_table.html.slim +6 -3
  29. data/app/views/admin/shared/_content_actions.html.slim +22 -15
  30. data/app/views/admin/shared/_save_buttons.html.slim +10 -1
  31. data/app/views/admin/users/_form.html.slim +2 -2
  32. data/config/locales/en.yml +8 -13
  33. data/config/locales/it.yml +1 -0
  34. data/db/migrate/20130101000001_create_users.rb +1 -4
  35. data/db/migrate/20130101000003_create_assets.rb +1 -1
  36. data/db/migrate/20130101000004_create_headers.rb +5 -5
  37. data/db/migrate/20130101000005_create_static_pages.rb +2 -5
  38. data/db/migrate/20130101000006_create_structures.rb +1 -1
  39. data/db/migrate/20130101000007_base_translations.rb +43 -12
  40. data/db/migrate/20130101000008_create_admin_comments.rb +2 -7
  41. data/db/migrate/20130101000009_create_tracks.rb +4 -8
  42. data/lib/ab_admin/abstract_resource.rb +6 -5
  43. data/lib/ab_admin/carrierwave/base_uploader.rb +87 -74
  44. data/lib/ab_admin/carrierwave/glue.rb +0 -5
  45. data/lib/ab_admin/concerns/admin_addition.rb +19 -1
  46. data/lib/ab_admin/concerns/utilities.rb +1 -1
  47. data/lib/ab_admin/config/base.rb +20 -4
  48. data/lib/ab_admin/core_ext/array.rb +0 -5
  49. data/lib/ab_admin/core_ext/string.rb +1 -6
  50. data/lib/ab_admin/devise.rb +7 -0
  51. data/lib/ab_admin/engine.rb +1 -1
  52. data/lib/ab_admin/hooks/ckeditor_lazy.rb +13 -0
  53. data/lib/ab_admin/menu/base_group.rb +0 -1
  54. data/lib/ab_admin/menu/group.rb +2 -4
  55. data/lib/ab_admin/menu/item.rb +4 -8
  56. data/lib/ab_admin/models/asset.rb +7 -10
  57. data/lib/ab_admin/models/locator.rb +1 -1
  58. data/lib/ab_admin/models/settings.rb +2 -2
  59. data/lib/ab_admin/models/structure.rb +3 -3
  60. data/lib/ab_admin/models/track.rb +15 -3
  61. data/lib/ab_admin/utils/csv_document.rb +4 -4
  62. data/lib/ab_admin/utils/eval_helpers.rb +0 -16
  63. data/lib/ab_admin/utils/logger.rb +12 -2
  64. data/lib/ab_admin/utils/mysql.rb +2 -3
  65. data/lib/ab_admin/utils/xls_document.rb +1 -3
  66. data/lib/ab_admin/utils.rb +0 -5
  67. data/lib/ab_admin/version.rb +1 -1
  68. data/lib/ab_admin/views/admin_helpers.rb +33 -16
  69. data/lib/ab_admin/views/admin_navigation_helpers.rb +12 -9
  70. data/lib/ab_admin/views/inputs/ckeditor_input.rb +1 -5
  71. data/lib/ab_admin/views/manager_helpers.rb +9 -3
  72. data/lib/ab_admin/views/search_form_builder.rb +12 -12
  73. data/lib/ab_admin.rb +13 -2
  74. data/lib/generators/ab_admin/install/templates/models/user.rb +1 -2
  75. data/lib/generators/ab_admin/install/templates/uploaders/attachment_file_uploader.rb +1 -1
  76. data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +1 -1
  77. data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +16 -3
  78. data/lib/generators/ab_admin/resource/resource_generator.rb +0 -4
  79. data/lib/generators/ab_admin/resource/templates/controller.erb +0 -7
  80. data/lib/tasks/assets.rake +5 -5
  81. metadata +28 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9ac96fefdb305b914a27a302af787dfd92e1bfa9ec02d6078579f26d1c49f87
4
- data.tar.gz: 59026b1d51c0d63026d8655a69e2a536fb52e919e3c3babe2abd74996757dac5
3
+ metadata.gz: 6e4cff3af876fcd7ea0ee9a0a340b10ceb31d22c2a3728910692c0048c8f0e6c
4
+ data.tar.gz: 7c66e65f59261910436f0c4d18cf069e1f94e42cec845c39bb5d7ee07de434e5
5
5
  SHA512:
6
- metadata.gz: 53db71976b5d9bfb9f0647a3c3ab1f536ee14a514d2ed3269fa468b5a94fc3c17588c1542c7c315e9a4c4853e86a7bc0ea4891890a26a4583222bd7e7ceab871
7
- data.tar.gz: d19391ed5b4323dd40cbc0df5ccc1728447f4f54c262ebbb0ec01520f6efc8af30e3bf24ee01c3ef5d5b324fb0887368e897a964c850ab63e9870e1686dff935
6
+ metadata.gz: 0c5926ca259601ec0369db9588748dc3c6b34fca63816ea9ef2adda4a238f45eb26f2f215d2337a38fe7a5061e870e0bdae466dcd46b5f51c7b0f2118e3e9084
7
+ data.tar.gz: 8ecd6b3078af74eee5d0135eb8fe1764d27f2dbd623c6e0f663d5e9b8e4e808323e968e6c87955e4f4f0c9ad7431743307b364a22a870fda1874b5a3fd9942e3
@@ -6,7 +6,10 @@ EditableForm.prototype.saveWithUrlHook = (value) ->
6
6
  originalUrl.call(@options.scope, params)
7
7
  else
8
8
  params[@options.model] ||= {}
9
- params[@options.model][params.name] = params.value
9
+ if _.isString(params.value) && params.value.match(/@\d+/)
10
+ params[@options.model][params.name] = params.value.replace('@', '')
11
+ else
12
+ params[@options.model][params.name] = params.value
10
13
  params._method = 'PATCH'
11
14
  ajax_opts =
12
15
  url: originalUrl
@@ -27,29 +30,30 @@ EditableForm.prototype.saveWithoutUrlHook = EditableForm.prototype.save
27
30
  EditableForm.prototype.save = EditableForm.prototype.saveWithUrlHook
28
31
 
29
32
  window.initInPlaceEditable = ->
30
- $('.editable').editable
31
- onblur: 'submit'
32
- placement: 'bottom'
33
- emptytext: I18n.lookup('admin.js.empty') || 'Empty'
34
- error: (response, newValue) ->
35
- log response
36
- if response.status == 422
37
- flash JSON.parse(response.responseText).errors.join(', ')
38
- else
39
- response.responseText
40
- success: (response) ->
41
- if response && $(this).data().options?.accept == 'script'
42
- $.globalEval(response.responseText)
43
- datetimepicker:
44
- format: "dd.mm.yyyy hh:ii"
45
- autoclose: true
46
- todayBtn: true
47
- language: I18n.locale
48
- ajaxOptions:
49
- xhrFields:
50
- withCredentials: true
51
- headers:
52
- Accept: 'application/json'
33
+ $('.editable').each ->
34
+ $el = $(this)
35
+ $el.editable
36
+ onblur: 'submit'
37
+ placement: 'bottom'
38
+ emptytext: $el.attr('placeholder') || I18n.t('admin.js.empty') || 'Empty'
39
+ error: (response) ->
40
+ if response.status == 422
41
+ Object.entries(response.responseJSON.errors).map((i) -> i.join(': ')).join(', ')
42
+ else
43
+ response.responseText
44
+ success: (response) ->
45
+ if response && $(this).data().options?.accept == 'script'
46
+ $.globalEval(response.responseText)
47
+ datetimepicker:
48
+ format: "dd.mm.yyyy hh:ii"
49
+ autoclose: true
50
+ todayBtn: true
51
+ language: I18n.locale
52
+ ajaxOptions:
53
+ xhrFields:
54
+ withCredentials: true
55
+ headers:
56
+ Accept: 'application/json'
53
57
 
54
58
 
55
59
  $(document).on 'admin:init', initInPlaceEditable
@@ -1,6 +1,6 @@
1
1
  $ ->
2
2
  if $('#list')[0]
3
- input_name = 'by_ids'
3
+ input_name = 'q[id_in]'
4
4
  $(document).on 'click', '#list input.toggle', ->
5
5
  checked = $(this).is(":checked")
6
6
  $("#list [name='#{input_name}[]']").attr "checked", checked
@@ -29,6 +29,7 @@ $ ->
29
29
 
30
30
  $(document).on 'admin:list_init', ->
31
31
  initPopover()
32
+ initInPlaceEditable()
32
33
 
33
34
  $(document).on 'admin:form_init', 'form', ->
34
35
  initEditor()
@@ -85,4 +85,24 @@ window.initNestedFields = (opts={}) ->
85
85
  window.initFancySelect() unless opts.skip_fancy
86
86
  window.initPickers() unless opts.skip_pickers
87
87
  window.initEditor() unless opts.skip_editor
88
- opts.callback.call(e) if opts.callback
88
+ opts.callback.call(e) if opts.callback
89
+
90
+ window.initCkeditor = (dom_id, options={}) ->
91
+ if window.CKEDITOR
92
+ CKEDITOR.replace(dom_id, options) unless CKEDITOR.instances[dom_id]
93
+ else
94
+ $.getScript $("##{dom_id}").data('cdnUrl'), ->
95
+ CKEDITOR.replaceClass = null;
96
+ CKEDITOR.replace(dom_id, options) unless CKEDITOR.instances[dom_id]
97
+
98
+ window.lazyInitCkeditor = (dom_id, options={}) ->
99
+ $el = $("##{dom_id}")
100
+ $form = $el.closest('form')
101
+ height = options.height || 200
102
+ height += if options.toolbar == 'mini' then 34 else 67
103
+ $el.height(height)
104
+ callback = (intersectionRatio) ->
105
+ initCkeditor(dom_id, options) if intersectionRatio
106
+ window.ckeditorVisibilityObserver = new IntersectionObserver (entries, observer) =>
107
+ entries.forEach(((entry) => callback(entry.intersectionRatio)), {root: $form[0]})
108
+ window.ckeditorVisibilityObserver.observe document.getElementById(dom_id)
@@ -174,3 +174,11 @@ window.localeToFlag = (l) ->
174
174
  l = {'JA': 'JP', 'EN': 'GB', 'UK': 'UA'}[l] || l
175
175
  chars = {"A":"🇦","B":"🇧","C":"🇨","D":"🇩","E":"🇪","F":"🇫","G":"🇬","H":"🇭","I":"🇮","J":"🇯","K":"🇰","L":"🇱","M":"🇲","N":"🇳","O":"🇴","P":"🇵","Q":"🇶","R":"🇷","S":"🇸","T":"🇹","U":"🇺","V":"🇻","W":"🇼","X":"🇽","Y":"🇾","Z":"🇿"}
176
176
  l.replace /[A-Z]/g, (m) -> chars[m]
177
+
178
+ window.I18n ||= {}
179
+ window.I18n.locale = 'en'
180
+ window.I18n.translations ||= {}
181
+ I18n.t = (key) ->
182
+ keys = key.split('.')
183
+ keys.unshift(I18n.locale)
184
+ _.get(I18n.translations, keys)
@@ -7,6 +7,7 @@ $ ->
7
7
  viewSelect: 'month'
8
8
  minView: 'day'
9
9
  language: I18n.locale
10
+ weekStart: 1
10
11
 
11
12
  search_form_options = _.defaults({pickerPosition: "bottom-left datetimepicker-bottom-left-custom"}, base_options)
12
13
  search_form_options_gt = _.defaults({initialDate: new Date(new Date().setHours(0,0,0,0))}, search_form_options)
@@ -1,4 +1,3 @@
1
- //= require i18n
2
1
  //= require i18n/translations
3
2
  //= require jquery.min
4
3
  //= require jquery_ujs
@@ -17,7 +16,7 @@
17
16
  //= require moment.min
18
17
  //= require ab_admin/bootstrap-editable
19
18
  //= require ab_admin/bootbox.min
20
- //= require select2
19
+ //= require select2_3_5_2/select2
21
20
  //= require ab_admin/jquery-ui-1.10.3.custom.min
22
21
  //= require jquery.ui.nestedSortable
23
22
  //= require clipboard.min
@@ -88,6 +88,15 @@ ul.nav li.dropdown:hover ul.dropdown-menu {
88
88
  width: auto;
89
89
  }
90
90
 
91
+ .label a {
92
+ color: white;
93
+ font-size: 12px;
94
+ font-weight: 500;
95
+ text-decoration: none;
96
+ border: none;
97
+ line-height: 1.4;
98
+ }
99
+
91
100
  .label-primary, .badge-primary {
92
101
  background-color: #05C;
93
102
  }
@@ -145,28 +154,6 @@ label.control-label.label-reset {
145
154
  text-align: left;
146
155
  }
147
156
 
148
- .table tbody {
149
- tr.success > td, &.success > tr > td {
150
- background-color: #dff0d8;
151
- }
152
-
153
- tr.error > td, &.error > tr > td {
154
- background-color: #f2dede;
155
- }
156
-
157
- tr.warning > td, &.warning > tr > td {
158
- background-color: #fcf8e3;
159
- }
160
-
161
- tr.muted > td, &.muted > tr > td {
162
- background-color: #ededed;
163
- }
164
-
165
- tr.info > td, &.info > tr > td {
166
- background-color: #d9edf7;
167
- }
168
- }
169
-
170
157
  .js-copy-popup {
171
158
  position: relative;
172
159
  &:before {
@@ -184,6 +171,27 @@ label.control-label.label-reset {
184
171
  top: -5px;
185
172
  }
186
173
  }
174
+
175
+ .pulse.badge-important {
176
+ cursor: pointer;
177
+ box-shadow: 0 0 0 rgba(185, 74, 72, 0.7);
178
+ animation: pulse-important 1s infinite;
179
+ }
180
+ .pulse:hover {
181
+ animation: none;
182
+ }
183
+ @keyframes pulse-important {
184
+ 0% {
185
+ box-shadow: 0 0 0 0 rgba(185, 74, 72, 0.7);
186
+ }
187
+ 70% {
188
+ box-shadow: 0 0 0 10px rgba(185, 74, 72, 0);
189
+ }
190
+ 100% {
191
+ box-shadow: 0 0 0 0 rgba(185, 74, 72, 0);
192
+ }
193
+ }
194
+
187
195
  @keyframes text-pop-up-top {
188
196
  0% {
189
197
  transform: translateY(0);
@@ -202,10 +210,23 @@ label.control-label.label-reset {
202
210
  .clear {
203
211
  clear: both;
204
212
  }
205
- .white-space-nowrap {
213
+
214
+ .white-space-nowrap, .wsn {
206
215
  white-space: nowrap;
207
216
  }
208
217
 
218
+ .text-pink {
219
+ color: #F52887;
220
+ }
221
+
222
+ .text-violet {
223
+ color: #BA55D3;
224
+ }
225
+
226
+ .text-turquoise {
227
+ color: #07d3d3;
228
+ }
229
+
209
230
  @media (max-width: 767px) {
210
231
  body, .container-fluid {
211
232
  padding: 0;
@@ -25,7 +25,7 @@
25
25
  border-top: none;
26
26
  padding: 10px;
27
27
  }
28
- margin: 20px 0;
28
+ margin: 10px 0;
29
29
  }
30
30
 
31
31
  .colored_tabs {
@@ -17,7 +17,9 @@ input[type="color"],
17
17
  .uneditable-input {
18
18
  padding: 4px;
19
19
  }
20
-
20
+ .save-error {
21
+ box-shadow: 0 0 4px 4px rgba(232,109,109,1);
22
+ }
21
23
  .simple_form {
22
24
  input, textarea.text {
23
25
  width: 100%;
@@ -36,6 +36,12 @@
36
36
  margin-bottom: 5px;
37
37
  }
38
38
 
39
+ .btn.btn-symbol {
40
+ font-size: 22px;
41
+ padding-top: 2px;
42
+ padding-bottom: 6px;
43
+ }
44
+
39
45
  .resource_actions {
40
46
  float: left;
41
47
  margin-top: -10px;
@@ -64,13 +70,12 @@
64
70
 
65
71
  #main .content_actions {
66
72
  margin-bottom: 10px;
67
- margin-left: -30px;
68
73
  .btn-group {
69
74
  float: left;
70
75
  margin-left: 10px;
71
76
  }
72
77
  > *:first-child {
73
- margin-left: 30px;
78
+ margin-left: 0;
74
79
  }
75
80
  }
76
81
 
@@ -7,6 +7,16 @@
7
7
  }
8
8
 
9
9
  table.index_table {
10
+ &.table th, &.table td {
11
+ padding: 3px 3px 5px;
12
+ }
13
+ input[type='checkbox'] {
14
+ margin-right: 5px;
15
+ margin-top: 0;
16
+ }
17
+ p {
18
+ margin: 0 0 4px;
19
+ }
10
20
  & > thead th {
11
21
  background: #EFEFEF;
12
22
  @include gradient-vertical(#EFEFEF, #DFE1E2);
@@ -21,9 +31,9 @@ table.index_table {
21
31
  color: #2E3439;
22
32
  border-right: none;
23
33
  text-align: left;
24
- padding-left: 6px;
25
- padding-right: 6px;
26
-
34
+ & > thead th a.sort_link {
35
+ white-space: normal;
36
+ }
27
37
  a, a:link, a:visited {
28
38
  text-decoration: none;
29
39
  display: block;
@@ -31,22 +41,18 @@ table.index_table {
31
41
  -webkit-font-smoothing: antialiased;
32
42
  color: #2E3439;
33
43
  }
34
-
35
44
  a:hover {
36
45
  color: #2E3439;
37
46
  }
38
-
39
47
  &.sortable a {
40
- background: url("/images/admin/orderable.png") no-repeat 0 4px; padding-left: 13px;
48
+ background: url("/images/admin/orderable.png") no-repeat 0 4px;
49
+ padding-left: 13px;
41
50
  }
42
-
43
51
  &.sorted-asc a { background-position: 0 -27px; }
44
52
  &.sorted-desc a { background-position: 0 -56px;}
45
-
46
53
  &.sorted-asc, &.sorted-desc {
47
54
  @include gradient-vertical(#e2e2e2, #d2d4d6);
48
55
  }
49
-
50
56
  &:last-child {
51
57
  border-right: solid 1px #d4d4d4;
52
58
  }
@@ -130,6 +136,66 @@ table.index_table {
130
136
  }
131
137
  }
132
138
 
139
+ @mixin colored_row($color) {
140
+ background-color: $color !important;
141
+ & > td, &:hover > td {
142
+ background-color: $color !important;
143
+ }
144
+ }
145
+ .table tbody {
146
+ .bg-green {
147
+ @include colored_row(#a4f58a);
148
+ }
149
+ .bg-skyblue {
150
+ @include colored_row(#9de8f7);
151
+ }
152
+ .bg-blue {
153
+ @include colored_row(#bbddfb);
154
+ }
155
+ .bg-orange {
156
+ @include colored_row(#fce492);
157
+ }
158
+ .bg-yellow {
159
+ @include colored_row(#ffefd5);
160
+ }
161
+ .bg-pink {
162
+ @include colored_row(#f2c0db);
163
+ }
164
+ .bg-violet {
165
+ @include colored_row(#f0dcff);
166
+ }
167
+ .bg-violet-dark {
168
+ @include colored_row(#d8c0ff);
169
+ }
170
+ .bg-grey {
171
+ @include colored_row(#eaeaea);
172
+ color: #828282;
173
+ }
174
+ .bg-turquoise {
175
+ @include colored_row(#ddfff3fc);
176
+ }
177
+ .success {
178
+ @include colored_row(#dff0d8);
179
+ }
180
+ .error {
181
+ @include colored_row(#f2dede);
182
+ }
183
+ .warning {
184
+ @include colored_row(#fcf8e3);
185
+ }
186
+ .info {
187
+ @include colored_row(#d9edf7);
188
+ }
189
+ .bg-lemon {
190
+ @include colored_row(#d7ff76);
191
+ }
192
+ }
193
+ .muted {
194
+ & > td, &:hover > td {
195
+ background-color: #ededed !important;
196
+ }
197
+ }
198
+
133
199
  #batch_action_form {
134
200
  margin-bottom: 10px;
135
201
  }
@@ -9,6 +9,7 @@
9
9
  color: white;
10
10
  opacity: 0;
11
11
  z-index: -100;
12
+ pointer-events: none;
12
13
  }
13
14
 
14
15
  //.tool::before,
@@ -1,5 +1,5 @@
1
1
  //= require bootstrap-wysihtml5
2
- //= require select2
2
+ //= require select2_3_5_2/select2
3
3
  //= require ab_admin/bootstrap_and_overrides
4
4
  //= require ab_admin/bootstrap-editable
5
5
  //= require ab_admin/bootstrap-datetimepicker
@@ -53,7 +53,7 @@ class Admin::AssetsController < ApplicationController
53
53
  protected
54
54
 
55
55
  def permitted_params
56
- params[:asset].try!(:permit, :data, :is_main, :original_name, :base_filename, *Asset.all_translated_attribute_names)
56
+ params[:asset].try!(:permit, :data, :is_main, :original_name, :human_filename, *Asset.all_translated_attribute_names)
57
57
  end
58
58
 
59
59
  def find_asset