slash_admin 1.3.1 → 1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -11
- data/app/assets/config/slash_admin_manifest.js +2 -2
- data/app/assets/javascripts/slash_admin/application.js +6 -5
- data/app/assets/stylesheets/slash_admin/application.scss +58 -59
- data/app/controllers/slash_admin/models_controller.rb +6 -2
- data/app/helpers/slash_admin/application_helper.rb +2 -0
- data/app/views/slash_admin/base/_translatable_fields.html.erb +4 -4
- data/app/views/slash_admin/custom_fields/_select.html.erb +9 -3
- data/app/views/slash_admin/custom_fields/_timezone.html.erb +4 -1
- data/app/views/slash_admin/fields/_belongs_to.html.erb +1 -1
- data/app/views/slash_admin/fields/_has_one.html.erb +1 -1
- data/app/views/slash_admin/fields/_nested_belongs_to.html.erb +1 -1
- data/app/views/slash_admin/security/sessions/new.html.erb +1 -1
- data/app/views/slash_admin/shared/_header.html.erb +2 -2
- data/app/views/slash_admin/shared/_menu.html.erb +2 -2
- data/lib/generators/slash_admin/install/install_generator.rb +2 -0
- data/lib/generators/slash_admin/install/templates/initializer.rb +6 -0
- data/lib/slash_admin.rb +16 -0
- data/lib/slash_admin/engine.rb +7 -1
- data/lib/slash_admin/version.rb +1 -1
- data/vendor/assets/javascripts/select2/i18n/en.js +3 -0
- data/vendor/assets/javascripts/select2/i18n/fr.js +3 -0
- data/vendor/assets/javascripts/{select2.min.js → select2/select2.min.js} +0 -0
- data/vendor/assets/stylesheets/{select2-bootstrap4.css → select2/select2-bootstrap4.css} +0 -0
- data/vendor/assets/stylesheets/{select2.min.css → select2/select2.min.css} +0 -0
- metadata +11 -9
- data/config/initializers/pagy.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa8f3a52be4da9f7ddc2f3a4888ed7affa7a49aeeeecca3b54b6413d92fad5f5
|
4
|
+
data.tar.gz: 10bda4bc75d87a697aedb1d5f8ee48d0f5203892aeebb9d7d985a2dc8a509897
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a057c62b96bc937e332365d5b1277e598f4839af757ca616000e5f06da51a1c043087ab4ed20e18b1071f1881c2639306c0c319a74d8ba5c7a9df2e152e229ff
|
7
|
+
data.tar.gz: 054aee793717a4df3bcb2aeccc26fea5e21286e7a1e2bd25d5a3e97b0be11b1962356f380bfa7e7a7342066f51a7001ba22cc10b54c43a912cc6fcb3e33fd8a7
|
data/README.md
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
<p align="center">
|
2
|
-
<img width="250" src="https://i.imgur.com/
|
2
|
+
<img width="250" src="https://i.imgur.com/mm9gXtL.png" />
|
3
3
|
</p>
|
4
4
|
|
5
5
|
# SlashAdmin
|
6
6
|
|
7
7
|
[![Gem Version](https://badge.fury.io/rb/slash_admin.svg)](https://badge.fury.io/rb/slash_admin)
|
8
|
-
[![Code Climate](https://codeclimate.com/github/nicovak/slash_admin/badges/gpa.svg)](https://codeclimate.com/github/nicovak/slash_admin)
|
9
8
|
[![CircleCI](https://circleci.com/gh/nicovak/slash_admin/tree/master.svg?style=svg&circle-token=6e9ebd7fef3ebc881c75a769b0970808024a2ae9)](https://circleci.com/gh/nicovak/slash_admin/tree/master)
|
10
9
|
|
11
|
-
A modern and fully
|
12
|
-
|
10
|
+
A modern and fully customizable admin, just the rails way.
|
11
|
+
Embedded admin user and authentication system, devise is not needded.
|
13
12
|
|
14
13
|
❤️ [Demo repository](https://github.com/nicovak/slash_admin_demo)
|
15
14
|
🚀 [Live running](https://slashadmin.herokuapp.com/admin)
|
@@ -21,7 +20,7 @@ Password
|
|
21
20
|
`admin@admin`
|
22
21
|
|
23
22
|
#### Motivation:
|
24
|
-
- Provide to
|
23
|
+
- Provide to Ruby On Rails the admin it deserves without DSL or obscure logic.
|
25
24
|
- Provide an easy to use and modern experience to final users.
|
26
25
|
|
27
26
|
I tried to take the best from two greats existing gem:
|
@@ -34,37 +33,42 @@ Design inspired from the awesome metronic admin theme:
|
|
34
33
|
#### Screenshots
|
35
34
|
|
36
35
|
##### Login
|
37
|
-
![Image of Login screen](https://i.imgur.com/
|
36
|
+
![Image of Login screen](https://i.imgur.com/ftwC0rF.png)
|
38
37
|
##### Dashboard
|
39
|
-
![Image of Dashboard](https://i.imgur.com/
|
38
|
+
![Image of Dashboard](https://i.imgur.com/3JzkvoT.png)
|
40
39
|
##### List
|
41
|
-
![Image of List](https://i.imgur.com/
|
40
|
+
![Image of List](https://i.imgur.com/y6Vz6S1.png)
|
42
41
|
##### Edit / Create
|
43
|
-
![Image of Create / Edit](https://i.imgur.com/
|
42
|
+
![Image of Create / Edit](https://i.imgur.com/S2QqHWF.png)
|
44
43
|
|
45
44
|
### Installation
|
46
45
|
|
47
46
|
Add this line to your application's Gemfile:
|
47
|
+
|
48
48
|
```ruby
|
49
49
|
gem 'slash_admin'
|
50
50
|
```
|
51
51
|
|
52
|
-
|
52
|
+
Then execute:
|
53
|
+
|
53
54
|
```bash
|
54
55
|
$ bundle install
|
55
56
|
```
|
56
57
|
|
57
58
|
Or install it yourself as:
|
59
|
+
|
58
60
|
```bash
|
59
61
|
$ gem install slash_admin
|
60
62
|
```
|
61
63
|
|
62
64
|
Gemfile
|
65
|
+
|
63
66
|
```
|
64
67
|
gem 'carrierwave'
|
65
68
|
```
|
66
69
|
|
67
70
|
Then:
|
71
|
+
|
68
72
|
```bash
|
69
73
|
$ rails g slash_admin:install
|
70
74
|
$ rails slash_admin:install:migrations
|
@@ -77,13 +81,36 @@ $ rails db:migrate
|
|
77
81
|
Mime::Type.register "application/xls", :xls
|
78
82
|
```
|
79
83
|
|
84
|
+
If your apps uses Sprockets 4+, you'll need to add SlashAdmin assets to your `manifest.js` file. To do this, add these two lines to the file:
|
85
|
+
|
86
|
+
`app/assets/config/manifest.js`
|
87
|
+
|
88
|
+
```
|
89
|
+
//= link administrate/application.css
|
90
|
+
//= link administrate/application.js
|
91
|
+
```
|
92
|
+
|
93
|
+
`config/routes.rb`
|
94
|
+
|
80
95
|
```ruby
|
81
96
|
Rails.application.routes.draw do
|
82
97
|
mount SlashAdmin::Engine => "/"
|
83
98
|
end
|
84
99
|
```
|
85
100
|
|
86
|
-
Mounted as '/' but prefixed in the gem and in routes definition of models admin. See above.
|
101
|
+
Mounted as '/' but prefixed in the gem and in routes definition of models admin. See the full example above.
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
Rails.application.routes.draw do
|
105
|
+
mount SlashAdmin::Engine => "/"
|
106
|
+
|
107
|
+
namespace :slash_admin, path: "/admin" do
|
108
|
+
scope module: 'models' do
|
109
|
+
resources :pages # assume Page model
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
```
|
87
114
|
|
88
115
|
### Important
|
89
116
|
|
@@ -1,3 +1,3 @@
|
|
1
1
|
//= link_tree ../images
|
2
|
-
//=
|
3
|
-
//=
|
2
|
+
//= link_tree ../javascripts
|
3
|
+
//= link_tree ../stylesheets
|
@@ -5,7 +5,9 @@
|
|
5
5
|
//= require jquery_ujs
|
6
6
|
//= require popper
|
7
7
|
//= require bootstrap
|
8
|
-
//= require select2.min
|
8
|
+
//= require select2/select2.min
|
9
|
+
//= require select2/i18n/fr
|
10
|
+
//= require select2/i18n/en
|
9
11
|
//= require moment
|
10
12
|
//= require moment/fr
|
11
13
|
//= require bootstrap-material-datetimepicker
|
@@ -205,12 +207,12 @@ function init() {
|
|
205
207
|
|
206
208
|
|
207
209
|
$(".select2-single, .select2-multiple").each (function() {
|
208
|
-
|
210
|
+
var initialPlaceholder = $(this).attr('data-placeholder') || I18n.t('slash_admin.view.select');
|
211
|
+
|
209
212
|
$(this).select2({
|
210
213
|
placeholder: initialPlaceholder,
|
211
214
|
allowClear: true,
|
212
215
|
theme: 'bootstrap4',
|
213
|
-
debug: true,
|
214
216
|
}).on("select2:unselecting", function (e) {
|
215
217
|
$(this).data('state', 'unselected');
|
216
218
|
}).on("select2:open", function (e) {
|
@@ -226,13 +228,12 @@ function init() {
|
|
226
228
|
});
|
227
229
|
|
228
230
|
$(".select2-model-multiple, .select2-model-single").each(function() {
|
229
|
-
|
231
|
+
var initialPlaceholder = $(this).attr('data-placeholder') || I18n.t('slash_admin.view.select');
|
230
232
|
|
231
233
|
$(this).select2({
|
232
234
|
placeholder: initialPlaceholder,
|
233
235
|
allowClear: true,
|
234
236
|
theme: 'bootstrap4',
|
235
|
-
debug: true,
|
236
237
|
ajax: {
|
237
238
|
url: Routes.slash_admin_remote_select_path({
|
238
239
|
format: "json"
|
@@ -1,37 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
*= require bootstrap-datepicker.min
|
20
|
-
*= require bootstrap-material-datetimepicker
|
21
|
-
*= require jquery.tagsinput-revisited.min
|
22
|
-
*= require jquery.minicolors
|
23
|
-
*= require slash_admin/colors
|
24
|
-
*= require slash_admin/alert
|
25
|
-
*= require codemirror/codemirror
|
26
|
-
*= require codemirror/theme/relax-seti
|
27
|
-
*= require codemirror/lint/lint
|
28
|
-
*= require_self
|
29
|
-
*= require slash_admin/custom
|
30
|
-
*= require_tree .
|
31
|
-
*/
|
32
|
-
|
33
|
-
@import "./colors";
|
34
|
-
@import "./alert";
|
1
|
+
@import "animate";
|
2
|
+
@import "toastr";
|
3
|
+
@import "jquery.nestable";
|
4
|
+
@import "sweetalert";
|
5
|
+
@import "select2/select2.min";
|
6
|
+
@import "select2/select2-bootstrap4";
|
7
|
+
@import "bootstrap-datepicker.min";
|
8
|
+
@import "bootstrap-material-datetimepicker";
|
9
|
+
@import "jquery.tagsinput-revisited.min";
|
10
|
+
@import "jquery.minicolors";
|
11
|
+
@import "slash_admin/colors";
|
12
|
+
@import "slash_admin/alert";
|
13
|
+
@import "slash_admin/custom";
|
14
|
+
@import "codemirror/codemirror";
|
15
|
+
@import "codemirror/theme/relax-seti";
|
16
|
+
@import "codemirror/lint/lint";
|
17
|
+
@import "colors";
|
18
|
+
@import "alert";
|
35
19
|
|
36
20
|
$pagination-padding-y: 0.4rem !default;
|
37
21
|
$pagination-border-width: 0 !default;
|
@@ -155,7 +139,8 @@ p[data-f-id="pbf"] {
|
|
155
139
|
}
|
156
140
|
|
157
141
|
.select2-container--bootstrap4 .select2-results__option--highlighted,
|
158
|
-
.select2-container--bootstrap4
|
142
|
+
.select2-container--bootstrap4
|
143
|
+
.select2-results__option--highlighted.select2-results__option[aria-selected="true"] {
|
159
144
|
background-color: $primary;
|
160
145
|
color: white;
|
161
146
|
}
|
@@ -178,20 +163,27 @@ p[data-f-id="pbf"] {
|
|
178
163
|
background: $input;
|
179
164
|
}
|
180
165
|
|
181
|
-
.select2-container--bootstrap4
|
166
|
+
.select2-container--bootstrap4
|
167
|
+
.select2-selection--multiple
|
168
|
+
.select2-selection__choice {
|
182
169
|
word-break: break-all;
|
183
170
|
background: white;
|
184
171
|
}
|
185
172
|
|
186
173
|
.select2-container .select2-results__option--highlighted,
|
187
|
-
.select2-container
|
188
|
-
|
174
|
+
.select2-container
|
175
|
+
.select2-results__option--highlighted.select2-results__option[aria-selected="true"],
|
176
|
+
.select2-container--bootstrap4
|
177
|
+
.select2-dropdown
|
178
|
+
.select2-results__option[aria-selected="true"] {
|
189
179
|
background-color: $primary;
|
190
180
|
color: white;
|
191
181
|
}
|
192
182
|
|
193
|
-
.select2-container--bootstrap4.select2-container--focus
|
194
|
-
|
183
|
+
.select2-container--bootstrap4.select2-container--focus
|
184
|
+
.select2-selection--multiple,
|
185
|
+
.select2-container--bootstrap4.select2-container--focus
|
186
|
+
.select2-selection--single {
|
195
187
|
border: 1px solid $border;
|
196
188
|
background: $input;
|
197
189
|
}
|
@@ -211,7 +203,9 @@ p[data-f-id="pbf"] {
|
|
211
203
|
background: none;
|
212
204
|
}
|
213
205
|
|
214
|
-
.select2-container--bootstrap4
|
206
|
+
.select2-container--bootstrap4
|
207
|
+
.select2-search--dropdown
|
208
|
+
.select2-search__field {
|
215
209
|
border-color: $border;
|
216
210
|
}
|
217
211
|
|
@@ -397,18 +391,18 @@ p[data-f-id="pbf"] {
|
|
397
391
|
position: relative;
|
398
392
|
height: 80px;
|
399
393
|
width: 100%;
|
400
|
-
transition: all ease .6s;
|
394
|
+
transition: all ease 0.6s;
|
401
395
|
}
|
402
396
|
|
403
397
|
.image-overlay {
|
404
|
-
transition: all ease .6s;
|
398
|
+
transition: all ease 0.6s;
|
405
399
|
position: absolute;
|
406
400
|
width: 100%;
|
407
401
|
height: 100%;
|
408
|
-
background: rgba($primary,
|
402
|
+
background: rgba($primary, 0);
|
409
403
|
|
410
404
|
.icon-zoom-image {
|
411
|
-
transition: all ease .6s;
|
405
|
+
transition: all ease 0.6s;
|
412
406
|
position: absolute;
|
413
407
|
top: 50%;
|
414
408
|
left: 50%;
|
@@ -418,7 +412,7 @@ p[data-f-id="pbf"] {
|
|
418
412
|
}
|
419
413
|
|
420
414
|
&:hover {
|
421
|
-
background: rgba($primary, .4);
|
415
|
+
background: rgba($primary, 0.4);
|
422
416
|
|
423
417
|
.icon-zoom-image {
|
424
418
|
opacity: 1;
|
@@ -589,10 +583,6 @@ p[data-f-id="pbf"] {
|
|
589
583
|
display: flex;
|
590
584
|
align-items: center;
|
591
585
|
|
592
|
-
&:hover {
|
593
|
-
background: #f9fafc;
|
594
|
-
}
|
595
|
-
|
596
586
|
&.active {
|
597
587
|
color: $textColorHover;
|
598
588
|
}
|
@@ -869,9 +859,10 @@ p[data-f-id="pbf"] {
|
|
869
859
|
display: none;
|
870
860
|
padding: 9px 15px;
|
871
861
|
|
872
|
-
tr,
|
862
|
+
tr,
|
863
|
+
a {
|
873
864
|
color: $textColor;
|
874
|
-
transition: all .6s ease;
|
865
|
+
transition: all 0.6s ease;
|
875
866
|
cursor: pointer;
|
876
867
|
|
877
868
|
&.active {
|
@@ -1051,7 +1042,7 @@ p[data-f-id="pbf"] {
|
|
1051
1042
|
border-color: rgba(121, 133, 166, 0.1) !important;
|
1052
1043
|
margin-top: 1rem;
|
1053
1044
|
background: #fff;
|
1054
|
-
font-size: .9em;
|
1045
|
+
font-size: 0.9em;
|
1055
1046
|
|
1056
1047
|
.fit {
|
1057
1048
|
white-space: nowrap;
|
@@ -1085,8 +1076,12 @@ p[data-f-id="pbf"] {
|
|
1085
1076
|
margin-top: 0.5rem;
|
1086
1077
|
}
|
1087
1078
|
|
1088
|
-
.select2-container--bootstrap4
|
1089
|
-
|
1079
|
+
.select2-container--bootstrap4
|
1080
|
+
.select2-selection--single
|
1081
|
+
.select2-selection__choice,
|
1082
|
+
.select2-container--bootstrap4
|
1083
|
+
.select2-selection--multiple
|
1084
|
+
.select2-selection__choice {
|
1090
1085
|
display: flex;
|
1091
1086
|
clear: both;
|
1092
1087
|
}
|
@@ -1350,7 +1345,9 @@ p[data-f-id="pbf"] {
|
|
1350
1345
|
height: 45px;
|
1351
1346
|
}
|
1352
1347
|
|
1353
|
-
.cookies-eu,
|
1348
|
+
.cookies-eu,
|
1349
|
+
.cookies-eu-button-holder,
|
1350
|
+
.cookies-eu-content-holder {
|
1354
1351
|
display: flex;
|
1355
1352
|
line-height: normal;
|
1356
1353
|
}
|
@@ -1397,7 +1394,7 @@ p[data-f-id="pbf"] {
|
|
1397
1394
|
}
|
1398
1395
|
|
1399
1396
|
label {
|
1400
|
-
font-size: .85em;
|
1397
|
+
font-size: 0.85em;
|
1401
1398
|
color: $textColor;
|
1402
1399
|
text-transform: uppercase;
|
1403
1400
|
margin-bottom: 0.25rem;
|
@@ -1411,7 +1408,9 @@ p[data-f-id="pbf"] {
|
|
1411
1408
|
a {
|
1412
1409
|
color: $textColor;
|
1413
1410
|
|
1414
|
-
&:hover,
|
1411
|
+
&:hover,
|
1412
|
+
&:focus,
|
1413
|
+
&:active {
|
1415
1414
|
color: $primary;
|
1416
1415
|
}
|
1417
1416
|
}
|
@@ -1439,7 +1438,7 @@ p[data-f-id="pbf"] {
|
|
1439
1438
|
}
|
1440
1439
|
|
1441
1440
|
.sub-title {
|
1442
|
-
font-size: .9em;
|
1441
|
+
font-size: 0.9em;
|
1443
1442
|
color: $textColor;
|
1444
1443
|
}
|
1445
1444
|
|
@@ -11,7 +11,7 @@ module SlashAdmin
|
|
11
11
|
before_action :handle_default_params
|
12
12
|
before_action :handle_assocations
|
13
13
|
|
14
|
-
helper_method :list_params, :export_params, :create_params, :update_params, :show_params, :nested_params, :should_add_translatable?, :translatable_params, :tooltips
|
14
|
+
helper_method :list_params, :export_params, :create_params, :update_params, :show_params, :nested_params, :should_add_translatable?, :translatable_params, :available_locales, :tooltips
|
15
15
|
|
16
16
|
def index
|
17
17
|
authorize! :index, @model_class
|
@@ -386,7 +386,7 @@ module SlashAdmin
|
|
386
386
|
end
|
387
387
|
|
388
388
|
def handle_default_translations
|
389
|
-
|
389
|
+
available_locales.reject { |key| key == :root }.each do |locale|
|
390
390
|
translation = @model.translations.find_by_locale locale.to_s
|
391
391
|
if translation.nil?
|
392
392
|
@model.translations.build locale: locale
|
@@ -402,6 +402,10 @@ module SlashAdmin
|
|
402
402
|
params[:filters] ||= []
|
403
403
|
end
|
404
404
|
|
405
|
+
def available_locales
|
406
|
+
SlashAdmin.configuration.available_locales
|
407
|
+
end
|
408
|
+
|
405
409
|
def handle_assocations
|
406
410
|
@belongs_to_fields = @model_class.reflect_on_all_associations(:belongs_to).map(&:name)
|
407
411
|
@has_many_fields = @model_class.reflect_on_all_associations(:has_many).map(&:name)
|
@@ -1,15 +1,15 @@
|
|
1
1
|
<% if should_add_translatable? %>
|
2
2
|
<h3 class="translations"><%= t('slash_admin.view.translations') %></h3>
|
3
3
|
<nav class="nav nav-tabs" id="language-tabs" role="tablist">
|
4
|
-
<%
|
5
|
-
<a class="nav-item nav-link <%=
|
4
|
+
<% available_locales.each do |locale| %>
|
5
|
+
<a class="nav-item nav-link <%= available_locales.first == locale ? 'active' : '' %>" id="nav-language-<%= locale %>" data-toggle="tab" href="#language-<%= locale %>" role="tab" aria-controls="language-<%= locale %>">
|
6
6
|
<img src='<%= image_path("slash_admin/#{locale.to_s}.png") %>' style="margin-right: 5px; max-width: 25px;">
|
7
7
|
</a>
|
8
8
|
<% end %>
|
9
9
|
</nav>
|
10
10
|
<div class="tab-content">
|
11
|
-
<%
|
12
|
-
<div class="tab-pane fade <%=
|
11
|
+
<% available_locales.each do |locale| %>
|
12
|
+
<div class="tab-pane fade <%= available_locales.first == locale ? 'show active' : '' %>" id="language-<%= locale %>" role="tabpanel" aria-labelledby="language-<%= locale %>-tab">
|
13
13
|
<%= f.globalize_fields_for locale do |g| %>
|
14
14
|
<% translatable_params.each do |a| %>
|
15
15
|
<%= render 'slash_admin/fields/form_group', f: g, a: a %>
|
@@ -1,7 +1,13 @@
|
|
1
1
|
<%= f.label a.keys.first, class: "form-control-label #{required?(f.object, a) ? 'required' : ''}" %>
|
2
2
|
<%= render 'slash_admin/shared/tooltip', a: a %>
|
3
|
-
<% if a[a.keys.first][:multiple].present?
|
4
|
-
<%= f.select(a.keys.first, a[a.keys.first][:choices],
|
3
|
+
<% if a[a.keys.first][:multiple].present? %>
|
4
|
+
<%= f.select(a.keys.first, a[a.keys.first][:choices],
|
5
|
+
{ include_blank: a[a.keys.first][:include_blank], required: required?(f.object, a) },
|
6
|
+
'data-placeholder': t('slash_admin.view.select_model', model_name: @model_class.human_attribute_name(a.keys.first).singularize.downcase),
|
7
|
+
class: 'form-control select2-multiple', multiple: true) %>
|
5
8
|
<% else %>
|
6
|
-
<%= f.select(a.keys.first, a[a.keys.first][:choices],
|
9
|
+
<%= f.select(a.keys.first, a[a.keys.first][:choices],
|
10
|
+
{ include_blank: a[a.keys.first][:include_blank], required: required?(f.object, a) },
|
11
|
+
'data-placeholder': t('slash_admin.view.select_model', model_name: @model_class.human_attribute_name(a.keys.first).singularize.downcase),
|
12
|
+
class: 'form-control select2-single') %>
|
7
13
|
<% end %>
|
@@ -1,3 +1,6 @@
|
|
1
1
|
<%= f.label a.keys.first, class: "form-control-label #{required?(f.object, a) ? 'required' : ''}" %>
|
2
2
|
<%= render 'slash_admin/shared/tooltip', a: a %>
|
3
|
-
<%= f.select(a.keys.first, ActiveSupport::TimeZone::MAPPING.values,
|
3
|
+
<%= f.select(a.keys.first, ActiveSupport::TimeZone::MAPPING.values,
|
4
|
+
{ include_blank: true, required: required?(f.object, a) },
|
5
|
+
'data-placeholder': t('slash_admin.view.select_model', model_name: @model_class.human_attribute_name(a.keys.first).singularize.downcase),
|
6
|
+
class: 'form-control select2-single') %>
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<%= f.collection_select a.to_s + '_id',
|
4
4
|
class_name_from_association(f.object, a).constantize.all.order(f.object.send(a).present? ? "CASE WHEN id = #{f.object.send(a).try(:id)} THEN 1 ELSE 0 END DESC" : "id DESC").limit(20), :id, object_label(class_name_from_association(f.object, a)),
|
5
5
|
{
|
6
|
-
|
6
|
+
include_blank: true,
|
7
7
|
},
|
8
8
|
'data-placeholder': t('slash_admin.view.select_model', model_name: class_name_from_association(f.object, a).constantize.model_name.human.downcase),
|
9
9
|
'data-model': class_name_from_association(f.object, a).constantize.model_name.to_s.underscore,
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<%= f.select a.to_s,
|
4
4
|
class_name_from_association(f.object, a).constantize.all.order(f.object.send(a).present? ? "CASE WHEN id = #{f.object.send(a).try(:id)} THEN 1 ELSE 0 END DESC" : "id DESC").limit(20).collect { |assoc| [assoc.send(object_label(class_name_from_association(f.object, a))), assoc.id] },
|
5
5
|
{
|
6
|
-
|
6
|
+
include_blank: true,
|
7
7
|
},
|
8
8
|
'data-placeholder': t('slash_admin.view.select_model', model_name: class_name_from_association(f.object, a).constantize.model_name.human.downcase),
|
9
9
|
'data-model': class_name_from_association(f.object, a).constantize.model_name.to_s.underscore,
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<%= f.collection_select a.to_s + '_id',
|
5
5
|
class_name_from_association.constantize.all.order(f.object.send(a).present? ? "CASE WHEN id = #{f.object.send(a).try(:id)} THEN 1 ELSE 0 END DESC" : "id DESC").limit(20), :id, object_label(a),
|
6
6
|
{
|
7
|
-
|
7
|
+
include_blank: true,
|
8
8
|
},
|
9
9
|
'data-placeholder': t('slash_admin.view.select_model', model_name: class_name_from_association.constantize.model_name.human.downcase),
|
10
10
|
'data-model': class_name_from_association.constantize.model_name.to_s.underscore,
|
@@ -27,7 +27,7 @@
|
|
27
27
|
</div>
|
28
28
|
</div>
|
29
29
|
<div class="col-lg-6 col-md-4 d-none d-sm-none d-md-flex ">
|
30
|
-
<div class="container-fluid container-fluid-devise bckg-login" align="center" style="background: url(https://source.unsplash.com/
|
30
|
+
<div class="container-fluid container-fluid-devise bckg-login" align="center" style="background: url(https://source.unsplash.com/collection/827743/960x1080) no-repeat; background-size: cover;">
|
31
31
|
</div>
|
32
32
|
</div>
|
33
33
|
</div>
|
@@ -10,8 +10,8 @@
|
|
10
10
|
<div class="navbar-nav mr-auto mt-2 mt-lg-0">
|
11
11
|
</div>
|
12
12
|
<ul class="nav right-nav-fix">
|
13
|
-
<li class="nav-item
|
14
|
-
<a class="nav-link
|
13
|
+
<li class="nav-item">
|
14
|
+
<a class="nav-link">
|
15
15
|
<% if current_admin.avatar.present? %>
|
16
16
|
<img src="<%= current_admin.avatar.url %>" class="rounded-circle"/>
|
17
17
|
<% else %>
|
@@ -74,8 +74,8 @@
|
|
74
74
|
<script type="text/javascript">
|
75
75
|
$(function() {
|
76
76
|
$(".clickable-row").click(function() {
|
77
|
-
|
78
|
-
|
77
|
+
var href = $(this).data("href");
|
78
|
+
var blank = $(this).data("blank");
|
79
79
|
|
80
80
|
if (blank === true) {
|
81
81
|
window.open = href;
|
data/lib/slash_admin.rb
CHANGED
@@ -23,4 +23,20 @@ require "http_accept_language"
|
|
23
23
|
require "batch_translation"
|
24
24
|
|
25
25
|
module SlashAdmin
|
26
|
+
class << self
|
27
|
+
attr_accessor :configuration
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.configure
|
31
|
+
self.configuration ||= Configuration.new
|
32
|
+
yield(configuration)
|
33
|
+
end
|
34
|
+
|
35
|
+
class Configuration
|
36
|
+
attr_accessor :available_locales
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
@available_locales = I18n.available_locales
|
40
|
+
end
|
41
|
+
end
|
26
42
|
end
|
data/lib/slash_admin/engine.rb
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
+
require "pagy"
|
2
|
+
require "pagy/extras/bootstrap"
|
3
|
+
require "pagy/extras/i18n"
|
4
|
+
require "pagy/extras/array"
|
5
|
+
|
1
6
|
module SlashAdmin
|
2
7
|
class Engine < ::Rails::Engine
|
3
8
|
isolate_namespace SlashAdmin
|
4
9
|
|
5
10
|
initializer "slash_admin.assets.precompile" do |app|
|
6
|
-
app.config.assets.precompile += %w
|
11
|
+
app.config.assets.precompile += %w(slash_admin slash_admin_manifest.js)
|
12
|
+
app.config.assets.paths << Pagy.root.join("javascripts")
|
7
13
|
end
|
8
14
|
end
|
9
15
|
end
|
data/lib/slash_admin/version.rb
CHANGED
@@ -0,0 +1,3 @@
|
|
1
|
+
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
|
2
|
+
|
3
|
+
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();
|
@@ -0,0 +1,3 @@
|
|
1
|
+
/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
|
2
|
+
|
3
|
+
!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}();
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slash_admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: '1.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KOVACS Nicolas
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -389,7 +389,6 @@ files:
|
|
389
389
|
- app/views/slash_admin/shared/_new_form_buttons.html.erb
|
390
390
|
- app/views/slash_admin/shared/_sub_header.html.erb
|
391
391
|
- app/views/slash_admin/shared/_tooltip.html.erb
|
392
|
-
- config/initializers/pagy.rb
|
393
392
|
- config/initializers/validators.rb
|
394
393
|
- config/locales/en.yml
|
395
394
|
- config/locales/fr.yml
|
@@ -399,6 +398,7 @@ files:
|
|
399
398
|
- lib/generators/slash_admin/controllers/controllers_generator.rb
|
400
399
|
- lib/generators/slash_admin/controllers/templates/controllers.erb
|
401
400
|
- lib/generators/slash_admin/install/install_generator.rb
|
401
|
+
- lib/generators/slash_admin/install/templates/initializer.rb
|
402
402
|
- lib/generators/slash_admin/install/templates/install.erb
|
403
403
|
- lib/generators/slash_admin/override_admin/override_admin_generator.rb
|
404
404
|
- lib/generators/slash_admin/override_admin/templates/admin.erb
|
@@ -420,7 +420,9 @@ files:
|
|
420
420
|
- vendor/assets/javascripts/codemirror/mode/javascript.js
|
421
421
|
- vendor/assets/javascripts/jquery.nestable.js
|
422
422
|
- vendor/assets/javascripts/jquery.tagsinput-revisited.min.js
|
423
|
-
- vendor/assets/javascripts/select2.
|
423
|
+
- vendor/assets/javascripts/select2/i18n/en.js
|
424
|
+
- vendor/assets/javascripts/select2/i18n/fr.js
|
425
|
+
- vendor/assets/javascripts/select2/select2.min.js
|
424
426
|
- vendor/assets/javascripts/toastr.js
|
425
427
|
- vendor/assets/stylesheets/animate.css
|
426
428
|
- vendor/assets/stylesheets/bootstrap-datepicker.min.css
|
@@ -430,15 +432,15 @@ files:
|
|
430
432
|
- vendor/assets/stylesheets/codemirror/theme/relax-seti.css
|
431
433
|
- vendor/assets/stylesheets/jquery.nestable.css
|
432
434
|
- vendor/assets/stylesheets/jquery.tagsinput-revisited.min.css
|
433
|
-
- vendor/assets/stylesheets/select2-bootstrap4.css
|
434
|
-
- vendor/assets/stylesheets/select2.min.css
|
435
|
+
- vendor/assets/stylesheets/select2/select2-bootstrap4.css
|
436
|
+
- vendor/assets/stylesheets/select2/select2.min.css
|
435
437
|
- vendor/assets/stylesheets/sweetalert.css
|
436
438
|
- vendor/assets/stylesheets/toastr.css
|
437
439
|
homepage: https://github.com/nicovak/slash_admin
|
438
440
|
licenses:
|
439
441
|
- MIT
|
440
442
|
metadata: {}
|
441
|
-
post_install_message:
|
443
|
+
post_install_message:
|
442
444
|
rdoc_options: []
|
443
445
|
require_paths:
|
444
446
|
- lib
|
@@ -454,7 +456,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
454
456
|
version: '0'
|
455
457
|
requirements: []
|
456
458
|
rubygems_version: 3.1.2
|
457
|
-
signing_key:
|
459
|
+
signing_key:
|
458
460
|
specification_version: 4
|
459
461
|
summary: A modern and overridable admin gem, just the rails way.
|
460
462
|
test_files: []
|
data/config/initializers/pagy.rb
DELETED