activeadmin_addons_rails6 1.7.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|