ab_admin 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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