ab_admin 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
data/config/locales/uk.yml
CHANGED
data/lib/ab_admin.rb
CHANGED
|
@@ -9,7 +9,7 @@ require 'ab_admin/engine'
|
|
|
9
9
|
|
|
10
10
|
module AbAdmin
|
|
11
11
|
DOMAINNAME_REGEXP = /\A(?:[0-9a-z]\.|[0-9a-z][0-9a-z\-]*[0-9a-z]+\.)+[a-z]{2,6}\z/
|
|
12
|
-
EMAIL_REGEXP = /\A[_A-Za-z0-9
|
|
12
|
+
EMAIL_REGEXP = /\A(?#Local part)[_A-Za-z0-9\-]+(?:\.[_A-Za-z0-9\-]+)*@(?#Subdomains)(?:[0-9a-z]\.|[0-9a-z][0-9a-z\-]*[0-9a-z]+\.)+(?#TopLevel Domains)[a-z]{2,18}\z/
|
|
13
13
|
|
|
14
14
|
autoload :Utils, 'ab_admin/utils'
|
|
15
15
|
autoload :Devise, 'ab_admin/devise'
|
|
@@ -63,6 +63,7 @@ module AbAdmin
|
|
|
63
63
|
autoload :HasTracking, 'ab_admin/concerns/has_tracking'
|
|
64
64
|
autoload :AssetHumanNames, 'ab_admin/concerns/asset_human_names'
|
|
65
65
|
autoload :Fileuploads, 'ab_admin/concerns/fileuploads'
|
|
66
|
+
autoload :TranslationsMacro, 'ab_admin/concerns/translations_macro'
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
module Controllers
|
|
@@ -100,6 +101,7 @@ module AbAdmin
|
|
|
100
101
|
autoload :SearchFormBuilder, 'ab_admin/views/search_form_builder'
|
|
101
102
|
autoload :UrlForRoutes, 'ab_admin/views/url_for_routes'
|
|
102
103
|
autoload :ContentOnlyWrapper, 'ab_admin/views/content_only_wrapper'
|
|
104
|
+
autoload :WillPaginateBootstrapRenderer, 'ab_admin/views/will_paginate_bootstrap_renderer'
|
|
103
105
|
|
|
104
106
|
module Inputs
|
|
105
107
|
autoload :CkeditorInput, 'ab_admin/views/inputs/ckeditor_input'
|
|
@@ -125,6 +127,13 @@ module AbAdmin
|
|
|
125
127
|
end
|
|
126
128
|
|
|
127
129
|
mattr_accessor :menu
|
|
130
|
+
mattr_accessor :body_css_class
|
|
131
|
+
mattr_accessor :favicon_path
|
|
132
|
+
mattr_accessor :footer_notes
|
|
133
|
+
mattr_accessor :default_url_options
|
|
134
|
+
mattr_accessor :locale
|
|
135
|
+
mattr_accessor :root_path
|
|
136
|
+
mattr_accessor :base_url
|
|
128
137
|
|
|
129
138
|
mattr_accessor :flash_keys
|
|
130
139
|
@@flash_keys = [:notice, :error]
|
|
@@ -135,11 +144,8 @@ module AbAdmin
|
|
|
135
144
|
mattr_accessor :site_name
|
|
136
145
|
@@site_name = 'AbAdmin'
|
|
137
146
|
|
|
138
|
-
mattr_accessor :
|
|
139
|
-
|
|
140
|
-
mattr_accessor :body_css_class
|
|
141
|
-
|
|
142
|
-
mattr_accessor :favicon_path
|
|
147
|
+
mattr_accessor :footer
|
|
148
|
+
@@footer = true
|
|
143
149
|
|
|
144
150
|
mattr_accessor :devise_layout
|
|
145
151
|
@@devise_layout = 'admin/devise'
|
|
@@ -154,46 +160,41 @@ module AbAdmin
|
|
|
154
160
|
@@translate_models = %w(User Asset Structure StaticPage Header AdminComment)
|
|
155
161
|
|
|
156
162
|
mattr_accessor :assets
|
|
157
|
-
@@assets = %w(ab_admin/devise.css bootstrap.js ab_admin/loading.gif ab_admin/clear.png ab_admin/clear.png
|
|
163
|
+
@@assets = %w(ab_admin/devise.css bootstrap.js ab_admin/loading.gif ab_admin/clear.png ab_admin/clear.png)
|
|
158
164
|
|
|
159
165
|
mattr_accessor :test_settings
|
|
160
166
|
@@test_settings = {}
|
|
161
167
|
|
|
162
|
-
mattr_accessor :footer
|
|
163
|
-
@@footer = true
|
|
164
|
-
|
|
165
|
-
mattr_accessor :footer_notes
|
|
166
|
-
|
|
167
|
-
mattr_accessor :default_url_options
|
|
168
|
-
|
|
169
|
-
mattr_accessor :locale
|
|
170
|
-
|
|
171
168
|
mattr_accessor :fileupload_url
|
|
172
169
|
@@fileupload_url = '/admin/assets'
|
|
173
170
|
|
|
174
171
|
mattr_accessor :uploads_dir
|
|
175
172
|
@@uploads_dir = 'uploads'
|
|
176
173
|
|
|
177
|
-
mattr_accessor :
|
|
178
|
-
|
|
179
|
-
mattr_accessor :default_resource_settings
|
|
180
|
-
@@default_resource_settings = {index_view: 'table', search: true, batch: true, hotkeys: true, list_dblclick: true}
|
|
181
|
-
|
|
182
|
-
mattr_accessor :default_per_page
|
|
183
|
-
@@default_per_page = 50
|
|
184
|
-
|
|
185
|
-
mattr_accessor :view_default_per_page
|
|
186
|
-
@@view_default_per_page = Hash.new { AbAdmin.default_per_page }
|
|
187
|
-
@@view_default_per_page[:tree] = 1000
|
|
174
|
+
mattr_accessor :default_permitted_params
|
|
175
|
+
@@default_permitted_params = [:fileupload_guid]
|
|
188
176
|
|
|
189
|
-
mattr_accessor :
|
|
190
|
-
@@
|
|
177
|
+
mattr_accessor :translated_locales
|
|
178
|
+
@@translated_locales = []
|
|
191
179
|
|
|
192
|
-
mattr_accessor :
|
|
193
|
-
@@
|
|
180
|
+
mattr_accessor :locale_to_country_code
|
|
181
|
+
@@locale_to_country_code = {ja: :jp, en: :gb, uk: :ua}
|
|
194
182
|
|
|
195
|
-
mattr_accessor :
|
|
196
|
-
@@
|
|
183
|
+
mattr_accessor :default_resource_settings
|
|
184
|
+
@@default_resource_settings = {
|
|
185
|
+
index_views: [:table],
|
|
186
|
+
search: true,
|
|
187
|
+
batch: true,
|
|
188
|
+
hotkeys: true,
|
|
189
|
+
button_scopes: true,
|
|
190
|
+
list_dblclick: true,
|
|
191
|
+
max_per_page: 10_000,
|
|
192
|
+
per_page_variants: [50, 100, 500, 1000],
|
|
193
|
+
default_per_page: 50,
|
|
194
|
+
view_default_per_page: Hash.new { 50 }.update(table: 50, tree: 1000, map: 1000),
|
|
195
|
+
pagination_index_views: [:table, :grid],
|
|
196
|
+
collection_actions: %w(index search batch rebuild),
|
|
197
|
+
}
|
|
197
198
|
|
|
198
199
|
extend Utils
|
|
199
200
|
|
|
@@ -6,7 +6,7 @@ module AbAdmin
|
|
|
6
6
|
ACTIONS = [:index, :show, :new, :edit, :create, :update, :destroy, :preview, :batch, :rebuild, :custom_action, :history]
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
attr_accessor :model, :table, :search, :export, :form, :chart, :modal_form, :show, :preview_path, :actions, :custom_settings,
|
|
9
|
+
attr_accessor :model, :table, :search, :export, :form, :chart, :map, :modal_form, :show, :preview_path, :actions, :custom_settings,
|
|
10
10
|
:batch_action_list, :action_items, :disabled_action_items, :resource_action_items, :tree_node_renderer,
|
|
11
11
|
:parent_resources, :custom_actions, :permitted_params, :scopes
|
|
12
12
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require 'mime/types'
|
|
2
1
|
require 'mini_magick'
|
|
3
2
|
require 'carrierwave/processing/mini_magick'
|
|
4
3
|
|
|
@@ -89,7 +88,7 @@ module AbAdmin
|
|
|
89
88
|
|
|
90
89
|
def normalize_filename(raw_filename)
|
|
91
90
|
parameterize_args = ActiveSupport::VERSION::MAJOR > 4 ? {separator: '_'} : '_'
|
|
92
|
-
I18n.transliterate(raw_filename).parameterize(parameterize_args).gsub(/[\-_]+/, '_').downcase
|
|
91
|
+
I18n.transliterate(raw_filename).parameterize(**parameterize_args).gsub(/[\-_]+/, '_').downcase
|
|
93
92
|
end
|
|
94
93
|
|
|
95
94
|
# rename files via move
|
|
@@ -12,13 +12,6 @@ module AbAdmin
|
|
|
12
12
|
self.batch_actions = [:destroy]
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
module ClassMethods
|
|
16
|
-
def for_input_token(r, attr=nil)
|
|
17
|
-
text = attr ? r[attr] : (r['name_ru'] || r['name'])
|
|
18
|
-
{id: r.id, text: text}
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
15
|
def for_input_token
|
|
23
16
|
{id: id, text: AbAdmin.safe_display_name(self).to_s}
|
|
24
17
|
end
|
|
@@ -27,28 +20,6 @@ module AbAdmin
|
|
|
27
20
|
"#{self.class.model_name.human(count: 1)} ##{self.id} #{AbAdmin.safe_display_name(self)}"
|
|
28
21
|
end
|
|
29
22
|
|
|
30
|
-
def translated_any(attr)
|
|
31
|
-
send(attr).presence || translations.detect { |r| r.send(attr).present? }.try!(attr)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def new_changes
|
|
35
|
-
excluded_attrs = [:updated_at]
|
|
36
|
-
excluded_attrs += translated_attribute_names if self.class.translates?
|
|
37
|
-
all_changes = changes.except(*excluded_attrs).map { |k, v| [k, v[1]] }.to_h
|
|
38
|
-
if self.class.translates?
|
|
39
|
-
globalize.dirty.each do |attr, changes|
|
|
40
|
-
changes.each do |change|
|
|
41
|
-
all_changes["#{attr}_#{change[0]}"] = send("#{attr}_#{change[0]}")
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
all_changes
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def admin_comments_count_non_zero
|
|
49
|
-
self[:admin_comments_count].to_i.zero? ? nil : self[:admin_comments_count]
|
|
50
|
-
end
|
|
51
|
-
|
|
52
23
|
def token_data(method, options={})
|
|
53
24
|
assoc = self.class.reflect_on_association(method)
|
|
54
25
|
scope = send(method)
|
|
@@ -92,7 +63,6 @@ module AbAdmin
|
|
|
92
63
|
sql = "(#{quoted_order_col} #{predicate} :val OR (#{quoted_order_col} = :val AND #{self.class.quote_column('id')} #{id_predicate} #{id}))"
|
|
93
64
|
scope.where(sql, val: send(order_col)).ransack(query[:q]).result(distinct: true).first
|
|
94
65
|
end
|
|
95
|
-
|
|
96
66
|
end
|
|
97
67
|
end
|
|
98
68
|
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
module AbAdmin
|
|
2
|
+
module Concerns
|
|
3
|
+
module TranslationsMacro
|
|
4
|
+
def translates(*attr_names)
|
|
5
|
+
options = attr_names.extract_options!
|
|
6
|
+
setup_translations(options) unless translates?
|
|
7
|
+
add_translated_attributes(attr_names.map(&:to_sym) - translated_attribute_names)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def setup_translations(options)
|
|
11
|
+
include InstanceMethods
|
|
12
|
+
extend ClassMethods
|
|
13
|
+
|
|
14
|
+
class_attribute :translated_attribute_names, :translation_options
|
|
15
|
+
self.translated_attribute_names = []
|
|
16
|
+
self.translation_options = options
|
|
17
|
+
|
|
18
|
+
has_many :translations, class_name: translation_class.name, foreign_key: class_name.foreign_key, dependent: :destroy, autosave: true, inverse_of: :translated_model
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def add_translated_attributes(attr_names)
|
|
22
|
+
attr_names.each do |attr_name|
|
|
23
|
+
define_translation_accessors(attr_name)
|
|
24
|
+
self.translated_attribute_names << attr_name
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def define_translation_accessors(attr_name)
|
|
29
|
+
define_method("#{attr_name}_translation") { translation_for_locale(I18n.locale).try!(:send, attr_name) }
|
|
30
|
+
define_method("#{attr_name}_translation=") {|v| translation_for_locale(I18n.locale).try!(:send, "#{attr_name}=", v) }
|
|
31
|
+
alias_method attr_name, "#{attr_name}_translation"
|
|
32
|
+
alias_method "#{attr_name}=", "#{attr_name}_translation="
|
|
33
|
+
define_method("#{attr_name}_default"){ translation_for_locale(I18n.default_locale).try!(:send, attr_name) }
|
|
34
|
+
AbAdmin.translated_locales.each do |l|
|
|
35
|
+
define_method("#{attr_name}_#{l}") {translation_for_locale(l).try!(:send, attr_name)}
|
|
36
|
+
define_method("#{attr_name}_#{l}=") {|v| translation_for_locale(l).try!(:send, "#{attr_name}=", v)}
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def class_name
|
|
41
|
+
name.split('::').last
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def translates?
|
|
45
|
+
included_modules.include?(InstanceMethods)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
module InstanceMethods
|
|
49
|
+
def translation_for_locale(l)
|
|
50
|
+
return unless AbAdmin.translated_locales.include?(l)
|
|
51
|
+
translations.detect{|r| r.locale == l.to_s} || translations.new(locale: l.to_s)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def translated_attributes
|
|
55
|
+
translated_attribute_names.map{|attr| [attr, send(attr)] }.to_h.stringify_keys
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def attributes
|
|
59
|
+
super.merge!(translated_attributes)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
module ClassMethods
|
|
64
|
+
def translation_class
|
|
65
|
+
@translation_class ||= begin
|
|
66
|
+
klass = self.const_defined?(:Translation, false) ? self.const_get(:Translation, false) : self.const_set(:Translation, Class.new(BaseTranslation))
|
|
67
|
+
klass.belongs_to :translated_model, class_name: self.name, foreign_key: class_name.foreign_key, inverse_of: :translations, touch: translation_options.fetch(:touch, false)
|
|
68
|
+
klass
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def translations_table_name
|
|
73
|
+
translation_class.table_name
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def translated?(name)
|
|
77
|
+
translated_attribute_names.include?(name.to_sym)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
class BaseTranslation < ::ActiveRecord::Base
|
|
83
|
+
self.abstract_class = true
|
|
84
|
+
|
|
85
|
+
validates :locale, presence: true
|
|
86
|
+
after_initialize :init
|
|
87
|
+
|
|
88
|
+
def init
|
|
89
|
+
self.locale ||= I18n.locale.to_s
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def self.table_exists?
|
|
93
|
+
table_name.present? && super
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
data/lib/ab_admin/config/base.rb
CHANGED
|
@@ -23,6 +23,9 @@ module AbAdmin
|
|
|
23
23
|
next if column_name == :id || options[:skip].try(:include?, column_name)
|
|
24
24
|
builder.field(column_name)
|
|
25
25
|
end
|
|
26
|
+
model.translated_attribute_names.each do |column_name|
|
|
27
|
+
builder.field(column_name, sortable: false)
|
|
28
|
+
end if model.translates?
|
|
26
29
|
end
|
|
27
30
|
end
|
|
28
31
|
end
|
|
@@ -39,6 +42,10 @@ module AbAdmin
|
|
|
39
42
|
self.partial_name = 'chart'
|
|
40
43
|
end
|
|
41
44
|
|
|
45
|
+
class Map < BaseBuilder
|
|
46
|
+
self.partial_name = 'map'
|
|
47
|
+
end
|
|
48
|
+
|
|
42
49
|
class Export < BaseBuilder
|
|
43
50
|
def render_options
|
|
44
51
|
{column_names: fields.map(&:name), column_data: fields.map(&:data),
|
|
@@ -3,44 +3,21 @@ module AbAdmin
|
|
|
3
3
|
module Callbacks
|
|
4
4
|
extend ActiveSupport::Concern
|
|
5
5
|
|
|
6
|
-
#included do
|
|
7
|
-
# define_admin_callbacks :build, :create, :update, :save, :destroy
|
|
8
|
-
#end
|
|
9
|
-
|
|
10
6
|
protected
|
|
11
7
|
|
|
12
|
-
def build_resource
|
|
13
|
-
object = get_resource_ivar || set_resource_ivar(end_of_association_chain.send(method_for_build, resource_params))
|
|
14
|
-
# run_build_callbacks object
|
|
15
|
-
object
|
|
16
|
-
end
|
|
17
|
-
|
|
18
8
|
def create_resource(object)
|
|
19
|
-
run_create_callbacks object
|
|
20
|
-
save_resource(object)
|
|
21
|
-
end
|
|
9
|
+
run_create_callbacks(object) {save_resource(object)}
|
|
22
10
|
end
|
|
23
11
|
|
|
24
12
|
def save_resource(object)
|
|
25
|
-
run_save_callbacks object
|
|
26
|
-
object.save
|
|
27
|
-
end
|
|
13
|
+
run_save_callbacks(object) {object.save}
|
|
28
14
|
end
|
|
29
15
|
|
|
30
16
|
def update_resource(object, attributes)
|
|
31
17
|
object.assign_attributes(attributes)
|
|
32
|
-
|
|
33
|
-
#run_update_callbacks object do
|
|
34
|
-
save_resource(object)
|
|
35
|
-
#end
|
|
18
|
+
save_resource(object)
|
|
36
19
|
end
|
|
37
20
|
|
|
38
|
-
#def destroy_resource(object)
|
|
39
|
-
# run_destroy_callbacks object do
|
|
40
|
-
# object.destroy
|
|
41
|
-
# end
|
|
42
|
-
#end
|
|
43
|
-
|
|
44
21
|
# Simple callback system. Implements before and after callbacks for
|
|
45
22
|
# use within the controllers.
|
|
46
23
|
#
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
class Array
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def word_count
|
|
7
|
-
each_with_object({}) do |word, h|
|
|
8
|
-
h[word] ||= 0
|
|
9
|
-
h[word] += 1
|
|
10
|
-
end
|
|
2
|
+
# TOREMOVE after ruby 2.7.0
|
|
3
|
+
def tally
|
|
4
|
+
each_with_object(Hash.new(0)) { |v, h| h[v] += 1 }
|
|
11
5
|
end
|
|
12
6
|
|
|
13
7
|
def deep_merge_hashes
|
|
@@ -22,30 +16,12 @@ class Array
|
|
|
22
16
|
inject(:+) / size
|
|
23
17
|
end
|
|
24
18
|
|
|
25
|
-
#def zip_all
|
|
26
|
-
# self[0].zip *self[1..-1]
|
|
27
|
-
#end
|
|
28
|
-
#
|
|
29
|
-
#def pluck!(method, *args)
|
|
30
|
-
# each_index { |x| self[x] = self[x].send method, *args }
|
|
31
|
-
#end
|
|
32
|
-
#
|
|
33
|
-
#alias invoke! pluck!
|
|
34
|
-
|
|
35
|
-
def without(*values)
|
|
36
|
-
copy = self.dup
|
|
37
|
-
copy.without!(*values)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
19
|
def without!(*values)
|
|
20
|
+
ActiveSupport::Deprecation.warn('Array#without! is deprecated without replacement')
|
|
41
21
|
values.flatten.each { |value| self.delete(value) }
|
|
42
22
|
self
|
|
43
23
|
end
|
|
44
24
|
|
|
45
|
-
def map_val(attr='id')
|
|
46
|
-
map{|el| el[attr] }
|
|
47
|
-
end
|
|
48
|
-
|
|
49
25
|
def contain?(other)
|
|
50
26
|
(other - self).empty?
|
|
51
27
|
end
|
|
@@ -53,24 +29,4 @@ class Array
|
|
|
53
29
|
def intersect?(other)
|
|
54
30
|
!(self & other).empty?
|
|
55
31
|
end
|
|
56
|
-
|
|
57
|
-
# def to_hash
|
|
58
|
-
# ActiveSupport::Deprecation.warn('Array#to_hash is deprecated, use Array#to_h or Hash[] instead')
|
|
59
|
-
# h = {}
|
|
60
|
-
# each { |k, v| h[k] = v }
|
|
61
|
-
# h
|
|
62
|
-
# end
|
|
63
|
-
|
|
64
|
-
def val_detect(attr, val)
|
|
65
|
-
detect{|v| v[attr] == val }
|
|
66
|
-
end
|
|
67
32
|
end
|
|
68
|
-
|
|
69
|
-
#module Enumerable
|
|
70
|
-
# def pluck(method, *args)
|
|
71
|
-
# map { |x| x.send method, *args }
|
|
72
|
-
# end
|
|
73
|
-
#
|
|
74
|
-
# alias invoke pluck
|
|
75
|
-
#end
|
|
76
|
-
|