ab_admin 0.9.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +28 -24
- data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +1 -1
- data/app/assets/javascripts/ab_admin/core/init.js.coffee +1 -0
- data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +21 -1
- data/app/assets/javascripts/ab_admin/core/utils.js.coffee +8 -0
- data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +1 -0
- data/app/assets/javascripts/ab_admin/main.js +1 -2
- data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.scss +44 -23
- data/app/assets/stylesheets/ab_admin/components/_colored_tabs.scss +1 -1
- data/app/assets/stylesheets/ab_admin/components/_form.scss +3 -1
- data/app/assets/stylesheets/ab_admin/components/_navigation.scss +7 -2
- data/app/assets/stylesheets/ab_admin/components/_table_view.scss +75 -9
- data/app/assets/stylesheets/ab_admin/components/_tooltip.scss +1 -0
- data/app/assets/stylesheets/ab_admin/main.scss +1 -1
- data/app/controllers/admin/assets_controller.rb +6 -2
- data/app/controllers/admin/base_controller.rb +87 -107
- data/app/controllers/admin/manager_controller.rb +17 -47
- data/app/views/ab_admin/devise/sessions/new.html.slim +2 -0
- data/app/views/admin/assets/batch_edit.html.slim +2 -1
- data/app/views/admin/base/_search_layout.html.slim +1 -1
- data/app/views/admin/base/create.js.erb +1 -1
- data/app/views/admin/base/edit.js.erb +1 -1
- data/app/views/admin/base/new.js.erb +1 -1
- data/app/views/admin/base/update.js.erb +3 -3
- data/app/views/admin/manager/_show_table.html.slim +1 -1
- data/app/views/admin/manager/_stats.html.slim +4 -0
- data/app/views/admin/manager/_table.html.slim +6 -3
- data/app/views/admin/shared/_content_actions.html.slim +22 -15
- data/app/views/admin/shared/_save_buttons.html.slim +10 -1
- data/app/views/admin/users/_form.html.slim +2 -2
- data/config/locales/en.yml +8 -13
- data/config/locales/it.yml +1 -0
- data/db/migrate/20130101000001_create_users.rb +1 -4
- data/db/migrate/20130101000003_create_assets.rb +1 -1
- data/db/migrate/20130101000004_create_headers.rb +5 -5
- data/db/migrate/20130101000005_create_static_pages.rb +2 -5
- data/db/migrate/20130101000006_create_structures.rb +1 -1
- data/db/migrate/20130101000007_base_translations.rb +43 -12
- data/db/migrate/20130101000008_create_admin_comments.rb +2 -7
- data/db/migrate/20130101000009_create_tracks.rb +4 -8
- data/lib/ab_admin/abstract_resource.rb +6 -5
- data/lib/ab_admin/carrierwave/base_uploader.rb +87 -74
- data/lib/ab_admin/carrierwave/glue.rb +0 -5
- data/lib/ab_admin/concerns/admin_addition.rb +19 -1
- data/lib/ab_admin/concerns/utilities.rb +1 -1
- data/lib/ab_admin/config/base.rb +20 -4
- data/lib/ab_admin/core_ext/array.rb +0 -5
- data/lib/ab_admin/core_ext/string.rb +1 -6
- data/lib/ab_admin/devise.rb +7 -0
- data/lib/ab_admin/engine.rb +1 -1
- data/lib/ab_admin/hooks/ckeditor_lazy.rb +13 -0
- data/lib/ab_admin/menu/base_group.rb +0 -1
- data/lib/ab_admin/menu/group.rb +2 -4
- data/lib/ab_admin/menu/item.rb +4 -8
- data/lib/ab_admin/models/asset.rb +7 -10
- data/lib/ab_admin/models/locator.rb +1 -1
- data/lib/ab_admin/models/settings.rb +2 -2
- data/lib/ab_admin/models/structure.rb +3 -3
- data/lib/ab_admin/models/track.rb +17 -5
- data/lib/ab_admin/utils/csv_document.rb +4 -4
- data/lib/ab_admin/utils/eval_helpers.rb +0 -16
- data/lib/ab_admin/utils/logger.rb +12 -2
- data/lib/ab_admin/utils/mysql.rb +2 -3
- data/lib/ab_admin/utils/xls_document.rb +1 -3
- data/lib/ab_admin/utils.rb +0 -5
- data/lib/ab_admin/version.rb +1 -1
- data/lib/ab_admin/views/admin_helpers.rb +49 -33
- data/lib/ab_admin/views/admin_navigation_helpers.rb +12 -9
- data/lib/ab_admin/views/inputs/ckeditor_input.rb +1 -5
- data/lib/ab_admin/views/manager_helpers.rb +9 -3
- data/lib/ab_admin/views/search_form_builder.rb +12 -12
- data/lib/ab_admin.rb +13 -2
- data/lib/generators/ab_admin/install/templates/models/user.rb +1 -2
- data/lib/generators/ab_admin/install/templates/uploaders/attachment_file_uploader.rb +1 -1
- data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +1 -1
- data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +16 -3
- data/lib/generators/ab_admin/resource/resource_generator.rb +0 -4
- data/lib/generators/ab_admin/resource/templates/controller.erb +0 -7
- data/lib/tasks/assets.rake +5 -5
- metadata +24 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 37fa3527a73829df6289cab5a62d20c8febcb44775f49382e53e60134654b46a
|
4
|
+
data.tar.gz: b8b0f38f589d5a828450c547238e230fb1ddfc85a0a0f598ce112e9048871434
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e73711eab1b8731969a7bd0f6060ff60926b10ff7f19bc680a58d1eca5f031828e31960e10b68b87ef674f9f8c9fe6f913e8b299de38dabc27b4efdf37bfa53
|
7
|
+
data.tar.gz: de919a75041d21e7de06cd896c87119239ae42b024d68edb1da114952f7bedb2f3d5db7d64ac606d92ea287b156250f3ad0fb5b924e8a5d0635a7c8c4a24b0d9
|
@@ -6,7 +6,10 @@ EditableForm.prototype.saveWithUrlHook = (value) ->
|
|
6
6
|
originalUrl.call(@options.scope, params)
|
7
7
|
else
|
8
8
|
params[@options.model] ||= {}
|
9
|
-
|
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').
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
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: "yyyy-mm-dd 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
|
@@ -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
|
-
|
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;
|
@@ -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:
|
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
|
-
|
25
|
-
|
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;
|
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
|
}
|
@@ -34,7 +34,7 @@ class Admin::AssetsController < ApplicationController
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def batch_update
|
37
|
-
Asset.update(params[:data].keys, params[:data].values)
|
37
|
+
Asset.update(params[:data].keys, params[:data].values.map{ _1.permit(*permitted_assets_attributes) })
|
38
38
|
@assets = Asset.find(params[:data].keys)
|
39
39
|
end
|
40
40
|
|
@@ -53,7 +53,11 @@ class Admin::AssetsController < ApplicationController
|
|
53
53
|
protected
|
54
54
|
|
55
55
|
def permitted_params
|
56
|
-
params[:asset].try!(:permit, :data,
|
56
|
+
params[:asset].try!(:permit, :data, *permitted_assets_attributes)
|
57
|
+
end
|
58
|
+
|
59
|
+
def permitted_assets_attributes
|
60
|
+
[:is_main, :original_name, :human_filename, *Asset.all_translated_attribute_names.map(&:to_sym)]
|
57
61
|
end
|
58
62
|
|
59
63
|
def find_asset
|