ab_admin 0.8.3 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +11 -5
- data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +0 -25
- data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +3 -5
- data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +5 -1
- data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +24 -23
- data/app/assets/javascripts/ab_admin/core/init.js.coffee +6 -2
- data/app/assets/javascripts/ab_admin/core/search_form.js.coffee +1 -7
- data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +2 -6
- data/app/assets/javascripts/ab_admin/core/utils.js.coffee +8 -2
- data/app/assets/javascripts/ab_admin/main.js +2 -2
- data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.scss +35 -10
- data/app/assets/stylesheets/ab_admin/components/_base.scss +21 -1
- data/app/assets/stylesheets/ab_admin/components/_form.scss +13 -17
- data/app/assets/stylesheets/ab_admin/components/_grid_view.scss +2 -2
- data/app/assets/stylesheets/ab_admin/components/_locale_tabs.scss +11 -23
- data/app/assets/stylesheets/ab_admin/components/_navigation.scss +0 -9
- data/app/assets/stylesheets/ab_admin/components/_table_view.scss +10 -2
- data/app/assets/stylesheets/ab_admin/components/_tooltip.scss +80 -0
- data/app/assets/stylesheets/ab_admin/components/_tree_view.scss +1 -1
- data/app/assets/stylesheets/ab_admin/devise.scss +2 -2
- data/app/assets/stylesheets/ab_admin/fileupload.scss +2 -9
- data/app/assets/stylesheets/ab_admin/main.scss +0 -1
- data/app/controllers/admin/base_controller.rb +67 -63
- data/app/controllers/admin/dashboards_controller.rb +2 -2
- data/app/controllers/admin/locators_controller.rb +8 -6
- data/app/controllers/admin/manager_controller.rb +2 -2
- data/app/controllers/admin/static_pages_controller.rb +0 -4
- data/app/controllers/admin/structures_controller.rb +2 -2
- data/app/views/admin/assets/batch_edit.html.slim +1 -1
- data/app/views/admin/base/_search_layout.html.slim +6 -5
- data/app/views/admin/base/create.js.erb +5 -2
- data/app/views/admin/base/index.html.slim +4 -4
- data/app/views/admin/base/update.js.erb +5 -0
- data/app/views/admin/fileupload/_asset_templates.html.slim +1 -2
- data/app/views/admin/fileupload/_image.html.slim +1 -2
- data/app/views/admin/locators/edit.html.slim +7 -6
- data/app/views/admin/manager/_map.html.slim +4 -0
- data/app/views/admin/manager/_table.html.slim +1 -1
- data/app/views/admin/shared/_content_actions.html.slim +19 -21
- data/app/views/admin/shared/_flash.html.slim +5 -4
- data/app/views/admin/shared/_locale_tabs.html.slim +2 -2
- data/app/views/admin/shared/_main_menu.html.slim +1 -1
- data/app/views/admin/structures/_form.html.slim +1 -1
- data/app/views/admin/users/_form.html.slim +1 -1
- data/app/views/admin/users/_search_form.html.slim +1 -1
- data/app/views/layouts/admin/_footer.html.slim +0 -1
- data/app/views/layouts/admin/_navigation.html.slim +1 -1
- data/app/views/layouts/admin/application.html.slim +2 -2
- data/config/locales/de.yml +1 -2
- data/config/locales/en.yml +1 -2
- data/config/locales/ru.yml +0 -1
- data/config/locales/uk.yml +0 -1
- data/lib/ab_admin.rb +34 -33
- data/lib/ab_admin/abstract_resource.rb +1 -1
- data/lib/ab_admin/carrierwave/base_uploader.rb +1 -2
- data/lib/ab_admin/concerns/admin_addition.rb +0 -30
- data/lib/ab_admin/concerns/translations_macro.rb +97 -0
- data/lib/ab_admin/concerns/utilities.rb +1 -1
- data/lib/ab_admin/config/base.rb +7 -0
- data/lib/ab_admin/controllers/callbacks.rb +3 -26
- data/lib/ab_admin/core_ext/array.rb +4 -48
- data/lib/ab_admin/core_ext/hash.rb +2 -31
- data/lib/ab_admin/core_ext/other.rb +0 -6
- data/lib/ab_admin/core_ext/string.rb +0 -80
- data/lib/ab_admin/engine.rb +1 -0
- data/lib/ab_admin/hooks/will_paginate_id_prefetch.rb +8 -6
- data/lib/ab_admin/hooks/will_paginate_no_uri.rb +1 -1
- data/lib/ab_admin/i18n_tools/google_translate.rb +3 -1
- data/lib/ab_admin/i18n_tools/model_translator.rb +1 -1
- data/lib/ab_admin/models/header.rb +2 -2
- data/lib/ab_admin/models/locator.rb +28 -2
- data/lib/ab_admin/models/user.rb +12 -48
- data/lib/ab_admin/utils/csv_document.rb +5 -3
- data/lib/ab_admin/utils/eval_helpers.rb +6 -3
- data/lib/ab_admin/utils/xls_document.rb +18 -16
- data/lib/ab_admin/version.rb +1 -1
- data/lib/ab_admin/views/admin_helpers.rb +10 -12
- data/lib/ab_admin/views/admin_navigation_helpers.rb +7 -8
- data/lib/ab_admin/views/form_builder.rb +7 -5
- data/lib/ab_admin/views/helpers.rb +0 -9
- data/lib/ab_admin/views/inputs/ckeditor_input.rb +4 -4
- data/lib/ab_admin/views/manager_helpers.rb +8 -5
- data/lib/ab_admin/views/search_form_builder.rb +2 -2
- data/lib/ab_admin/views/will_paginate_bootstrap_renderer.rb +60 -0
- data/lib/generators/ab_admin/glob/glob_generator.rb +4 -5
- data/lib/generators/ab_admin/glob/templates/migration.erb +10 -7
- data/lib/generators/ab_admin/install/templates/config/ab_admin.rb.erb +1 -1
- data/lib/generators/ab_admin/install/templates/models/user.rb +0 -11
- data/lib/generators/ab_admin/install/templates/spec/spec_helper.rb +0 -1
- data/lib/generators/ab_admin/install/templates/spec/support/database_cleaner.rb +8 -11
- data/lib/generators/ab_admin/model/model_generator.rb +3 -4
- data/lib/generators/ab_admin/model/templates/resource.erb +5 -2
- data/lib/generators/ab_admin/resource/templates/controller.erb +2 -2
- metadata +37 -79
- data/app/assets/images/admin/Jcrop.gif +0 -0
- data/app/assets/images/admin/flags/de.png +0 -0
- data/app/assets/images/admin/flags/en.png +0 -0
- data/app/assets/images/admin/flags/es.png +0 -0
- data/app/assets/images/admin/flags/fr.png +0 -0
- data/app/assets/images/admin/flags/it.png +0 -0
- data/app/assets/images/admin/flags/ja.png +0 -0
- data/app/assets/images/admin/flags/pl.png +0 -0
- data/app/assets/images/admin/flags/ru.png +0 -0
- data/app/assets/images/admin/flags/uk.png +0 -0
- data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +0 -33
- data/app/assets/stylesheets/ab_admin/components/_columns_hider.scss +0 -5
- data/app/assets/stylesheets/ab_admin/components/_perms.scss +0 -39
- data/app/views/admin/shared/_columns_hider.html.slim +0 -9
- data/lib/ab_admin/hooks/globalize_locale_suffix_accessors.rb +0 -25
- data/lib/ab_admin/hooks/globalize_valid_locale.rb +0 -9
- data/lib/generators/ab_admin/ckeditor_assets/ckeditor_assets_generator.rb +0 -19
- data/lib/generators/template.rb +0 -96
@@ -1,5 +1,4 @@
|
|
1
1
|
class Hash
|
2
|
-
|
3
2
|
def reverse_deep_merge!(other_hash)
|
4
3
|
other_hash.each_pair do |k, v|
|
5
4
|
tv = self[k]
|
@@ -68,29 +67,13 @@ class Hash
|
|
68
67
|
end
|
69
68
|
end
|
70
69
|
|
71
|
-
def
|
72
|
-
if array.empty?
|
73
|
-
self
|
74
|
-
else
|
75
|
-
key = array.shift
|
76
|
-
value = self[key]
|
77
|
-
if array.empty?
|
78
|
-
value
|
79
|
-
elsif value.is_a? Hash
|
80
|
-
value.val(*array)
|
81
|
-
else
|
82
|
-
nil
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def store_multi(value, *keys)
|
70
|
+
def dig_store(value, *keys)
|
88
71
|
key = keys.shift
|
89
72
|
self[key] ||= {}
|
90
73
|
if keys.empty?
|
91
74
|
self[key] = value
|
92
75
|
else
|
93
|
-
self[key] = self[key].
|
76
|
+
self[key] = self[key].dig_store(value, *keys)
|
94
77
|
end
|
95
78
|
self
|
96
79
|
end
|
@@ -107,18 +90,6 @@ class Hash
|
|
107
90
|
reject { |_, v| v.blank? }
|
108
91
|
end
|
109
92
|
|
110
|
-
def no_blank
|
111
|
-
ActiveSupport::Deprecation.warn('`no_blank` is deprecated, use `reject_blank` instead')
|
112
|
-
reject_blank
|
113
|
-
end
|
114
|
-
|
115
|
-
def try_keys(*try_keys)
|
116
|
-
try_keys.each do |k|
|
117
|
-
return self[k] if self.has_key?(k)
|
118
|
-
end
|
119
|
-
default
|
120
|
-
end
|
121
|
-
|
122
93
|
def deep_stringify_keys
|
123
94
|
inject({}) { |result, (key, value)|
|
124
95
|
value = value.deep_stringify_keys if value.is_a?(Hash)
|
@@ -1,41 +1,4 @@
|
|
1
1
|
class String
|
2
|
-
# http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html
|
3
|
-
#LUCENE_ESCAPE_REGEX = /(\+|-|&&|\|\||!|\(|\)|{|}|\[|\]|`|"|~|\?|:|\\|\/)/
|
4
|
-
#LUCENE_ESCAPE_REGEX = /(\+|-|&&|\|\||!|\(|\)|{|}|\[|\]|`|"|~|\?|:|\\|\s)/
|
5
|
-
|
6
|
-
KEYBOARDS = {
|
7
|
-
en: 'qwertyuiop[]asdfghjkl;\'zxcvbnm,./',
|
8
|
-
ru: 'йцукенгшщзхъфывапролджэячсмитьбю/'
|
9
|
-
}
|
10
|
-
|
11
|
-
unless defined? LUCENE_ESCAPE_REGEX
|
12
|
-
LUCENE_ESCAPE_REGEX = /(\+|-|&&|\|\||!|\(|\)|{|}|\[|\]|\^|"|~|\*|\?|:|\\|\/)/
|
13
|
-
|
14
|
-
def lucene_escape
|
15
|
-
self.gsub(LUCENE_ESCAPE_REGEX, "\\\\\\1")
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def capitalize_first
|
20
|
-
self.mb_chars[0].capitalize + self.mb_chars[1..-1]
|
21
|
-
end
|
22
|
-
|
23
|
-
def is_int?
|
24
|
-
self =~ /^[-+]?[0-9]+$/
|
25
|
-
end
|
26
|
-
|
27
|
-
def is_number?
|
28
|
-
self =~ /^[-+]?[0-9]+(\.[0-9]+)?$/
|
29
|
-
end
|
30
|
-
|
31
|
-
def to_utc
|
32
|
-
begin
|
33
|
-
Time.zone.parse(self).utc
|
34
|
-
rescue
|
35
|
-
Time.now.utc
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
2
|
def no_html
|
40
3
|
str = self.dup
|
41
4
|
str.gsub!(/<br\/?>/, ' ')
|
@@ -44,49 +7,6 @@ class String
|
|
44
7
|
str.gsub!(' ', ' ')
|
45
8
|
str
|
46
9
|
end
|
47
|
-
|
48
|
-
def tr_lang(from=nil, to=nil)
|
49
|
-
return '' if self.blank?
|
50
|
-
|
51
|
-
unless from || to
|
52
|
-
if KEYBOARDS[:en].index(self[0])
|
53
|
-
from, to = :en, :ru
|
54
|
-
elsif KEYBOARDS[:ru].index(self[0])
|
55
|
-
from, to = :ru, :en
|
56
|
-
else
|
57
|
-
from, to = :en, :ru
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
self.tr(KEYBOARDS[from], KEYBOARDS[to])
|
62
|
-
end
|
63
|
-
|
64
|
-
def count_words
|
65
|
-
clean_text.scan(/(\p{Alnum}+([-'.]\p{Alnum}+)*)/u).size
|
66
|
-
end
|
67
|
-
|
68
|
-
def words_count
|
69
|
-
frequencies = Hash.new(0)
|
70
|
-
downcase.scan(/(\w+([-'.]\w+)*)/) { |word, ignore| frequencies[word] += 1 }
|
71
|
-
frequencies
|
72
|
-
end
|
73
|
-
|
74
|
-
def self.randomize(length = 8)
|
75
|
-
Array.new(length) { (rand(122-97) + 97).chr }.join
|
76
|
-
end
|
77
|
-
|
78
|
-
def clean_text
|
79
|
-
coder = HTMLEntities.new
|
80
|
-
coder.decode(self.no_html)
|
81
|
-
end
|
82
|
-
|
83
|
-
def mb_upcase
|
84
|
-
mb_chars.upcase.to_s
|
85
|
-
end
|
86
|
-
|
87
|
-
def mb_downcase
|
88
|
-
mb_chars.downcase.to_s
|
89
|
-
end
|
90
10
|
end
|
91
11
|
|
92
12
|
unless ''.respond_to?(:each)
|
data/lib/ab_admin/engine.rb
CHANGED
@@ -19,6 +19,7 @@ module AbAdmin
|
|
19
19
|
ActiveRecord::Base.send :extend, AbAdmin::Concerns::Silencer
|
20
20
|
ActiveRecord::Base.send :include, AbAdmin::Concerns::Validations
|
21
21
|
ActiveRecord::Base.send :include, AbAdmin::Concerns::Fileuploads
|
22
|
+
ActiveRecord::Base.send :extend, AbAdmin::Concerns::TranslationsMacro
|
22
23
|
ActiveRecord::Base.send :extend, EnumField::EnumeratedAttribute
|
23
24
|
end
|
24
25
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'will_paginate/active_record'
|
2
|
+
|
1
3
|
# add `:large` option with make pagination on large tables easier, because `SELECT *` is slow with large `OFFSET`:
|
2
4
|
# first it fetch ids of the records using `SELECT id`
|
3
5
|
# and in the second query it fetch records
|
@@ -10,7 +12,7 @@ module WillPaginate
|
|
10
12
|
if value.nil?
|
11
13
|
paginate_limit || limit_value
|
12
14
|
else
|
13
|
-
limit(value)
|
15
|
+
limit(value.to_i)
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
@@ -18,7 +20,7 @@ module WillPaginate
|
|
18
20
|
if value.nil?
|
19
21
|
paginate_offset || offset_value
|
20
22
|
else
|
21
|
-
super(value)
|
23
|
+
super(value.to_i)
|
22
24
|
end
|
23
25
|
end
|
24
26
|
end
|
@@ -26,8 +28,8 @@ module WillPaginate
|
|
26
28
|
module Pagination
|
27
29
|
def paginate(options)
|
28
30
|
options = options.dup
|
29
|
-
page_number =
|
30
|
-
per_page = options.delete(:per_page) || self.per_page
|
31
|
+
page_number = [1, options[:page].to_i].max
|
32
|
+
per_page = (options.delete(:per_page) || self.per_page).to_i
|
31
33
|
total = options.delete(:total_entries)
|
32
34
|
large = options.delete(:large)
|
33
35
|
|
@@ -40,8 +42,8 @@ module WillPaginate
|
|
40
42
|
rel.total_entries = total.to_i unless total.blank?
|
41
43
|
|
42
44
|
if large
|
43
|
-
ids = rel.except(:includes).pluck(Arel.sql("#{quoted_table_name}
|
44
|
-
new_rel = rel.except(:limit, :offset, :where).where(
|
45
|
+
ids = rel.except(:includes).pluck(Arel.sql("#{quoted_table_name}.#{primary_key}"))
|
46
|
+
new_rel = rel.except(:limit, :offset, :where).where(primary_key => ids)
|
45
47
|
new_rel.paginate_limit = rel.limit_value.to_i
|
46
48
|
new_rel.paginate_offset = rel.offset_value.to_i
|
47
49
|
new_rel.total_entries = rel.total_entries
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# add `:no_uri` options to skip query params in pagination urls
|
2
1
|
require 'will_paginate/view_helpers/action_view'
|
3
2
|
|
3
|
+
# add `:no_uri` options to skip query params in pagination urls
|
4
4
|
WillPaginate::ViewHelpers.pagination_options[:no_uri] = false
|
5
5
|
WillPaginate::ActionView::LinkRenderer.class_exec do
|
6
6
|
def url(page)
|
@@ -19,7 +19,9 @@ module AbAdmin
|
|
19
19
|
|
20
20
|
if response.code == 200
|
21
21
|
json = MultiJson.decode(response)
|
22
|
-
json['data']['translations'][0]['translatedText']
|
22
|
+
res = json['data']['translations'][0]['translatedText'].to_s.gsub(/%\s{/, ' %{')
|
23
|
+
res = "#{res[0].upcase}#{res[1..-1]}" if text.first[/[[:upper:]]/]
|
24
|
+
res
|
23
25
|
else
|
24
26
|
raise StandardError, response.inspect
|
25
27
|
end
|
@@ -24,12 +24,12 @@ module AbAdmin
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def normalize_html
|
27
|
-
|
27
|
+
AbAdmin.translated_locales.each do |loc|
|
28
28
|
%w(title h1 keywords description).each do |attr|
|
29
29
|
send("#{attr}_#{loc}=", send("#{attr}_#{loc}").to_s.no_html)
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
32
|
+
AbAdmin.translated_locales.each do |loc|
|
33
33
|
send("seo_block_#{loc}=", sanitize(send("seo_block_#{loc}").to_s))
|
34
34
|
end
|
35
35
|
end
|
@@ -58,12 +58,38 @@ module AbAdmin
|
|
58
58
|
csv_data.each do |d|
|
59
59
|
key_parts = [l.to_s] + d[0].split('.')
|
60
60
|
raise "Invalid key #{d[0]}" unless data.dig(*key_parts)
|
61
|
-
data.
|
61
|
+
data.dig_store(d[i], *key_parts)
|
62
62
|
end
|
63
63
|
save path, data
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
INTERPOLATION_REGEXP = /%{[^}]+}/
|
68
|
+
def csv_errors(csv)
|
69
|
+
return ['CSV blank'] if csv.blank?
|
70
|
+
csv_data = CSV.parse(csv)
|
71
|
+
errors = []
|
72
|
+
csv_data.shift.each_with_index do |l, i|
|
73
|
+
next if i.zero?
|
74
|
+
unless I18n.available_locales.include?(l.to_sym)
|
75
|
+
errors << "Unknown locale #{l}"
|
76
|
+
next
|
77
|
+
end
|
78
|
+
csv_data.each do |d|
|
79
|
+
key = d[0]
|
80
|
+
next if d[i].blank?
|
81
|
+
if translations.dig(I18n.default_locale, key)
|
82
|
+
unless translations.dig(I18n.default_locale, key).scan(INTERPOLATION_REGEXP).sort == d[i].scan(INTERPOLATION_REGEXP).sort
|
83
|
+
errors << "Wrong interpolations #{I18n.default_locale}:'#{translations.dig(I18n.default_locale, key)}' #{l}:#{d[i]}"
|
84
|
+
end
|
85
|
+
else
|
86
|
+
errors << "Extra interpolations #{l}:#{d[i]}" if d[i].scan(INTERPOLATION_REGEXP).present?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
errors
|
91
|
+
end
|
92
|
+
|
67
93
|
def translations
|
68
94
|
@translations ||= I18n.backend.send(:translations).slice(*I18n.available_locales).transform_values{|v| v.flatten_hash.transform_keys{|k| k.join('.') } }
|
69
95
|
end
|
@@ -93,7 +119,7 @@ module AbAdmin
|
|
93
119
|
message = nil
|
94
120
|
locale_replace_regexp = Regexp.new("(^#{I18n.default_locale}|(?<=\.)#{I18n.default_locale}(?=\.yml))")
|
95
121
|
|
96
|
-
locale_files = @files.map { |path| self.class.prepare_data(path) }
|
122
|
+
locale_files = @files.find_all{|f| f =~ /\/\w+(\.readonly)?\.yml/ }.map { |path| self.class.prepare_data(path) }
|
97
123
|
main_locale_files = locale_files.find_all { |file| file.locale == I18n.default_locale }
|
98
124
|
|
99
125
|
main_locale_files.each do |main_file|
|
data/lib/ab_admin/models/user.rb
CHANGED
@@ -6,17 +6,14 @@ module AbAdmin
|
|
6
6
|
included do
|
7
7
|
has_one :avatar, as: :assetable, dependent: :destroy, autosave: true
|
8
8
|
|
9
|
-
scope :managers, -> { where(user_role_id: [::UserRoleType.admin.id, ::UserRoleType.moderator.id]) }
|
10
9
|
scope :active, -> { where(locked_at: nil) }
|
11
10
|
scope :admin, proc { includes(:avatar) }
|
12
11
|
|
13
|
-
after_initialize :init
|
14
|
-
before_validation :generate_login
|
15
|
-
before_validation :set_default_role, unless: :user_role_id?
|
16
|
-
|
17
|
-
validate :check_role
|
18
|
-
|
19
12
|
enumerated_attribute :user_role_type, id_attribute: :user_role_id, class: ::UserRoleType
|
13
|
+
delegate *UserRoleType.codes.map{|code| "#{code}?" }, to: :user_role_type
|
14
|
+
end
|
15
|
+
|
16
|
+
def admin_menu_builder
|
20
17
|
end
|
21
18
|
|
22
19
|
def name
|
@@ -40,6 +37,10 @@ module AbAdmin
|
|
40
37
|
active_for_authentication?
|
41
38
|
end
|
42
39
|
|
40
|
+
def admin_access?
|
41
|
+
admin? || moderator?
|
42
|
+
end
|
43
|
+
|
43
44
|
def generate_password!
|
44
45
|
raw_password = AbAdmin.test_env? ? '654321' : AbAdmin.friendly_token
|
45
46
|
self.password = self.password_confirmation = raw_password
|
@@ -47,47 +48,10 @@ module AbAdmin
|
|
47
48
|
raw_password
|
48
49
|
end
|
49
50
|
|
50
|
-
def
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
def default?
|
55
|
-
has_role?(:default)
|
56
|
-
end
|
57
|
-
|
58
|
-
def redactor?
|
59
|
-
has_role?(:redactor)
|
60
|
-
end
|
61
|
-
|
62
|
-
def moderator?
|
63
|
-
has_role?(:admin) || has_role?(:moderator)
|
64
|
-
end
|
65
|
-
|
66
|
-
def admin?
|
67
|
-
has_role?(:admin)
|
68
|
-
end
|
69
|
-
|
70
|
-
def has_role?(role_name)
|
71
|
-
user_role_type.code == role_name
|
72
|
-
end
|
73
|
-
|
74
|
-
def set_default_role
|
75
|
-
self.user_role_id ||= ::UserRoleType.default.id
|
76
|
-
end
|
77
|
-
|
78
|
-
protected
|
79
|
-
|
80
|
-
def generate_login
|
81
|
-
self.login ||= begin
|
82
|
-
unless email.blank?
|
83
|
-
tmp_login = email.split('@').first
|
84
|
-
tmp_login.parameterize.downcase.gsub(/[^A-Za-z0-9-]+/, '-').gsub(/-+/, '-')
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def check_role
|
90
|
-
errors.add(:user_role_id, :invalid) unless ::UserRoleType.valid?(user_role_id)
|
51
|
+
def password_required?
|
52
|
+
return true if password.present?
|
53
|
+
return false if persisted? && password.blank?
|
54
|
+
super
|
91
55
|
end
|
92
56
|
end
|
93
57
|
end
|
@@ -27,12 +27,14 @@ module AbAdmin
|
|
27
27
|
@filename ||= [@options[:filename] || "#{@klass.model_name.plural}-#{Time.now.strftime('%Y-%m-%d')}", '.csv'].join
|
28
28
|
end
|
29
29
|
|
30
|
-
def render
|
30
|
+
def render(context=nil, options={})
|
31
31
|
::CSV.generate(col_sep: @options[:column_separator] || ',') do |csv|
|
32
32
|
csv << columns_names
|
33
33
|
|
34
|
-
|
35
|
-
|
34
|
+
I18n.with_locale options[:locale] do
|
35
|
+
each_record do |item|
|
36
|
+
csv << column_data.map { |column| AbAdmin.pretty_data call_method_or_proc_on(item, column, context: context) }
|
37
|
+
end
|
36
38
|
end
|
37
39
|
end
|
38
40
|
end
|
@@ -85,15 +85,18 @@ module AbAdmin
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def call_method_or_proc_on(obj, symbol_or_proc, options = {})
|
88
|
-
exec
|
88
|
+
options.reverse_merge!(exec: true)
|
89
89
|
case symbol_or_proc
|
90
90
|
when String
|
91
|
-
ActiveSupport::Deprecation.warn('`call_method_or_proc_on` don\'t accept method name as String, use Symbol instead') if symbol_or_proc =~ /\A\w+\z/
|
92
91
|
symbol_or_proc
|
93
92
|
when Symbol
|
94
93
|
obj.public_send(symbol_or_proc.to_sym, *options[:attrs])
|
95
94
|
when Proc
|
96
|
-
|
95
|
+
if options[:context]
|
96
|
+
options[:context].instance_exec(obj, &symbol_or_proc)
|
97
|
+
else
|
98
|
+
options[:exec] ? obj.instance_exec(&symbol_or_proc) : symbol_or_proc.call(obj)
|
99
|
+
end
|
97
100
|
end
|
98
101
|
end
|
99
102
|
end
|
@@ -49,25 +49,27 @@ module AbAdmin
|
|
49
49
|
@filename ||= [@options[:filename] || "#{@klass.model_name.plural}-#{Time.now.strftime('%Y-%m-%d')}", '.xlsx'].join
|
50
50
|
end
|
51
51
|
|
52
|
-
def render
|
52
|
+
def render(context, options={})
|
53
53
|
date_format = workbook.add_format(num_format: 'dd.mm.yyyy')
|
54
54
|
time_format = workbook.add_format(num_format: 'dd.mm.yyyy HH:MM')
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
56
|
+
I18n.with_locale options[:locale] do
|
57
|
+
each_with_index do |item, index|
|
58
|
+
row = index + 1
|
59
|
+
|
60
|
+
column_data.each_with_index do |column, num|
|
61
|
+
value = call_method_or_proc_on(item, column, context: context)
|
62
|
+
|
63
|
+
case value
|
64
|
+
when Date
|
65
|
+
worksheet.write_string(row, num, value.strftime('%Y-%m-%dT'), date_format)
|
66
|
+
when DateTime, Time
|
67
|
+
worksheet.write_date_time(row, num, value.strftime('%Y-%m-%dT%H:%M:%S.%L'), time_format)
|
68
|
+
when String
|
69
|
+
worksheet.write_string(row, num, value)
|
70
|
+
else
|
71
|
+
worksheet.write(row, num, AbAdmin.pretty_data(value))
|
72
|
+
end
|
71
73
|
end
|
72
74
|
end
|
73
75
|
end
|