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
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
|
-
|