slash_admin 1.0.1 → 1.0.2
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/slash_admin/application.js +1 -0
- data/app/controllers/slash_admin/application_controller.rb +3 -3
- data/app/controllers/slash_admin/base_controller.rb +9 -8
- data/app/controllers/slash_admin/batch_actions_controller.rb +1 -0
- data/app/controllers/slash_admin/dashboard_controller.rb +3 -1
- data/app/controllers/slash_admin/models_controller.rb +102 -81
- data/app/controllers/slash_admin/security/sessions_controller.rb +8 -6
- data/app/controllers/slash_admin/selectize_controller.rb +4 -6
- data/app/helpers/slash_admin/application_helper.rb +30 -31
- data/app/helpers/slash_admin/menu_helper.rb +3 -2
- data/app/helpers/slash_admin/widgets_helper.rb +1 -1
- data/app/mailers/slash_admin/application_mailer.rb +2 -2
- data/app/models/slash_admin/admin.rb +5 -6
- data/app/models/slash_admin/admin_ability.rb +1 -0
- data/app/views/slash_admin/base/_data_list.html.erb +42 -32
- data/config/initializers/validators.rb +1 -1
- data/config/routes.rb +7 -7
- data/db/migrate/20170512104248_create_slash_admin_admins.rb +5 -4
- data/lib/batch_translation.rb +3 -3
- data/lib/generators/slash_admin/controllers/controllers_generator.rb +5 -4
- data/lib/generators/slash_admin/install/install_generator.rb +4 -3
- data/lib/generators/slash_admin/override_admin/override_admin_generator.rb +3 -3
- data/lib/generators/slash_admin/override_session/override_session_generator.rb +4 -3
- data/lib/generators/slash_admin/permissions/permissions_generator.rb +4 -3
- data/lib/slash_admin/engine.rb +1 -1
- data/lib/slash_admin/version.rb +1 -1
- data/lib/slash_admin.rb +22 -22
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f61951e5da77acff572ba11839d60c708cc440696971f3ca2eb483e55862ecc
|
4
|
+
data.tar.gz: fc105b1a368403c57f01190e863b34b5ad51e35a96c212623d3b695d712da148
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eaf607ee5214e9ec808afa71847f8ebfdce4249f06cbede5e0c276de9a3838dca3621cde3e1faead57d88e0950766e3f70fa92128a596bd70fce125fbe233f43
|
7
|
+
data.tar.gz: 8ee7c0e991a8eaf2bede39b04c397613847f6b84105afcb6229434f46b680f7f551004b570944ef7478c8fef26e0b558aa0f25e6109467f03608834657c6a91a
|
@@ -10,8 +10,8 @@ module SlashAdmin
|
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
def set_locale
|
14
|
+
I18n.locale = http_accept_language.compatible_language_from(I18n.available_locales)
|
15
|
+
end
|
16
16
|
end
|
17
17
|
end
|
@@ -6,24 +6,25 @@ module SlashAdmin
|
|
6
6
|
before_action :prepend_view_paths
|
7
7
|
helper_method :current_admin, :boolean_to_string
|
8
8
|
|
9
|
-
|
9
|
+
protected
|
10
10
|
|
11
|
-
def handle_default
|
11
|
+
def handle_default
|
12
|
+
end
|
12
13
|
|
13
14
|
def handle_default_mode
|
14
15
|
session[:compact] ||= false
|
15
16
|
end
|
16
17
|
|
17
18
|
def prepend_view_paths
|
18
|
-
prepend_view_path
|
19
|
+
prepend_view_path "app/views/slash_admin"
|
19
20
|
end
|
20
21
|
|
21
|
-
|
22
|
+
private
|
22
23
|
|
23
24
|
def authenticate_admin!
|
24
25
|
return true if current_admin.present?
|
25
|
-
flash[:error] = t(
|
26
|
-
redirect_to login_url unless controller_name ==
|
26
|
+
flash[:error] = t("slash_admin.sessions.login_required")
|
27
|
+
redirect_to login_url unless controller_name == "sessions"
|
27
28
|
end
|
28
29
|
|
29
30
|
def current_admin
|
@@ -31,11 +32,11 @@ module SlashAdmin
|
|
31
32
|
end
|
32
33
|
|
33
34
|
def to_boolean(str)
|
34
|
-
str ==
|
35
|
+
str == "true"
|
35
36
|
end
|
36
37
|
|
37
38
|
def boolean_to_string(str)
|
38
|
-
str ?
|
39
|
+
str ? "true" : "false"
|
39
40
|
end
|
40
41
|
|
41
42
|
def should_load_layout_data?
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "csv"
|
2
2
|
|
3
3
|
module SlashAdmin
|
4
4
|
class ModelsController < SlashAdmin::BaseController
|
@@ -9,7 +9,7 @@ module SlashAdmin
|
|
9
9
|
before_action :handle_default_params
|
10
10
|
before_action :handle_assocations
|
11
11
|
|
12
|
-
helper_method :list_params, :export_params, :create_params, :update_params, :show_params, :nested_params, :should_add_translatable?, :translatable_params
|
12
|
+
helper_method :list_params, :export_params, :create_params, :update_params, :show_params, :nested_params, :should_add_translatable?, :translatable_params, :tooltips
|
13
13
|
|
14
14
|
def index
|
15
15
|
authorize! :index, @model_class
|
@@ -21,12 +21,12 @@ module SlashAdmin
|
|
21
21
|
|
22
22
|
column = @model_class.arel_table[params[:order_field].to_sym]
|
23
23
|
order = params[:order].downcase
|
24
|
-
if %w
|
24
|
+
if %w[asc desc].include?(order)
|
25
25
|
if @models_export.is_a? Array
|
26
|
-
if order ==
|
27
|
-
@
|
26
|
+
@models = if order == "asc"
|
27
|
+
@models_export.sort { |m1, m2| m1.send(params[:order_field]) <=> m2.send(params[:order_field]) }
|
28
28
|
else
|
29
|
-
@
|
29
|
+
@models_export.sort { |m1, m2| m2.send(params[:order_field]) <=> m1.send(params[:order_field]) }
|
30
30
|
end
|
31
31
|
@models = Kaminari.paginate_array(@models).page(params[:page]).per(params[:per])
|
32
32
|
else
|
@@ -36,8 +36,8 @@ module SlashAdmin
|
|
36
36
|
|
37
37
|
@fields = if @use_export_params
|
38
38
|
export_params
|
39
|
-
|
40
|
-
|
39
|
+
else
|
40
|
+
@model_class.column_names
|
41
41
|
end
|
42
42
|
|
43
43
|
respond_to do |format|
|
@@ -53,8 +53,12 @@ module SlashAdmin
|
|
53
53
|
@model = @model_class.new
|
54
54
|
end
|
55
55
|
|
56
|
-
def before_validate_on_create
|
57
|
-
|
56
|
+
def before_validate_on_create
|
57
|
+
end
|
58
|
+
|
59
|
+
def after_save_on_create
|
60
|
+
end
|
61
|
+
|
58
62
|
def create
|
59
63
|
authorize! :new, @model_class
|
60
64
|
handle_has_one
|
@@ -69,19 +73,19 @@ module SlashAdmin
|
|
69
73
|
after_save_on_create
|
70
74
|
respond_to do |format|
|
71
75
|
format.html do
|
72
|
-
flash[:success] = t(
|
73
|
-
redirect_to
|
76
|
+
flash[:success] = t("slash_admin.controller.create.success", model_name: @model_name)
|
77
|
+
redirect_to(handle_redirect_after_submit) && return
|
74
78
|
end
|
75
|
-
format.js { render
|
79
|
+
format.js { render(json: {id: @model.id, name: helpers.show_object(@model)}) && return }
|
76
80
|
end
|
77
81
|
end
|
78
82
|
else
|
79
|
-
flash[:error] = t(
|
83
|
+
flash[:error] = t("slash_admin.controller.create.error", model_name: @model_name)
|
80
84
|
end
|
81
85
|
|
82
86
|
respond_to do |format|
|
83
87
|
format.html { render :new }
|
84
|
-
format.js { render json: {
|
88
|
+
format.js { render json: {errors: @model.errors.full_messages} }
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
@@ -104,14 +108,14 @@ module SlashAdmin
|
|
104
108
|
if @model.valid?
|
105
109
|
if @model.save!
|
106
110
|
after_save_on_update
|
107
|
-
flash[:success] = t(
|
111
|
+
flash[:success] = t("slash_admin.controller.update.success", model_name: @model_name)
|
108
112
|
respond_to do |format|
|
109
|
-
format.html { redirect_to
|
113
|
+
format.html { redirect_to(handle_redirect_after_submit) && return }
|
110
114
|
format.js
|
111
115
|
end
|
112
116
|
end
|
113
117
|
else
|
114
|
-
flash[:error] = t(
|
118
|
+
flash[:error] = t("slash_admin.controller.update.error", model_name: @model_name)
|
115
119
|
end
|
116
120
|
render :edit
|
117
121
|
end
|
@@ -128,20 +132,33 @@ module SlashAdmin
|
|
128
132
|
|
129
133
|
def destroy
|
130
134
|
@model_class.find(params[:id]).destroy!
|
131
|
-
flash[:success] = t(
|
135
|
+
flash[:success] = t("slash_admin.controller.delete.success", model_name: @model_name)
|
132
136
|
respond_to do |format|
|
133
137
|
format.html { redirect_to main_app.polymorphic_url([:slash_admin, @model_class]) }
|
134
138
|
format.js
|
135
139
|
end
|
136
140
|
end
|
137
141
|
|
138
|
-
def before_validate_on_update
|
139
|
-
|
142
|
+
def before_validate_on_update
|
143
|
+
end
|
144
|
+
|
145
|
+
def after_save_on_update
|
146
|
+
end
|
147
|
+
|
148
|
+
# Add tooltip to th list view
|
149
|
+
# {
|
150
|
+
# attr: 'Value',
|
151
|
+
# title: 'The title of my model',
|
152
|
+
# }
|
153
|
+
#
|
154
|
+
def tooltips
|
155
|
+
{}
|
156
|
+
end
|
140
157
|
|
141
158
|
def handle_has_one
|
142
159
|
@has_one = {}
|
143
160
|
Array.wrap(update_params + create_params).uniq.each do |p|
|
144
|
-
if helpers.guess_field_type(@model_class.new, p) ==
|
161
|
+
if helpers.guess_field_type(@model_class.new, p) == "has_one" && !@model_class.nested_attributes_options.key?(p.to_sym)
|
145
162
|
@has_one[p] = permit_params[p]
|
146
163
|
permit_params.delete(p)
|
147
164
|
end
|
@@ -168,7 +185,7 @@ module SlashAdmin
|
|
168
185
|
@model.send("#{k}=", JSON.parse(permit_params[k]))
|
169
186
|
rescue
|
170
187
|
# Handle case when single string passed, we transform it into array to have a valid json
|
171
|
-
json = permit_params[k].split(
|
188
|
+
json = permit_params[k].split(",").to_json
|
172
189
|
@model.send("#{k}=", JSON.parse(json))
|
173
190
|
end
|
174
191
|
end
|
@@ -180,31 +197,31 @@ module SlashAdmin
|
|
180
197
|
|
181
198
|
def nestable
|
182
199
|
unless @is_nestable
|
183
|
-
flash[:error] = t(
|
184
|
-
redirect_to
|
200
|
+
flash[:error] = t("slash_admin.controller.nestable.error", model_name: @model_name)
|
201
|
+
redirect_to(main_app.polymorphic_url([:slash_admin, @model_class])) && return
|
185
202
|
end
|
186
203
|
|
187
204
|
if request.post?
|
188
205
|
if params[:nestable][:data].present?
|
189
206
|
JSON.parse(params[:nestable][:data]).each_with_index do |p, i|
|
190
|
-
m = @model_class.find(p[
|
207
|
+
m = @model_class.find(p["id"])
|
191
208
|
m.position = i
|
192
209
|
m.save!
|
193
210
|
end
|
194
211
|
end
|
195
212
|
|
196
|
-
flash[:success] = t(
|
213
|
+
flash[:success] = t("slash_admin.controller.nestable.success")
|
197
214
|
|
198
|
-
redirect_to
|
215
|
+
redirect_to(main_app.polymorphic_url(["slash_admin", @model_class])) && return if params.key?(:submit_redirect)
|
199
216
|
redirect_to main_app.polymorphic_url([:nestable, :slash_admin, @model_class])
|
200
217
|
end
|
201
218
|
end
|
202
219
|
|
203
220
|
def handle_filtered_search
|
204
|
-
if @model_class.respond_to? :translated_attribute_names
|
205
|
-
|
221
|
+
search = if @model_class.respond_to? :translated_attribute_names
|
222
|
+
@model_class.with_translations(I18n.locale).all
|
206
223
|
else
|
207
|
-
|
224
|
+
@model_class.all
|
208
225
|
end
|
209
226
|
|
210
227
|
virtual_fields = []
|
@@ -215,17 +232,17 @@ module SlashAdmin
|
|
215
232
|
if @model_class.respond_to?(:translated_attribute_names) && @model_class.translated_attribute_names.include?(attr.to_sym)
|
216
233
|
attr = "#{@model_class.name.singularize.underscore}_translations.#{attr}"
|
217
234
|
end
|
218
|
-
attr_prefixed = model.table_name +
|
235
|
+
attr_prefixed = model.table_name + "." + attr
|
219
236
|
case attr_type
|
220
|
-
|
221
|
-
when
|
237
|
+
# TODO : Should be rewritten
|
238
|
+
when "belongs_to"
|
222
239
|
search = search.eager_load(attr.to_s)
|
223
|
-
search = search.where(attr.to_s +
|
224
|
-
|
225
|
-
when
|
240
|
+
search = search.where(attr.to_s + "_id IN (" + query.join(",") + ")")
|
241
|
+
# TODO : Should be rewritten
|
242
|
+
when "has_one"
|
226
243
|
search = search.eager_load(attr.to_s)
|
227
|
-
search = search.where(attr.to_s.pluralize +
|
228
|
-
when
|
244
|
+
search = search.where(attr.to_s.pluralize + ".id IN (" + query.join(",") + ")")
|
245
|
+
when "string", "text"
|
229
246
|
query.strip! unless query.strip!.nil?
|
230
247
|
attributes = @model_class.new.attributes.keys
|
231
248
|
if !attributes.include?(attr.to_s) && @model_class.method_defined?(attr.to_s)
|
@@ -237,38 +254,38 @@ module SlashAdmin
|
|
237
254
|
search = search.where("lower(#{attr_prefixed}) LIKE lower(:query)", query: "%#{query}%")
|
238
255
|
end
|
239
256
|
end
|
240
|
-
when
|
257
|
+
when "date", "datetime"
|
241
258
|
if query.is_a?(String)
|
242
259
|
search = search.where("#{attr_prefixed} = :query", query: query)
|
243
260
|
else
|
244
|
-
if query[
|
245
|
-
if query[
|
246
|
-
if query[
|
247
|
-
search = search.where("#{attr_prefixed} >= :query", query: query[
|
261
|
+
if query["from"].present? || query["to"].present?
|
262
|
+
if query["from"].to_date != query["to"].to_date
|
263
|
+
if query["from"].present?
|
264
|
+
search = search.where("#{attr_prefixed} >= :query", query: query["from"].to_date)
|
248
265
|
end
|
249
|
-
if query[
|
250
|
-
search = search.where("#{attr_prefixed} <= :query", query: query[
|
266
|
+
if query["to"].present?
|
267
|
+
search = search.where("#{attr_prefixed} <= :query", query: query["to"].to_date)
|
251
268
|
end
|
252
269
|
else
|
253
|
-
search = search.where("#{attr_prefixed} = :query", query: query[
|
270
|
+
search = search.where("#{attr_prefixed} = :query", query: query["from"].to_date)
|
254
271
|
end
|
255
272
|
end
|
256
273
|
end
|
257
|
-
when
|
274
|
+
when "decimal", "number", "integer"
|
258
275
|
if query.instance_of?(ActionController::Parameters)
|
259
|
-
if query[
|
260
|
-
search = search.where("#{attr_prefixed} >= :query", query: query[
|
261
|
-
search = search.where("#{attr_prefixed} <= :query", query: query[
|
276
|
+
if query["from"].present? || query["to"].present?
|
277
|
+
search = search.where("#{attr_prefixed} >= :query", query: query["from"]) if query["from"].present?
|
278
|
+
search = search.where("#{attr_prefixed} <= :query", query: query["to"]) if query["to"].present?
|
262
279
|
end
|
263
280
|
else
|
264
|
-
if attr_type ==
|
281
|
+
if attr_type == "decimal" || attr_type == "number"
|
265
282
|
query = query.to_f
|
266
|
-
elsif attr_type ==
|
283
|
+
elsif attr_type == "integer"
|
267
284
|
query = query.to_i
|
268
285
|
end
|
269
286
|
search = search.where("#{attr_prefixed} = :query", query: query)
|
270
287
|
end
|
271
|
-
when
|
288
|
+
when "boolean"
|
272
289
|
search = search.where("#{attr_prefixed} = :query", query: to_boolean(query))
|
273
290
|
else
|
274
291
|
raise Exception.new("Unable to query for attribute_type : #{attr_type}")
|
@@ -293,7 +310,7 @@ module SlashAdmin
|
|
293
310
|
end
|
294
311
|
|
295
312
|
def update_params(options = {})
|
296
|
-
if
|
313
|
+
if options.present?
|
297
314
|
create_params(options)
|
298
315
|
else
|
299
316
|
create_params
|
@@ -306,27 +323,31 @@ module SlashAdmin
|
|
306
323
|
aut_params << m if model.respond_to? m
|
307
324
|
end
|
308
325
|
|
309
|
-
raise Exception.new(
|
326
|
+
raise Exception.new("You have to defined autocomplete_params in your admin model controller") if aut_params.blank?
|
310
327
|
aut_params
|
311
328
|
end
|
312
329
|
|
313
|
-
|
330
|
+
protected
|
314
331
|
|
315
332
|
def prepend_view_paths
|
316
|
-
prepend_view_path
|
317
|
-
|
333
|
+
prepend_view_path "app/views/slash_admin"
|
334
|
+
begin
|
335
|
+
prepend_view_path "app/views/slash_admin/models/#{@model_class.model_name.to_s.pluralize.underscore}"
|
336
|
+
rescue
|
337
|
+
nil
|
338
|
+
end
|
318
339
|
end
|
319
340
|
|
320
341
|
def handle_redirect_after_submit
|
321
|
-
path =
|
322
|
-
path =
|
323
|
-
path =
|
342
|
+
path = main_app.edit_polymorphic_url(["slash_admin", @model])
|
343
|
+
path = main_app.polymorphic_url(["slash_admin", @model_class]) if params.key?(:submit_redirect)
|
344
|
+
path = main_app.new_polymorphic_url(["slash_admin", @model_class]) if params.key?(:submit_add)
|
324
345
|
|
325
346
|
path
|
326
347
|
end
|
327
348
|
|
328
349
|
def permit_params
|
329
|
-
params[@model_class.name.split(
|
350
|
+
params[@model_class.name.split("::").last.underscore].permit!
|
330
351
|
end
|
331
352
|
|
332
353
|
def handle_default
|
@@ -337,7 +358,7 @@ module SlashAdmin
|
|
337
358
|
@per_values = [20, 30, 50, 100, 150]
|
338
359
|
@use_export_params = false
|
339
360
|
@order_field = :id
|
340
|
-
@order =
|
361
|
+
@order = "DESC"
|
341
362
|
end
|
342
363
|
|
343
364
|
def nestable_config
|
@@ -386,15 +407,13 @@ module SlashAdmin
|
|
386
407
|
|
387
408
|
# By default we are looking in SlashAdmin:: namespace
|
388
409
|
def model
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
return ('SlashAdmin::' + controller_name.classify).constantize
|
393
|
-
end
|
410
|
+
controller_name.classify.constantize
|
411
|
+
rescue
|
412
|
+
("SlashAdmin::" + controller_name.classify).constantize
|
394
413
|
end
|
395
414
|
|
396
415
|
def create_params(options = {})
|
397
|
-
exclude_default_params(controller_name.classify.constantize.attribute_names).map { |attr| attr.gsub(/_id$/,
|
416
|
+
exclude_default_params(controller_name.classify.constantize.attribute_names).map { |attr| attr.gsub(/_id$/, "") }
|
398
417
|
end
|
399
418
|
|
400
419
|
def translatable_params
|
@@ -402,13 +421,13 @@ module SlashAdmin
|
|
402
421
|
end
|
403
422
|
|
404
423
|
def show_params
|
405
|
-
@model_class.attribute_names.map { |attr| attr.gsub(/_id$/,
|
424
|
+
@model_class.attribute_names.map { |attr| attr.gsub(/_id$/, "") }
|
406
425
|
end
|
407
426
|
|
408
427
|
def nested_params
|
409
428
|
nested_params = []
|
410
429
|
@model_class.nested_attributes_options.keys.each do |nested|
|
411
|
-
nested_params << {
|
430
|
+
nested_params << {nested => exclude_default_params(nested.to_s.singularize.classify.constantize.attribute_names.map { |attr| attr.gsub(/_id$/, "") }) - [@model.model_name.param_key]}
|
412
431
|
end
|
413
432
|
|
414
433
|
nested_params
|
@@ -416,16 +435,16 @@ module SlashAdmin
|
|
416
435
|
|
417
436
|
# Exclude default params for edit and create
|
418
437
|
def exclude_default_params(params)
|
419
|
-
params
|
438
|
+
params -= %w[id created_at updated_at slug position]
|
420
439
|
if @model_class.try(:translated_attribute_names).present?
|
421
|
-
params
|
440
|
+
params -= @model_class.translated_attribute_names.map(&:to_s)
|
422
441
|
end
|
423
442
|
params
|
424
443
|
end
|
425
444
|
|
426
445
|
def stream_file(filename, extension)
|
427
|
-
response.headers[
|
428
|
-
response.headers[
|
446
|
+
response.headers["Content-Type"] = "application/octet-stream"
|
447
|
+
response.headers["Content-Disposition"] = "attachment; filename=#{filename}.#{extension}"
|
429
448
|
|
430
449
|
yield response.stream
|
431
450
|
ensure
|
@@ -434,23 +453,25 @@ module SlashAdmin
|
|
434
453
|
|
435
454
|
def stream_csv_report
|
436
455
|
query = @models_export.limit(5000).to_sql
|
437
|
-
query_options =
|
456
|
+
query_options = "WITH CSV HEADER"
|
438
457
|
|
439
|
-
stream_file("#{@model_class.model_name.plural.upcase}_#{Date.today}",
|
458
|
+
stream_file("#{@model_class.model_name.plural.upcase}_#{Date.today}", "csv") do |stream|
|
440
459
|
stream_query_rows(query, query_options) do |row_from_db|
|
441
460
|
stream.write row_from_db
|
442
461
|
end
|
443
462
|
end
|
444
463
|
end
|
445
464
|
|
446
|
-
|
447
|
-
|
465
|
+
private
|
466
|
+
|
467
|
+
def list_params
|
468
|
+
end
|
448
469
|
|
449
470
|
def export_params
|
450
471
|
list_params
|
451
472
|
end
|
452
473
|
|
453
|
-
def stream_query_rows(sql_query, options =
|
474
|
+
def stream_query_rows(sql_query, options = "WITH CSV HEADER")
|
454
475
|
conn = ActiveRecord::Base.connection.raw_connection
|
455
476
|
conn.copy_data "COPY (#{sql_query}) TO STDOUT #{options};" do
|
456
477
|
while row = conn.get_copy_data
|
@@ -1,22 +1,24 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module SlashAdmin
|
3
4
|
module Security
|
4
5
|
class SessionsController < ActionController::Base
|
5
6
|
protect_from_forgery with: :exception
|
6
7
|
|
7
|
-
layout
|
8
|
+
layout "slash_admin/admin_user"
|
8
9
|
|
9
|
-
def new
|
10
|
+
def new
|
11
|
+
end
|
10
12
|
|
11
13
|
def create
|
12
|
-
admin = Admin.where(
|
14
|
+
admin = Admin.where("username = :value OR lower(email) = lower(:value)", value: params[:admin][:login]).first
|
13
15
|
if admin&.authenticate(params[:admin][:password])
|
14
16
|
session[:admin_id] = admin.id
|
15
|
-
flash[:success] =
|
17
|
+
flash[:success] = "Vous êtes à présent connecté."
|
16
18
|
redirect_to slash_admin.dashboard_path
|
17
19
|
else
|
18
|
-
@error_messages =
|
19
|
-
render
|
20
|
+
@error_messages = "Merci de vérifier vos identifiants"
|
21
|
+
render(:new) && return
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
@@ -8,10 +8,10 @@ module SlashAdmin
|
|
8
8
|
class SelectizeController < SlashAdmin::BaseController
|
9
9
|
def search
|
10
10
|
model_class = model
|
11
|
-
if model_class.respond_to? :translated_attribute_names
|
12
|
-
|
11
|
+
results = if model_class.respond_to? :translated_attribute_names
|
12
|
+
model_class.with_translations(I18n.locale).all
|
13
13
|
else
|
14
|
-
|
14
|
+
model_class.all
|
15
15
|
end
|
16
16
|
|
17
17
|
duplicate_for_orwhere = results
|
@@ -48,11 +48,9 @@ module SlashAdmin
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
|
52
|
-
|
53
51
|
formatted_result = []
|
54
52
|
results.each do |r|
|
55
|
-
formatted_result << {
|
53
|
+
formatted_result << {id: r.id, name: helpers.show_object(r)}
|
56
54
|
end
|
57
55
|
|
58
56
|
render json: formatted_result
|
@@ -100,7 +100,7 @@ module SlashAdmin
|
|
100
100
|
# Default available field_type handeled
|
101
101
|
def orderable?(object, attr)
|
102
102
|
field_type = guess_field_type(object, attr)
|
103
|
-
%w
|
103
|
+
%w[boolean integer number decimal string text date datetime].include?(field_type)
|
104
104
|
end
|
105
105
|
|
106
106
|
# By default all sortable fields are orderable
|
@@ -115,17 +115,17 @@ module SlashAdmin
|
|
115
115
|
# Default label for object to string, title and name
|
116
116
|
# can be an attribute, a string or the model_class
|
117
117
|
def object_label(a)
|
118
|
-
if a.is_a? Hash
|
119
|
-
|
118
|
+
constantized_model = if a.is_a? Hash
|
119
|
+
a.keys.first.to_s.singularize.classify.constantize
|
120
120
|
elsif a.is_a? ActiveRecord::Base
|
121
|
-
|
121
|
+
a
|
122
122
|
else
|
123
|
-
|
123
|
+
a.to_s.singularize.classify.constantize
|
124
124
|
end
|
125
125
|
|
126
126
|
constantized_model = constantized_model.new
|
127
127
|
|
128
|
-
method =
|
128
|
+
method = "to_s"
|
129
129
|
object_label_methods.each do |m|
|
130
130
|
method = m if constantized_model.respond_to?(m)
|
131
131
|
end
|
@@ -134,7 +134,7 @@ module SlashAdmin
|
|
134
134
|
end
|
135
135
|
|
136
136
|
def show_object(a)
|
137
|
-
method =
|
137
|
+
method = "to_s"
|
138
138
|
|
139
139
|
unless a.blank?
|
140
140
|
object_label_methods.each do |m|
|
@@ -149,10 +149,10 @@ module SlashAdmin
|
|
149
149
|
# object params can be a Model Class or a Model Instance
|
150
150
|
# boolean integer number decimal string text date datetime has_many belongs_to
|
151
151
|
def guess_field_type(object, attr)
|
152
|
-
if object.class === Class
|
153
|
-
|
152
|
+
object_class = if object.class === Class
|
153
|
+
object
|
154
154
|
else
|
155
|
-
|
155
|
+
object.class
|
156
156
|
end
|
157
157
|
|
158
158
|
belongs_to_fields = object_class.reflect_on_all_associations(:belongs_to).map(&:name)
|
@@ -162,19 +162,19 @@ module SlashAdmin
|
|
162
162
|
return if attr.is_a? Hash
|
163
163
|
|
164
164
|
type = if object_class&.uploaders&.key?(attr.to_sym)
|
165
|
-
|
165
|
+
"image"
|
166
166
|
elsif belongs_to_fields.include?(attr.to_sym)
|
167
|
-
|
167
|
+
"belongs_to"
|
168
168
|
elsif has_many_fields.include?(attr.to_sym)
|
169
|
-
|
169
|
+
"has_many"
|
170
170
|
elsif has_one_fields.include?(attr.to_sym)
|
171
|
-
|
171
|
+
"has_one"
|
172
172
|
else
|
173
173
|
object_class.type_for_attribute(attr.to_s).type.to_s
|
174
174
|
end
|
175
175
|
|
176
176
|
# Virtual field default string eg password
|
177
|
-
return
|
177
|
+
return "string" if object_class.new.respond_to?(attr) && type.blank?
|
178
178
|
|
179
179
|
# Raise exception if no type fouded
|
180
180
|
raise Exception.new("Unable to guess field_type for attribute: #{attr} in model: #{object_class}") if type.blank?
|
@@ -184,15 +184,14 @@ module SlashAdmin
|
|
184
184
|
# From shoulda-matchers https://github.com/thoughtbot/shoulda-matchers/blob/da4e6ddd06de54016e7c2afd953120f0f6529c70/lib/shoulda/matchers/rails_shim.rb
|
185
185
|
# @param model @model_class
|
186
186
|
def serialized_attributes_for(model)
|
187
|
-
serialized_columns = model.columns.select
|
187
|
+
serialized_columns = model.columns.select { |column|
|
188
188
|
model.type_for_attribute(column.name).is_a?(
|
189
189
|
::ActiveRecord::Type::Serialized,
|
190
|
-
|
191
|
-
|
190
|
+
)
|
191
|
+
}
|
192
192
|
|
193
|
-
serialized_columns.
|
193
|
+
serialized_columns.each_with_object({}) do |column, hash|
|
194
194
|
hash[column.name.to_s] = model.type_for_attribute(column.name).coder
|
195
|
-
hash
|
196
195
|
end
|
197
196
|
end
|
198
197
|
|
@@ -205,7 +204,7 @@ module SlashAdmin
|
|
205
204
|
|
206
205
|
def admin_custom_field(form, attribute)
|
207
206
|
type = attribute[attribute.keys.first][:type].to_s
|
208
|
-
render partial: "slash_admin/custom_fields/#{type}", locals: {
|
207
|
+
render partial: "slash_admin/custom_fields/#{type}", locals: {f: form, a: attribute}
|
209
208
|
end
|
210
209
|
|
211
210
|
# Form helper for generic field
|
@@ -220,32 +219,32 @@ module SlashAdmin
|
|
220
219
|
admin_custom_field(form, attribute)
|
221
220
|
elsif belongs_to_fields.include?(attribute.to_sym)
|
222
221
|
if form.object.class.nested_attributes_options.key?(attribute.to_sym)
|
223
|
-
render partial:
|
222
|
+
render partial: "slash_admin/fields/nested_belongs_to", locals: {f: form, a: attribute}
|
224
223
|
else
|
225
|
-
render partial:
|
224
|
+
render partial: "slash_admin/fields/belongs_to", locals: {f: form, a: attribute}
|
226
225
|
end
|
227
226
|
elsif has_many_fields.include?(attribute.to_sym)
|
228
227
|
# if has nested_attributes_options for has_many field
|
229
228
|
if form.object.class.nested_attributes_options.key?(attribute.to_sym)
|
230
|
-
render partial:
|
229
|
+
render partial: "slash_admin/fields/nested_has_many", locals: {f: form, a: attribute}
|
231
230
|
else
|
232
|
-
render partial:
|
231
|
+
render partial: "slash_admin/fields/has_many", locals: {f: form, a: attribute}
|
233
232
|
end
|
234
233
|
elsif has_one_fields.include?(attribute.to_sym)
|
235
234
|
if form.object.class.nested_attributes_options.key?(attribute.to_sym)
|
236
|
-
render partial:
|
235
|
+
render partial: "slash_admin/fields/nested_has_one", locals: {f: form, a: attribute}
|
237
236
|
else
|
238
|
-
render partial:
|
237
|
+
render partial: "slash_admin/fields/has_one", locals: {f: form, a: attribute}
|
239
238
|
end
|
240
239
|
elsif form.object.class&.uploaders&.key?(attribute.to_sym)
|
241
|
-
render partial:
|
240
|
+
render partial: "slash_admin/fields/carrierwave", locals: {f: form, a: attribute}
|
242
241
|
else
|
243
242
|
type = form.object.class.type_for_attribute(attribute.to_s).type.to_s
|
244
|
-
if type ==
|
245
|
-
render partial:
|
243
|
+
if type == "date" || type == "datetime"
|
244
|
+
render partial: "slash_admin/fields/date", locals: {f: form, a: attribute}
|
246
245
|
else
|
247
246
|
raise Exception.new("Unable to guess field_type for attribute: #{attribute} in model: #{object_class}") if type.blank?
|
248
|
-
render partial: "slash_admin/fields/#{type}", locals: {
|
247
|
+
render partial: "slash_admin/fields/#{type}", locals: {f: form, a: attribute}
|
249
248
|
end
|
250
249
|
end
|
251
250
|
end
|
@@ -3,6 +3,6 @@
|
|
3
3
|
module SlashAdmin::WidgetsHelper
|
4
4
|
# number, title, icon, progress_label, percent, status
|
5
5
|
def statistic_progress_tile(options = {})
|
6
|
-
render
|
6
|
+
render "slash_admin/dashboard/widgets/statistic_progress_tile", options: options
|
7
7
|
end
|
8
8
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module SlashAdmin
|
3
4
|
class Admin < ApplicationRecord
|
4
5
|
include CanCan::Ability
|
@@ -9,7 +10,7 @@ module SlashAdmin
|
|
9
10
|
|
10
11
|
EMAIL_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i
|
11
12
|
USERNAME_REGEX = /^[a-zA-Z0-9_\.]*$/
|
12
|
-
validates :username, presence: true, uniqueness: true, length: {
|
13
|
+
validates :username, presence: true, uniqueness: true, length: {in: 3..20}
|
13
14
|
validates :email, presence: true, uniqueness: true
|
14
15
|
validates_length_of :password, in: 6..20, on: :create
|
15
16
|
validates_format_of :email, with: EMAIL_REGEX, multiline: true
|
@@ -28,15 +29,13 @@ module SlashAdmin
|
|
28
29
|
end
|
29
30
|
|
30
31
|
def handle_default_role
|
31
|
-
self.roles =
|
32
|
+
self.roles = "superadmin" unless roles.present?
|
32
33
|
end
|
33
34
|
|
34
|
-
|
35
|
-
@login = login
|
36
|
-
end
|
35
|
+
attr_writer :login
|
37
36
|
|
38
37
|
def login
|
39
|
-
@login ||
|
38
|
+
@login || username || email
|
40
39
|
end
|
41
40
|
|
42
41
|
def identicon
|
@@ -17,43 +17,52 @@
|
|
17
17
|
<input type="checkbox" class="toggle-all"/>
|
18
18
|
</th>
|
19
19
|
<th
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
20
|
+
data-order-field="id"
|
21
|
+
<% if params[:order_field].to_s == 'id' %>
|
22
|
+
class="ordered <%= params[:order].downcase %>"
|
23
|
+
data-order="<%= params[:order] %>"
|
24
|
+
<% else %>
|
25
|
+
class="ordered"
|
26
|
+
<% end %>
|
27
|
+
>#
|
28
28
|
</th>
|
29
29
|
<% list_params.each do |attr| %>
|
30
30
|
<% if attr.is_a?(Hash) %>
|
31
|
-
<th
|
31
|
+
<th>
|
32
|
+
<%= @model_class.human_attribute_name(attr.keys.first) %>
|
33
|
+
<% if tooltips.key? attr.keys.first %>
|
34
|
+
<a href="#" data-toggle="tooltip" data-placement="top" title="<%= tooltips[attr] %>"><i class="fas fa-question-circle"></i></a>
|
35
|
+
<% end %>
|
36
|
+
</th>
|
32
37
|
<% else %>
|
33
38
|
<th
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
<% if orderable?(@model_class, attr) %>
|
40
|
+
data-order-field="<%= attr %>"
|
41
|
+
<% if params[:order_field].to_s == attr.to_s %>
|
42
|
+
class="ordered <%= params[:order].downcase %>"
|
43
|
+
data-order="<%= params[:order] %>"
|
44
|
+
<% else %>
|
45
|
+
class="ordered"
|
46
|
+
<% end %>
|
47
|
+
<% end %>>
|
43
48
|
<%= @model_class.human_attribute_name(attr) %>
|
49
|
+
<% if tooltips.key? attr %>
|
50
|
+
<a href="#" data-toggle="tooltip" data-placement="top" title="<%= tooltips[attr] %>"><i class="fas fa-question-circle"></i></a>
|
51
|
+
<% end %>
|
44
52
|
</th>
|
45
53
|
<% end %>
|
46
54
|
<% end %>
|
47
55
|
<th class="text-center"><%= t('slash_admin.view.actions') %></th>
|
48
56
|
</tr>
|
49
57
|
|
50
|
-
|
58
|
+
<%= render 'filters', model: @model_class %>
|
51
59
|
</thead>
|
52
60
|
|
53
61
|
<tbody>
|
54
62
|
<% @models.each do |m| %>
|
55
63
|
<tr>
|
56
|
-
<td class="fit"><input type="checkbox" name="<%= @model_name.pluralize.downcase %>[] %>" value="<%= m.id %>"
|
64
|
+
<td class="fit"><input type="checkbox" name="<%= @model_name.pluralize.downcase %>[] %>" value="<%= m.id %>">
|
65
|
+
</td>
|
57
66
|
<td class="fit"><%= m.id %></td>
|
58
67
|
<% list_params.each do |attr| %>
|
59
68
|
<% if attr.is_a?(Hash) %>
|
@@ -65,7 +74,7 @@
|
|
65
74
|
<em><%= t('slash_admin.view.no_image') %></em>
|
66
75
|
<% end %>
|
67
76
|
</td>
|
68
|
-
|
77
|
+
<% else %>
|
69
78
|
<td class="<%= attr.to_s.parameterize.underscore.downcase %>"><%= render attr.keys.first.to_s, model: m %></td>
|
70
79
|
<% end %>
|
71
80
|
<% else %>
|
@@ -88,7 +97,8 @@
|
|
88
97
|
<div class="modal-dialog" role="document">
|
89
98
|
<div class="modal-content">
|
90
99
|
<div class="modal-header">
|
91
|
-
<h5 class="modal-title" id="exampleModalLabel"><%= t('slash_admin.view.associations') %>
|
100
|
+
<h5 class="modal-title" id="exampleModalLabel"><%= t('slash_admin.view.associations') %>
|
101
|
+
<strong>(<%= m.send(attr).length %>)</strong></h5>
|
92
102
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
93
103
|
<span aria-hidden="true">×</span>
|
94
104
|
</button>
|
@@ -99,7 +109,7 @@
|
|
99
109
|
<% else %>
|
100
110
|
<% m.send(attr).each do |a| %>
|
101
111
|
<%= link_to(edit_polymorphic_url([:slash_admin, a]), class: 'link', target: '_blank') do %>
|
102
|
-
<%= show_object(a) %><br
|
112
|
+
<%= show_object(a) %><br/>
|
103
113
|
<% end rescue show_object(a) %>
|
104
114
|
<% end %>
|
105
115
|
<% end %>
|
@@ -145,7 +155,7 @@
|
|
145
155
|
<%= render 'slash_admin/shared/better_paginate' %>
|
146
156
|
|
147
157
|
<script type="text/javascript">
|
148
|
-
$(document).on('turbolinks:load', function() {
|
158
|
+
$(document).on('turbolinks:load', function () {
|
149
159
|
$('.bootstrap-datepicker').datepicker({
|
150
160
|
language: '<%= I18n.locale.to_s %>',
|
151
161
|
format: "YYYY-MM-DD",
|
@@ -156,7 +166,7 @@
|
|
156
166
|
});
|
157
167
|
|
158
168
|
// handle Sort
|
159
|
-
$('.ordered').on('click', function() {
|
169
|
+
$('.ordered').on('click', function () {
|
160
170
|
var field = $(this).data('order-field');
|
161
171
|
|
162
172
|
if (field) {
|
@@ -170,13 +180,13 @@
|
|
170
180
|
|
171
181
|
// change order field should reset pagination
|
172
182
|
$('.admin-pagination input').val(1);
|
173
|
-
$('.admin-pagination option:first').prop('selected',true);
|
183
|
+
$('.admin-pagination option:first').prop('selected', true);
|
174
184
|
handleFiltersAndLocation();
|
175
185
|
}
|
176
186
|
});
|
177
187
|
|
178
188
|
function toggle_order(order_direction) {
|
179
|
-
return order_direction
|
189
|
+
return order_direction === 'DESC' ? 'ASC' : 'DESC';
|
180
190
|
}
|
181
191
|
|
182
192
|
function handle_form(field, order_direction) {
|
@@ -240,11 +250,11 @@
|
|
240
250
|
}
|
241
251
|
});
|
242
252
|
|
243
|
-
$('#reset-filters').on('click', function(e) {
|
253
|
+
$('#reset-filters').on('click', function (e) {
|
244
254
|
e.preventDefault();
|
245
255
|
|
246
256
|
$("input[name*='filters']").val('');
|
247
|
-
$("select[name*='filters'] option:first").prop('selected',true);
|
257
|
+
$("select[name*='filters'] option:first").prop('selected', true);
|
248
258
|
|
249
259
|
$('#filters').trigger('submit');
|
250
260
|
});
|
@@ -258,9 +268,9 @@
|
|
258
268
|
var paginationParams = $('.admin-pagination').first().serialize();
|
259
269
|
var orderParams = $('#order').serialize();
|
260
270
|
|
261
|
-
parameters = '';
|
262
|
-
$.each([filtersParams, paginationParams, orderParams], function(index, params) {
|
263
|
-
if (index
|
271
|
+
var parameters = '';
|
272
|
+
$.each([filtersParams, paginationParams, orderParams], function (index, params) {
|
273
|
+
if (index !== 0) {
|
264
274
|
parameters += '&' + params;
|
265
275
|
} else {
|
266
276
|
parameters += params;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class JsonValidator < ActiveModel::EachValidator
|
2
2
|
def validate_each(record, attribute, value)
|
3
|
-
record.errors[attribute] << (options[:message] || I18n.t(
|
3
|
+
record.errors[attribute] << (options[:message] || I18n.t("slash_admin.view.json_not_valid")) unless valid_json?(value)
|
4
4
|
end
|
5
5
|
|
6
6
|
def valid_json?(string)
|
data/config/routes.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
SlashAdmin::Engine.routes.draw do
|
2
2
|
scope :admin do
|
3
|
-
get
|
4
|
-
get
|
5
|
-
post
|
6
|
-
get
|
7
|
-
get
|
3
|
+
get "/" => "dashboard#home", :as => "dashboard"
|
4
|
+
get "login" => "security/sessions#new"
|
5
|
+
post "login", to: "security/sessions#create"
|
6
|
+
get "logout" => "security/sessions#destroy"
|
7
|
+
get "dashboard/toggle" => "dashboard#toggle", :as => "toggle_dashboard"
|
8
8
|
|
9
|
-
get
|
9
|
+
get "search" => "selectize#search", :as => "remote_selectize"
|
10
10
|
|
11
11
|
# Batch actions
|
12
12
|
|
13
13
|
# DELETE
|
14
|
-
post
|
14
|
+
post "batch_actions/delete/:model_class", to: "batch_actions#delete", as: "batch_delete"
|
15
15
|
end
|
16
16
|
end
|
@@ -1,16 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
class CreateSlashAdminAdmins < ActiveRecord::Migration[5.0]
|
3
4
|
def change
|
4
5
|
create_table :slash_admin_admins do |t|
|
5
6
|
## Database authenticatable
|
6
|
-
t.string :username,
|
7
|
-
t.string :email,
|
8
|
-
t.string :password_digest,
|
7
|
+
t.string :username, null: false, default: ""
|
8
|
+
t.string :email, null: false, default: ""
|
9
|
+
t.string :password_digest, null: false, default: ""
|
9
10
|
t.string :avatar
|
10
11
|
t.string :roles
|
11
12
|
|
12
13
|
## Recoverable
|
13
|
-
t.string
|
14
|
+
t.string :reset_password_token
|
14
15
|
t.datetime :reset_password_sent_at
|
15
16
|
|
16
17
|
t.timestamps null: false
|
data/lib/batch_translation.rb
CHANGED
@@ -4,13 +4,13 @@ module ActionView
|
|
4
4
|
module Helpers
|
5
5
|
class FormBuilder
|
6
6
|
def globalize_fields_for(locale, *args, &proc)
|
7
|
-
raise ArgumentError,
|
7
|
+
raise ArgumentError, "Missing block" unless block_given?
|
8
8
|
options = args.extract_options!
|
9
9
|
@index = @index ? @index + 1 : 1
|
10
10
|
object_name = "#{@object_name}[translations_attributes][#{@index}]"
|
11
11
|
form_object = @object || @object_name.to_s.camelize.constantize.new
|
12
|
-
object = form_object.translations.
|
13
|
-
@template.concat @template.hidden_field_tag("#{object_name}[id]", object ? object.id :
|
12
|
+
object = form_object.translations.find { |t| t.locale.to_s == locale.to_s }
|
13
|
+
@template.concat @template.hidden_field_tag("#{object_name}[id]", object ? object.id : "")
|
14
14
|
@template.concat @template.hidden_field_tag("#{object_name}[locale]", locale)
|
15
15
|
@template.fields_for(object_name, object, options, &proc)
|
16
16
|
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module SlashAdmin
|
3
4
|
module Generators
|
4
5
|
class ControllersGenerator < Rails::Generators::Base
|
5
|
-
source_root File.expand_path(
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
6
7
|
argument :model, required: true,
|
7
|
-
desc:
|
8
|
+
desc: "The model concerned"
|
8
9
|
|
9
10
|
def create_controller
|
10
11
|
@model_name = model.camelize
|
11
|
-
template
|
12
|
-
|
12
|
+
template "controllers.erb",
|
13
|
+
"app/controllers/slash_admin/models/#{model}_controller.rb"
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module SlashAdmin
|
3
4
|
module Generators
|
4
5
|
class InstallGenerator < Rails::Generators::Base
|
5
|
-
source_root File.expand_path(
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
6
7
|
|
7
8
|
def install
|
8
|
-
template
|
9
|
-
|
9
|
+
template "install.erb",
|
10
|
+
"app/helpers/slash_admin/menu_helper.rb"
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
@@ -3,11 +3,11 @@
|
|
3
3
|
module SlashAdmin
|
4
4
|
module Generators
|
5
5
|
class OverrideAdminGenerator < Rails::Generators::Base
|
6
|
-
source_root File.expand_path(
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
7
7
|
|
8
8
|
def override_admin
|
9
|
-
template
|
10
|
-
|
9
|
+
template "admin.erb",
|
10
|
+
"app/models/slash_admin/admin.rb"
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module SlashAdmin
|
3
4
|
module Generators
|
4
5
|
class OverrideSessionGenerator < Rails::Generators::Base
|
5
|
-
source_root File.expand_path(
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
6
7
|
|
7
8
|
def override_session
|
8
|
-
template
|
9
|
-
|
9
|
+
template "session.erb",
|
10
|
+
"app/controllers/slash_admin/security/sessions_controller.rb"
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module SlashAdmin
|
3
4
|
module Generators
|
4
5
|
class PermissionsGenerator < Rails::Generators::Base
|
5
|
-
source_root File.expand_path(
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
6
7
|
|
7
8
|
def create_permissions
|
8
|
-
template
|
9
|
-
|
9
|
+
template "permissions.erb",
|
10
|
+
"app/models/slash_admin/admin_ability.rb"
|
10
11
|
end
|
11
12
|
end
|
12
13
|
end
|
data/lib/slash_admin/engine.rb
CHANGED
data/lib/slash_admin/version.rb
CHANGED
data/lib/slash_admin.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
3
|
+
require "slash_admin/engine"
|
4
|
+
require "cancancan"
|
5
|
+
require "kaminari"
|
6
|
+
require "groupdate"
|
7
|
+
require "ruby_identicon"
|
8
|
+
require "bcrypt"
|
9
|
+
require "chartkick"
|
10
|
+
require "chart-js-rails"
|
11
|
+
require "highcharts-rails"
|
12
|
+
require "selectize-rails"
|
13
|
+
require "js-routes"
|
14
|
+
require "i18n-js"
|
15
|
+
require "bootstrap"
|
16
|
+
require "cocoon"
|
17
|
+
require "datetime_picker_rails"
|
18
|
+
require "jquery-rails"
|
19
|
+
require "jquery-minicolors-rails"
|
20
|
+
require "momentjs-rails"
|
21
|
+
require "tether-rails"
|
22
|
+
require "sweetalert-rails"
|
23
|
+
require "http_accept_language"
|
24
|
+
require "batch_translation"
|
25
25
|
|
26
26
|
module SlashAdmin
|
27
27
|
end
|
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.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KOVACS Nicolas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-10-
|
11
|
+
date: 2019-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|