activeadmin_addons_rails6 1.7.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +24 -0
- data/app/assets/images/fileicons/file_extension_3gp.png +0 -0
- data/app/assets/images/fileicons/file_extension_7z.png +0 -0
- data/app/assets/images/fileicons/file_extension_ace.png +0 -0
- data/app/assets/images/fileicons/file_extension_ai.png +0 -0
- data/app/assets/images/fileicons/file_extension_aif.png +0 -0
- data/app/assets/images/fileicons/file_extension_aiff.png +0 -0
- data/app/assets/images/fileicons/file_extension_amr.png +0 -0
- data/app/assets/images/fileicons/file_extension_asf.png +0 -0
- data/app/assets/images/fileicons/file_extension_asx.png +0 -0
- data/app/assets/images/fileicons/file_extension_bat.png +0 -0
- data/app/assets/images/fileicons/file_extension_bin.png +0 -0
- data/app/assets/images/fileicons/file_extension_bmp.png +0 -0
- data/app/assets/images/fileicons/file_extension_bup.png +0 -0
- data/app/assets/images/fileicons/file_extension_cab.png +0 -0
- data/app/assets/images/fileicons/file_extension_cbr.png +0 -0
- data/app/assets/images/fileicons/file_extension_cda.png +0 -0
- data/app/assets/images/fileicons/file_extension_cdl.png +0 -0
- data/app/assets/images/fileicons/file_extension_cdr.png +0 -0
- data/app/assets/images/fileicons/file_extension_chm.png +0 -0
- data/app/assets/images/fileicons/file_extension_dat.png +0 -0
- data/app/assets/images/fileicons/file_extension_divx.png +0 -0
- data/app/assets/images/fileicons/file_extension_dll.png +0 -0
- data/app/assets/images/fileicons/file_extension_dmg.png +0 -0
- data/app/assets/images/fileicons/file_extension_doc.png +0 -0
- data/app/assets/images/fileicons/file_extension_docx.png +0 -0
- data/app/assets/images/fileicons/file_extension_dss.png +0 -0
- data/app/assets/images/fileicons/file_extension_dvf.png +0 -0
- data/app/assets/images/fileicons/file_extension_dwg.png +0 -0
- data/app/assets/images/fileicons/file_extension_eml.png +0 -0
- data/app/assets/images/fileicons/file_extension_eps.png +0 -0
- data/app/assets/images/fileicons/file_extension_exe.png +0 -0
- data/app/assets/images/fileicons/file_extension_fla.png +0 -0
- data/app/assets/images/fileicons/file_extension_flv.png +0 -0
- data/app/assets/images/fileicons/file_extension_gif.png +0 -0
- data/app/assets/images/fileicons/file_extension_gz.png +0 -0
- data/app/assets/images/fileicons/file_extension_hqx.png +0 -0
- data/app/assets/images/fileicons/file_extension_htm.png +0 -0
- data/app/assets/images/fileicons/file_extension_html.png +0 -0
- data/app/assets/images/fileicons/file_extension_ifo.png +0 -0
- data/app/assets/images/fileicons/file_extension_indd.png +0 -0
- data/app/assets/images/fileicons/file_extension_iso.png +0 -0
- data/app/assets/images/fileicons/file_extension_jar.png +0 -0
- data/app/assets/images/fileicons/file_extension_jpeg.png +0 -0
- data/app/assets/images/fileicons/file_extension_jpg.png +0 -0
- data/app/assets/images/fileicons/file_extension_lnk.png +0 -0
- data/app/assets/images/fileicons/file_extension_log.png +0 -0
- data/app/assets/images/fileicons/file_extension_m4a.png +0 -0
- data/app/assets/images/fileicons/file_extension_m4b.png +0 -0
- data/app/assets/images/fileicons/file_extension_m4p.png +0 -0
- data/app/assets/images/fileicons/file_extension_m4v.png +0 -0
- data/app/assets/images/fileicons/file_extension_mcd.png +0 -0
- data/app/assets/images/fileicons/file_extension_mdb.png +0 -0
- data/app/assets/images/fileicons/file_extension_mid.png +0 -0
- data/app/assets/images/fileicons/file_extension_mov.png +0 -0
- data/app/assets/images/fileicons/file_extension_mp2.png +0 -0
- data/app/assets/images/fileicons/file_extension_mp3.png +0 -0
- data/app/assets/images/fileicons/file_extension_mp4.png +0 -0
- data/app/assets/images/fileicons/file_extension_mpeg.png +0 -0
- data/app/assets/images/fileicons/file_extension_mpg.png +0 -0
- data/app/assets/images/fileicons/file_extension_msi.png +0 -0
- data/app/assets/images/fileicons/file_extension_mswmm.png +0 -0
- data/app/assets/images/fileicons/file_extension_ogg.png +0 -0
- data/app/assets/images/fileicons/file_extension_pdf.png +0 -0
- data/app/assets/images/fileicons/file_extension_png.png +0 -0
- data/app/assets/images/fileicons/file_extension_pps.png +0 -0
- data/app/assets/images/fileicons/file_extension_ppt.png +0 -0
- data/app/assets/images/fileicons/file_extension_pptx.png +0 -0
- data/app/assets/images/fileicons/file_extension_ps.png +0 -0
- data/app/assets/images/fileicons/file_extension_psd.png +0 -0
- data/app/assets/images/fileicons/file_extension_pst.png +0 -0
- data/app/assets/images/fileicons/file_extension_ptb.png +0 -0
- data/app/assets/images/fileicons/file_extension_pub.png +0 -0
- data/app/assets/images/fileicons/file_extension_qbb.png +0 -0
- data/app/assets/images/fileicons/file_extension_qbw.png +0 -0
- data/app/assets/images/fileicons/file_extension_qxd.png +0 -0
- data/app/assets/images/fileicons/file_extension_ram.png +0 -0
- data/app/assets/images/fileicons/file_extension_rar.png +0 -0
- data/app/assets/images/fileicons/file_extension_rm.png +0 -0
- data/app/assets/images/fileicons/file_extension_rmvb.png +0 -0
- data/app/assets/images/fileicons/file_extension_rtf.png +0 -0
- data/app/assets/images/fileicons/file_extension_sea.png +0 -0
- data/app/assets/images/fileicons/file_extension_ses.png +0 -0
- data/app/assets/images/fileicons/file_extension_sit.png +0 -0
- data/app/assets/images/fileicons/file_extension_sitx.png +0 -0
- data/app/assets/images/fileicons/file_extension_ss.png +0 -0
- data/app/assets/images/fileicons/file_extension_swf.png +0 -0
- data/app/assets/images/fileicons/file_extension_tgz.png +0 -0
- data/app/assets/images/fileicons/file_extension_thm.png +0 -0
- data/app/assets/images/fileicons/file_extension_tif.png +0 -0
- data/app/assets/images/fileicons/file_extension_tmp.png +0 -0
- data/app/assets/images/fileicons/file_extension_torrent.png +0 -0
- data/app/assets/images/fileicons/file_extension_ttf.png +0 -0
- data/app/assets/images/fileicons/file_extension_txt.png +0 -0
- data/app/assets/images/fileicons/file_extension_unknown.png +0 -0
- data/app/assets/images/fileicons/file_extension_vcd.png +0 -0
- data/app/assets/images/fileicons/file_extension_vob.png +0 -0
- data/app/assets/images/fileicons/file_extension_wav.png +0 -0
- data/app/assets/images/fileicons/file_extension_wma.png +0 -0
- data/app/assets/images/fileicons/file_extension_wmv.png +0 -0
- data/app/assets/images/fileicons/file_extension_wps.png +0 -0
- data/app/assets/images/fileicons/file_extension_xls.png +0 -0
- data/app/assets/images/fileicons/file_extension_xlsx.png +0 -0
- data/app/assets/images/fileicons/file_extension_xpi.png +0 -0
- data/app/assets/images/fileicons/file_extension_zip.png +0 -0
- data/app/assets/images/material/icons/keyboard_arrow_down.svg +4 -0
- data/app/assets/images/material/icons/keyboard_arrow_left.svg +4 -0
- data/app/assets/images/material/icons/keyboard_arrow_right.svg +4 -0
- data/app/assets/images/material/icons/keyboard_arrow_up.svg +4 -0
- data/app/assets/images/material/icons/today.svg +4 -0
- data/app/assets/javascripts/activeadmin_addons/all.js +753 -0
- data/app/assets/stylesheets/activeadmin_addons/addons/interactive_select_tag.scss +30 -0
- data/app/assets/stylesheets/activeadmin_addons/addons/material-datepicker.scss +173 -0
- data/app/assets/stylesheets/activeadmin_addons/addons/material-toggle_bool.scss +52 -0
- data/app/assets/stylesheets/activeadmin_addons/addons/toggle_bool.scss +52 -0
- data/app/assets/stylesheets/activeadmin_addons/all.scss +19 -0
- data/app/assets/stylesheets/activeadmin_addons/imports/jquery-datepicker.scss +1 -0
- data/app/assets/stylesheets/activeadmin_addons/imports/webpack/jquery-datepicker.scss +1 -0
- data/app/assets/stylesheets/activeadmin_addons/inputs/color-picker.scss +4 -0
- data/app/assets/stylesheets/activeadmin_addons/inputs/date-time-picker.scss +5 -0
- data/app/assets/stylesheets/activeadmin_addons/inputs/numeric-range-filter.scss +12 -0
- data/app/assets/stylesheets/activeadmin_addons/inputs/select2.scss +3 -0
- data/app/assets/stylesheets/activeadmin_addons/inputs/selected-list.scss +27 -0
- data/app/assets/stylesheets/activeadmin_addons/material.scss +53 -0
- data/app/assets/stylesheets/activeadmin_addons/vendor/palette-color-picker.scss +155 -0
- data/app/inputs/active_admin/inputs/select_input.rb +11 -0
- data/app/inputs/ajax_filter_input.rb +6 -0
- data/app/inputs/color_picker_input.rb +37 -0
- data/app/inputs/date_range_input.rb +5 -0
- data/app/inputs/date_time_picker_input.rb +64 -0
- data/app/inputs/nested_level_input.rb +51 -0
- data/app/inputs/nested_select_input.rb +88 -0
- data/app/inputs/numeric_range_filter_input.rb +27 -0
- data/app/inputs/range_select_input.rb +6 -0
- data/app/inputs/search_select_filter_input.rb +12 -0
- data/app/inputs/search_select_input.rb +29 -0
- data/app/inputs/selected_list_input.rb +54 -0
- data/app/inputs/tags_input.rb +55 -0
- data/app/javascript/activeadmin_addons/addons/interactive_select_tag.js +95 -0
- data/app/javascript/activeadmin_addons/addons/toggle_bool.js +39 -0
- data/app/javascript/activeadmin_addons/all.js +14 -0
- data/app/javascript/activeadmin_addons/config.js +10 -0
- data/app/javascript/activeadmin_addons/inputs/color-picker.js +16 -0
- data/app/javascript/activeadmin_addons/inputs/date-time-picker.js +28 -0
- data/app/javascript/activeadmin_addons/inputs/nested-select.js +170 -0
- data/app/javascript/activeadmin_addons/inputs/search-select.js +76 -0
- data/app/javascript/activeadmin_addons/inputs/select2.js +52 -0
- data/app/javascript/activeadmin_addons/inputs/selected-list.js +107 -0
- data/app/javascript/activeadmin_addons/inputs/tags.js +76 -0
- data/app/javascript/activeadmin_addons/vendor/jquery_palette_color_picker/palette-color-picker.js +265 -0
- data/lib/activeadmin_addons.rb +27 -0
- data/lib/activeadmin_addons/active_admin_config.rb +9 -0
- data/lib/activeadmin_addons/addons/attachment_builder.rb +60 -0
- data/lib/activeadmin_addons/addons/bool_builder.rb +31 -0
- data/lib/activeadmin_addons/addons/image_builder.rb +12 -0
- data/lib/activeadmin_addons/addons/list_builder.rb +73 -0
- data/lib/activeadmin_addons/addons/number_builder.rb +25 -0
- data/lib/activeadmin_addons/addons/state_builder.rb +39 -0
- data/lib/activeadmin_addons/addons/tag_builder.rb +91 -0
- data/lib/activeadmin_addons/addons/toggle_bool_builder.rb +44 -0
- data/lib/activeadmin_addons/engine.rb +19 -0
- data/lib/activeadmin_addons/support/custom_builder.rb +91 -0
- data/lib/activeadmin_addons/support/enumerize_formtastic_support.rb +18 -0
- data/lib/activeadmin_addons/support/input_base.rb +53 -0
- data/lib/activeadmin_addons/support/input_helpers/filter_input.rb +8 -0
- data/lib/activeadmin_addons/support/input_helpers/filter_input_methods.rb +32 -0
- data/lib/activeadmin_addons/support/input_helpers/input_html_helpers.rb +43 -0
- data/lib/activeadmin_addons/support/input_helpers/input_methods.rb +67 -0
- data/lib/activeadmin_addons/support/input_helpers/input_options_handler.rb +90 -0
- data/lib/activeadmin_addons/support/input_helpers/select_helpers.rb +89 -0
- data/lib/activeadmin_addons/support/set_datepicker.rb +13 -0
- data/lib/activeadmin_addons/version.rb +3 -0
- data/lib/activeadmin_addons_rails_6.rb +5 -0
- data/lib/generators/activeadmin_addons/assets/assets_generator.rb +53 -0
- data/lib/generators/activeadmin_addons/install/install_generator.rb +19 -0
- data/lib/generators/activeadmin_addons/install/templates/initializer.rb +12 -0
- data/lib/generators/activeadmin_addons/webpacker/webpacker_generator.rb +35 -0
- data/lib/tasks/activeadmin_addons_tasks.rake +4 -0
- data/vendor/assets/select2/select2.css +481 -0
- data/vendor/assets/select2/select2.full.js +6820 -0
- metadata +544 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module ActiveAdminAddons
|
|
2
|
+
class CustomBuilder
|
|
3
|
+
attr_accessor :context, :model, :args, :block
|
|
4
|
+
|
|
5
|
+
def initialize(context, model, *args, &block)
|
|
6
|
+
@context = context
|
|
7
|
+
@model = model
|
|
8
|
+
@args = *args
|
|
9
|
+
@block = block
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def render
|
|
13
|
+
raise NotImplementedError
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.create_view_methods
|
|
17
|
+
builder_class = self
|
|
18
|
+
builder_name = builder_method_name
|
|
19
|
+
|
|
20
|
+
::ActiveAdmin::Views::TableFor.class_eval do
|
|
21
|
+
define_method("#{builder_name}_column") do |*args, &block|
|
|
22
|
+
column(*args) { |model| builder_class.new(self, model, *args, &block).render }
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
::ActiveAdmin::Views::AttributesTable.class_eval do
|
|
27
|
+
define_method("#{builder_name}_row") do |*args, &block|
|
|
28
|
+
row(*args) { |model| builder_class.new(self, model, *args, &block).render }
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.builder_method_name
|
|
34
|
+
name.underscore.to_s.split("/").last.chomp("_builder")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
def resource_url
|
|
40
|
+
admin_resource&.route_instance_path(model, {})
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def enabled_controller_action?(action)
|
|
44
|
+
admin_controller_actions.include?(action)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def admin_controller_actions
|
|
48
|
+
(admin_controller&.action_methods&.to_a || []).map(&:to_sym)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def admin_controller
|
|
52
|
+
context&.controller
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def admin_resource
|
|
56
|
+
context.active_admin_resource_for(model.class)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def data
|
|
60
|
+
@data ||= block ? block.call(model) : model.send(attribute)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def options
|
|
64
|
+
@options ||= has_opts? ? args.last : {}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def class_name
|
|
68
|
+
model.model_name.param_key
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# attachment_column :foto
|
|
72
|
+
# attachment_column :foto, style: :hola
|
|
73
|
+
# attachment_column "Mi Foto", :foto
|
|
74
|
+
# attachment_column "Mi Foto", :foto, {}
|
|
75
|
+
# attachment_column :foto do
|
|
76
|
+
# end
|
|
77
|
+
def attribute
|
|
78
|
+
@attribute ||= has_label? ? args[1] : args[0]
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def has_label?
|
|
82
|
+
has_opts? ? args.length == 3 : args.length == 2
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def has_opts?
|
|
86
|
+
@has_opts ||= args.last.is_a?(Hash)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
create_view_methods
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module ActiveAdminAddons
|
|
2
|
+
module RansackFormBuilderExtension
|
|
3
|
+
def input(method, options = {})
|
|
4
|
+
if object.is_a?(::Ransack::Search)
|
|
5
|
+
klass = object.klass
|
|
6
|
+
|
|
7
|
+
if klass.respond_to?(:enumerized_attributes) && (attr = klass.enumerized_attributes[method])
|
|
8
|
+
options[:collection] ||= attr.options
|
|
9
|
+
options[:as] = :select
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
super(method, options)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
::Formtastic::FormBuilder.send :prepend, ActiveAdminAddons::RansackFormBuilderExtension
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
require_relative "input_helpers/input_options_handler"
|
|
2
|
+
require_relative "input_helpers/input_methods"
|
|
3
|
+
require_relative "input_helpers/input_html_helpers"
|
|
4
|
+
|
|
5
|
+
module ActiveAdminAddons
|
|
6
|
+
class InputBase < Formtastic::Inputs::StringInput
|
|
7
|
+
include InputOptionsHandler
|
|
8
|
+
include InputMethods
|
|
9
|
+
include InputHtmlHelpers
|
|
10
|
+
|
|
11
|
+
def to_html
|
|
12
|
+
load_input_class
|
|
13
|
+
load_control_attributes
|
|
14
|
+
render_custom_input
|
|
15
|
+
if parts.any?
|
|
16
|
+
return input_wrapping { parts_to_html }
|
|
17
|
+
else
|
|
18
|
+
super
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def input_html_options
|
|
23
|
+
# maxwidth and size are added by Formtastic::Inputs::StringInput
|
|
24
|
+
# but according to the HTML standard these are not valid attributes
|
|
25
|
+
# on the inputs provided by this module
|
|
26
|
+
super.except(:maxlength, :size).merge(control_attributes)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parts_to_html
|
|
30
|
+
parts.flatten.join("\n").html_safe
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def load_input_class
|
|
34
|
+
load_class(self.class.to_s.underscore.dasherize)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def load_control_attributes
|
|
38
|
+
# Override on child classes if needed
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def render_custom_input
|
|
42
|
+
# Override on child classes if needed
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def parts
|
|
46
|
+
@parts ||= []
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def concat(part)
|
|
50
|
+
parts << part
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require_relative "input_methods"
|
|
2
|
+
|
|
3
|
+
module ActiveAdminAddons
|
|
4
|
+
module FilterInputMethods
|
|
5
|
+
include InputMethods
|
|
6
|
+
|
|
7
|
+
def object_class
|
|
8
|
+
valid_object.klass
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def input_value
|
|
12
|
+
result = valid_object.conditions.find do |condition|
|
|
13
|
+
condition.attributes.map(&:name).include?(valid_method.to_s)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
return unless result
|
|
17
|
+
result.values.first.value
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def eq_input_name
|
|
21
|
+
"#{valid_method}_eq"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def gteq_input_name
|
|
25
|
+
"#{method}_gteq"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def lteq_input_name
|
|
29
|
+
"#{method}_lteq"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
module ActiveAdminAddons
|
|
2
|
+
module InputHtmlHelpers
|
|
3
|
+
include InputMethods
|
|
4
|
+
|
|
5
|
+
def prefixed_method
|
|
6
|
+
"#{model_name}_#{valid_method}"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def method_to_input_name
|
|
10
|
+
"#{model_name}[#{valid_method}]"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def method_to_input_array_name
|
|
14
|
+
"#{method_to_input_name}[]"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def method_to_input_id(id)
|
|
18
|
+
raise "invalid input id" if id.blank?
|
|
19
|
+
"#{prefixed_method}_#{id}"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def selected_values_id
|
|
23
|
+
"#{prefixed_method}_selected_values"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def empty_input_id
|
|
27
|
+
"#{prefixed_method}_empty"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def build_separator
|
|
31
|
+
template.content_tag(:span, "-", class: "separator")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def build_hidden_control(id, name, value = nil)
|
|
35
|
+
builder.hidden_field(
|
|
36
|
+
valid_method,
|
|
37
|
+
id: id,
|
|
38
|
+
name: name,
|
|
39
|
+
value: value
|
|
40
|
+
)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module ActiveAdminAddons
|
|
2
|
+
module InputMethods
|
|
3
|
+
def model_name
|
|
4
|
+
valid_object.class.to_s.underscore.tr('/', '_')
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def valid_method
|
|
8
|
+
raise "invalid method given" if method.blank?
|
|
9
|
+
method
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def valid_object
|
|
13
|
+
raise "blank object given" if @object.blank?
|
|
14
|
+
@object
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def object_class
|
|
18
|
+
valid_object.class
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def association_name
|
|
22
|
+
valid_method.to_s.singularize.chomp("_id")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def method_model
|
|
26
|
+
@options[:method_model] ||
|
|
27
|
+
object_class.reflect_on_association(association_name).try(:klass) ||
|
|
28
|
+
association_name.classify.constantize
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def tableize_method
|
|
32
|
+
association_name.tableize
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def input_related_items
|
|
36
|
+
valid_object.send(tableize_method)
|
|
37
|
+
rescue NoMethodError
|
|
38
|
+
raise "no association called #{tableize_method} on #{model_name} model"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def input_value
|
|
42
|
+
@input_value ||= valid_object.send(valid_method)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def translated_method
|
|
46
|
+
valid_object.class.human_attribute_name(valid_method)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def url_from_method
|
|
50
|
+
url = ["/"]
|
|
51
|
+
|
|
52
|
+
if ActiveAdmin.application.default_namespace.present?
|
|
53
|
+
url << "#{ActiveAdmin.application.default_namespace}/"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
url << tableize_method
|
|
57
|
+
url.join("")
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def build_virtual_attr
|
|
61
|
+
attribute_name = "virtual_#{valid_method}_attr"
|
|
62
|
+
fail "#{attribute_name} is already defined" if valid_object.respond_to?(attribute_name)
|
|
63
|
+
valid_object.singleton_class.send(:attr_accessor, attribute_name)
|
|
64
|
+
attribute_name
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module ActiveAdminAddons
|
|
2
|
+
module InputOptionsHandler
|
|
3
|
+
def control_attributes
|
|
4
|
+
result = {}
|
|
5
|
+
result[:class] = css_classes.compact.join(" ") if css_classes.any?
|
|
6
|
+
|
|
7
|
+
data_attr_options.each do |attribute, item|
|
|
8
|
+
result[:data] ||= {}
|
|
9
|
+
result[:data][attribute] = formatted_option_value(item)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
attr_options.each do |attribute, item|
|
|
13
|
+
result[attribute] = formatted_option_value(item)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
result
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def data_attr_options
|
|
20
|
+
@data_attr_options || {}
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def attr_options
|
|
24
|
+
@attr_options || {}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def css_classes
|
|
28
|
+
@css_classes || []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def load_data_attr(attr_name, options = {})
|
|
32
|
+
@data_attr_options ||= {}
|
|
33
|
+
@data_attr_options[attr_name.to_sym] = load_option_attr(attr_name, options)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def load_attr(attr_name, options = {})
|
|
37
|
+
@attr_options ||= {}
|
|
38
|
+
@attr_options[attr_name.to_sym] = load_option_attr(attr_name, options)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def load_class(class_attr)
|
|
42
|
+
@css_classes ||= []
|
|
43
|
+
return if class_attr.blank?
|
|
44
|
+
class_attr = class_attr.strip
|
|
45
|
+
@css_classes << class_attr
|
|
46
|
+
class_attr
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def get_data_attr_value(attr_name)
|
|
50
|
+
item = data_attr_options[attr_name.to_sym]
|
|
51
|
+
return unless item
|
|
52
|
+
item[:value]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def formatted_option_value(item)
|
|
58
|
+
return item[:value].send(item[:formatter]) if item[:formatter]
|
|
59
|
+
item[:value]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def load_option_attr(attr_name, options)
|
|
63
|
+
value = calculate_attr_value(attr_name, options)
|
|
64
|
+
item = { value: value }
|
|
65
|
+
item[:formatter] = options[:formatter] unless options[:formatter].blank?
|
|
66
|
+
item
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def calculate_attr_value(attr_name, attr_options)
|
|
70
|
+
value = attr_options[:value] || @options[attr_name]
|
|
71
|
+
|
|
72
|
+
if !empty_value?(value)
|
|
73
|
+
if value.is_a?(Proc)
|
|
74
|
+
return template.instance_eval(&value)
|
|
75
|
+
else
|
|
76
|
+
return value
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
default_value = attr_options[:default]
|
|
81
|
+
return unless default_value
|
|
82
|
+
return default_value.call if default_value.is_a?(Proc)
|
|
83
|
+
default_value
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def empty_value?(value)
|
|
87
|
+
value.nil? || value == ""
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module ActiveAdminAddons
|
|
2
|
+
module SelectHelpers
|
|
3
|
+
include InputMethods
|
|
4
|
+
include InputOptionsHandler
|
|
5
|
+
|
|
6
|
+
def array_to_select_options
|
|
7
|
+
selected_values = input_value.is_a?(Array) ? input_value : input_value.to_s.split(",")
|
|
8
|
+
array = collection.map(&:to_s) + selected_values
|
|
9
|
+
array.sort.map do |value|
|
|
10
|
+
option = { id: value, text: value }
|
|
11
|
+
option[:selected] = "selected" if selected_values.include?(value)
|
|
12
|
+
option
|
|
13
|
+
end.uniq
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def initial_collection_to_select_options
|
|
17
|
+
initial_options = [[nil]] # add blank option
|
|
18
|
+
selected = selected_item
|
|
19
|
+
|
|
20
|
+
if selected
|
|
21
|
+
selected_option = item_to_select_option(selected)
|
|
22
|
+
initial_options << [selected_option[:text], selected_option[:id]]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
initial_options
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def collection_to_select_options
|
|
29
|
+
complete_collection = collection + selected_collection
|
|
30
|
+
complete_collection.map do |item|
|
|
31
|
+
option = item_to_select_option(item)
|
|
32
|
+
yield(item, option) if block_given?
|
|
33
|
+
|
|
34
|
+
if selected_collection.include?(item)
|
|
35
|
+
load_data_attr(:selected, value: option.dup, formatter: :to_json)
|
|
36
|
+
option[:selected] = "selected"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
option
|
|
40
|
+
end.uniq
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def item_to_select_option(item)
|
|
44
|
+
return unless item
|
|
45
|
+
{
|
|
46
|
+
id: item.send((valid_options[:value] || :id)),
|
|
47
|
+
text: item.send((valid_options[:display_name] || :name))
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def active_record_select?
|
|
52
|
+
active_record_relation?(collection) &&
|
|
53
|
+
active_record_relation?(selected_collection)
|
|
54
|
+
rescue NameError
|
|
55
|
+
false
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def selected_collection
|
|
59
|
+
@selected_collection ||= begin
|
|
60
|
+
if active_record_relation?(collection)
|
|
61
|
+
collection.model.where(id: input_value)
|
|
62
|
+
else
|
|
63
|
+
method_model.where(id: input_value)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def selected_item
|
|
69
|
+
@selected_item ||= selected_collection.first
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def active_record_relation?(value)
|
|
75
|
+
klass = value.class.name
|
|
76
|
+
klass == "ActiveRecord::Relation" ||
|
|
77
|
+
klass == "ActiveRecord::Associations::CollectionProxy"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def valid_options
|
|
81
|
+
raise "missing @options hash" unless !!@options
|
|
82
|
+
@options
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def collection
|
|
86
|
+
valid_options[:collection] || []
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|