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,155 @@
|
|
1
|
+
$cpfp-width: 220px;
|
2
|
+
$cpfp-button-size: 28px;
|
3
|
+
$cpfp-border: #bbb;
|
4
|
+
$cpfp-background: #fff;
|
5
|
+
|
6
|
+
// Button
|
7
|
+
.palette-color-picker-button {
|
8
|
+
position: relative;
|
9
|
+
display: inline-block;
|
10
|
+
width: $cpfp-button-size;
|
11
|
+
height: $cpfp-button-size;
|
12
|
+
margin-right: 8px;
|
13
|
+
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="#f5c86c" d="M2 2h8v8H2z"/><path fill="#f56c6c" d="M12 2h8v8h-8z"/><path fill="#f46ac6" d="M22 2h8v8h-8z"/><path fill="#c3f167" d="M2 12h8v8H2z"/><path fill="#f3f3f3" d="M12 12h8v8h-8z"/><path fill="#c76cf5" d="M22 12h8v8h-8z"/><path fill="#69e369" d="M2 22h8v8H2z"/><path fill="#6bc6f4" d="M12 22h8v8h-8z"/><path fill="#6b6bf5" d="M22 22h8v8h-8z"/><path d="M9 3v6H3V3h6m1-1H2v8h8V2zm9 1v6h-6V3h6m1-1h-8v8h8V2zm9 1v6h-6V3h6m1-1h-8v8h8V2zM9 13v6H3v-6h6m1-1H2v8h8v-8zm9 1v6h-6v-6h6m1-1h-8v8h8v-8zm9 1v6h-6v-6h6m1-1h-8v8h8v-8zM9 23v6H3v-6h6m1-1H2v8h8v-8zm9 1v6h-6v-6h6m1-1h-8v8h8v-8zm9 1v6h-6v-6h6m1-1h-8v8h8v-8z" opacity=".25"/></svg>') center center no-repeat;
|
14
|
+
background-size: cover;
|
15
|
+
/*background: url(palette-color-picker-icon.svg) center center no-repeat;*/
|
16
|
+
cursor: pointer;
|
17
|
+
|
18
|
+
box-shadow: 0 0 0 1px $cpfp-border;
|
19
|
+
/*outline: 1px solid $cpfp-border;*/
|
20
|
+
border: 2px solid #fff;
|
21
|
+
}
|
22
|
+
|
23
|
+
// Bubble
|
24
|
+
.palette-color-picker-bubble {
|
25
|
+
display: none;
|
26
|
+
margin: 12px 0;
|
27
|
+
position: absolute;
|
28
|
+
bottom: 100%;
|
29
|
+
width: $cpfp-width;
|
30
|
+
padding: 10px 8px 8px 8px;
|
31
|
+
border: 1px solid $cpfp-border;
|
32
|
+
border-radius: 3px;
|
33
|
+
background-color: #fff;
|
34
|
+
|
35
|
+
// Arrow bottom
|
36
|
+
&:after,
|
37
|
+
&:before {
|
38
|
+
top: 100%;
|
39
|
+
left: 14px;
|
40
|
+
border: solid transparent;
|
41
|
+
content: ' ';
|
42
|
+
height: 0;
|
43
|
+
width: 0;
|
44
|
+
position: absolute;
|
45
|
+
pointer-events: none;
|
46
|
+
}
|
47
|
+
&:after {
|
48
|
+
border-color: transparent;
|
49
|
+
border-top-color: $cpfp-background;
|
50
|
+
border-width: 8px;
|
51
|
+
margin-left: -8px;
|
52
|
+
}
|
53
|
+
&:before {
|
54
|
+
border-color: transparent;
|
55
|
+
border-top-color: $cpfp-border;
|
56
|
+
border-width: 9px;
|
57
|
+
margin-left: -9px;
|
58
|
+
}
|
59
|
+
|
60
|
+
// Open below
|
61
|
+
&.downside {
|
62
|
+
bottom: auto;
|
63
|
+
top: 100%;
|
64
|
+
|
65
|
+
// Arow on top
|
66
|
+
&:after, &:before {
|
67
|
+
top: auto;
|
68
|
+
bottom: 100%;
|
69
|
+
}
|
70
|
+
&:after {
|
71
|
+
border-top-color: transparent;
|
72
|
+
border-bottom-color: $cpfp-background;
|
73
|
+
}
|
74
|
+
&:before {
|
75
|
+
border-top-color: transparent;
|
76
|
+
border-bottom-color: $cpfp-border;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
.swatch {
|
81
|
+
position: relative;
|
82
|
+
display: inline-block;
|
83
|
+
font: 0/0 a;
|
84
|
+
width: 12.66%;
|
85
|
+
padding-top: 11.00%;
|
86
|
+
margin: 1% 2%;
|
87
|
+
outline: 1px solid $cpfp-border;
|
88
|
+
border: 2px solid #fff;
|
89
|
+
border-radius: 3px;
|
90
|
+
cursor: pointer;
|
91
|
+
overflow: hidden;
|
92
|
+
|
93
|
+
|
94
|
+
&.active {
|
95
|
+
outline-color: #000;
|
96
|
+
|
97
|
+
-webkit-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75);
|
98
|
+
-moz-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75);
|
99
|
+
box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75);
|
100
|
+
}
|
101
|
+
|
102
|
+
&.clear {
|
103
|
+
background-color: #fff;
|
104
|
+
&:before {
|
105
|
+
position: absolute;
|
106
|
+
content: '';
|
107
|
+
display: block;
|
108
|
+
top: -1px;
|
109
|
+
left: 0;
|
110
|
+
width: 100px;
|
111
|
+
height: 2px;
|
112
|
+
background-color: #e00;
|
113
|
+
|
114
|
+
transform-origin: 0 0;
|
115
|
+
transform: rotate(45deg);
|
116
|
+
}
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
// x2 width swatches
|
121
|
+
&.double {
|
122
|
+
.swatch {
|
123
|
+
width: 29.30%;
|
124
|
+
padding-top: 11.00%;
|
125
|
+
margin: 1% 2%;
|
126
|
+
&.clear {
|
127
|
+
&:before {
|
128
|
+
transform: rotate(22.5deg);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
// full width swatches
|
135
|
+
&.wide {
|
136
|
+
.swatch {
|
137
|
+
width: 96.2%;
|
138
|
+
padding-top: 11.00%;
|
139
|
+
margin: 1% 2%;
|
140
|
+
&.clear {
|
141
|
+
width: 12.66%;
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
145
|
+
|
146
|
+
// Force open on left side
|
147
|
+
&.force-left {
|
148
|
+
left: -178px;
|
149
|
+
&:after,
|
150
|
+
&:before {
|
151
|
+
left: 188px;
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class ActiveAdmin::Inputs::SelectInput < Formtastic::Inputs::SelectInput
|
2
|
+
def input_html_options
|
3
|
+
super.merge(data: { tags: @options[:tags].present? })
|
4
|
+
end
|
5
|
+
|
6
|
+
def raw_collection
|
7
|
+
field_value = object.send(method)
|
8
|
+
|
9
|
+
@options[:tags].present? && field_value.present? ? (super.to_a << field_value).uniq : super
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class ColorPickerInput < ActiveAdminAddons::InputBase
|
2
|
+
DEFAULT_PALETTE = [
|
3
|
+
"#000000",
|
4
|
+
"#333333",
|
5
|
+
"#663300",
|
6
|
+
"#CC0000",
|
7
|
+
"#CC3300",
|
8
|
+
"#FFCC00",
|
9
|
+
"#009900",
|
10
|
+
"#006666",
|
11
|
+
"#0066FF",
|
12
|
+
"#0000CC",
|
13
|
+
"#663399",
|
14
|
+
"#CC0099",
|
15
|
+
"#FF9999",
|
16
|
+
"#FF9966",
|
17
|
+
"#FFFF99",
|
18
|
+
"#99FF99",
|
19
|
+
"#66FFCC",
|
20
|
+
"#99FFFF",
|
21
|
+
"#66CCFF",
|
22
|
+
"#9999FF",
|
23
|
+
"#FF99FF",
|
24
|
+
"#FFCCCC",
|
25
|
+
"#FFCC99",
|
26
|
+
"#FFFFFF"
|
27
|
+
]
|
28
|
+
|
29
|
+
def render_custom_input
|
30
|
+
concat(label_html)
|
31
|
+
concat(builder.hidden_field(method, input_html_options))
|
32
|
+
end
|
33
|
+
|
34
|
+
def load_control_attributes
|
35
|
+
load_data_attr(:palette, default: DEFAULT_PALETTE, formatter: :to_json)
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2015 Igor Fedoronchuk
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
# of this software and associated documentation files (the "Software"), to deal
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
10
|
+
# furnished to do so, subject to the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be included in
|
13
|
+
# all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
# THE SOFTWARE.
|
22
|
+
|
23
|
+
class DateTimePickerInput < ActiveAdminAddons::InputBase
|
24
|
+
def load_control_attributes
|
25
|
+
load_class(@options[:class])
|
26
|
+
load_data_attr(:picker_options, value: datetime_picker_options)
|
27
|
+
load_attr(:maxlength, value: 19)
|
28
|
+
load_attr(:autocomplete, value: 'off')
|
29
|
+
load_attr(:value, value: formatted_input_value)
|
30
|
+
end
|
31
|
+
|
32
|
+
def formatted_input_value
|
33
|
+
v = input_value
|
34
|
+
|
35
|
+
if v.is_a?(Time)
|
36
|
+
return DateTime.new(v.year, v.month, v.day, v.hour, v.min, v.sec).strftime(
|
37
|
+
ActiveadminAddons.datetime_picker_input_format
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
v.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
def datetime_picker_options
|
45
|
+
@datetime_picker_options ||= begin
|
46
|
+
opts = options.fetch(:picker_options, {})
|
47
|
+
opts = Hash[opts.map { |k, v| [k.to_s.camelcase(:lower), v] }]
|
48
|
+
default_picker_options.merge(opts)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
def default_picker_options
|
55
|
+
res = ActiveadminAddons.datetime_picker_default_options.map do |k, v|
|
56
|
+
if v.respond_to?(:call) || v.is_a?(Proc)
|
57
|
+
[k, v.call]
|
58
|
+
else
|
59
|
+
[k, v]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
Hash[res]
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class NestedLevelInput < ActiveAdminAddons::InputBase
|
2
|
+
include ActiveAdminAddons::SelectHelpers
|
3
|
+
|
4
|
+
def render_custom_input
|
5
|
+
concat(label_html)
|
6
|
+
|
7
|
+
select_control = builder.select(
|
8
|
+
method, initial_collection_to_select_options, {}, input_html_options
|
9
|
+
)
|
10
|
+
|
11
|
+
concat(select_control)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def load_control_attributes
|
17
|
+
load_class(@options[:class])
|
18
|
+
load_data_attr(:fields, default: ["name"], formatter: :to_json)
|
19
|
+
load_data_attr(:predicate, default: "contains")
|
20
|
+
load_data_attr(:filters)
|
21
|
+
load_data_attr(:model, value: model_name)
|
22
|
+
load_data_attr(:display_name, default: "name")
|
23
|
+
load_data_attr(:minimum_input_length, default: 1)
|
24
|
+
load_data_attr(:url, default: url_from_method)
|
25
|
+
load_data_attr(:response_root, default: tableize_method)
|
26
|
+
load_data_attr(:width, default: "80%")
|
27
|
+
load_data_attr(:order,
|
28
|
+
value: @options[:order_by],
|
29
|
+
default: get_data_attr_value(:fields).first.to_s + "_desc")
|
30
|
+
load_parent_data_options
|
31
|
+
load_collection_data
|
32
|
+
end
|
33
|
+
|
34
|
+
def load_parent_data_options
|
35
|
+
return unless @options[:parent_attribute]
|
36
|
+
load_data_attr(:parent, value: @options[:parent_attribute])
|
37
|
+
load_data_attr(:parent_id, value: @object.send(@options[:parent_attribute]), default: -1)
|
38
|
+
end
|
39
|
+
|
40
|
+
def load_collection_data
|
41
|
+
return unless @options[:collection]
|
42
|
+
|
43
|
+
collection_options = collection_to_select_options do |item, option|
|
44
|
+
if !!@options[:parent_attribute]
|
45
|
+
option[@options[:parent_attribute]] = item.send(@options[:parent_attribute])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
load_data_attr(:collection, value: collection_options, formatter: :to_json)
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
class NestedSelectInput < ActiveAdminAddons::InputBase
|
2
|
+
def to_html
|
3
|
+
for_each_level { |attribute, data| concat(builder.input(attribute, level_options(data))) }
|
4
|
+
parts_to_html
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def for_each_level
|
10
|
+
hierarchy.each do |level_data|
|
11
|
+
yield(level_data.delete(:attribute), level_data)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def hierarchy
|
16
|
+
data = get_levels_data
|
17
|
+
raise("Undefined levels on nested_select") if data.empty?
|
18
|
+
set_parent_attributes(data)
|
19
|
+
data.reverse
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_levels_data
|
23
|
+
levels_data = []
|
24
|
+
levels = @options.keys.select { |key| key.to_s.match(/level_[1-9]$/) }.reverse
|
25
|
+
|
26
|
+
levels.each_with_index do |level_key, idx|
|
27
|
+
previous_level_key = levels[idx + 1]
|
28
|
+
validate_level_data!(level_key, previous_level_key)
|
29
|
+
levels_data << @options.delete(level_key)
|
30
|
+
end
|
31
|
+
|
32
|
+
levels_data
|
33
|
+
end
|
34
|
+
|
35
|
+
def validate_level_data!(level_key, previous_level_key)
|
36
|
+
current_level_number = get_level_number(level_key)
|
37
|
+
previous_level_number = get_level_number(previous_level_key)
|
38
|
+
|
39
|
+
if current_level_number != (previous_level_number + 1)
|
40
|
+
raise("Missing :level_#{current_level_number - 1} key")
|
41
|
+
end
|
42
|
+
|
43
|
+
attribute = @options[level_key][:attribute]
|
44
|
+
raise("Missing mandatory attribute level_key on #{level_key}") unless attribute
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_level_number(level_key)
|
48
|
+
level_key.to_s.split("_").last.to_i
|
49
|
+
end
|
50
|
+
|
51
|
+
def level_options(data)
|
52
|
+
@options.merge(data).merge(as: :nested_level)
|
53
|
+
end
|
54
|
+
|
55
|
+
def set_parent_attributes(hierarchy)
|
56
|
+
hierarchy.each_with_index do |level_data, idx|
|
57
|
+
next_idx = idx + 1
|
58
|
+
parent_level_data = hierarchy[next_idx] if hierarchy.count != next_idx
|
59
|
+
if parent_level_data
|
60
|
+
level_data[:parent_attribute] = parent_level_data[:attribute]
|
61
|
+
set_parent_value(level_data)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def set_parent_value(level_data)
|
67
|
+
parent_attribute = level_data[:parent_attribute]
|
68
|
+
build_virtual_attr(parent_attribute)
|
69
|
+
instance = instance_from_attribute_name(level_data[:attribute])
|
70
|
+
if instance && instance.respond_to?(parent_attribute)
|
71
|
+
@object.send("#{parent_attribute}=", instance.send(parent_attribute))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def instance_from_attribute_name(attribute)
|
76
|
+
return unless attribute
|
77
|
+
attribute_value = @object.send(attribute)
|
78
|
+
return unless attribute_value
|
79
|
+
klass = attribute.to_s.chomp("_id").camelize.constantize
|
80
|
+
klass.find_by_id(attribute_value)
|
81
|
+
end
|
82
|
+
|
83
|
+
def build_virtual_attr(attribute_name)
|
84
|
+
if !@object.respond_to?(attribute_name) && !@object.respond_to?("#{attribute_name}=")
|
85
|
+
@object.singleton_class.send(:attr_accessor, attribute_name)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class NumericRangeFilterInput < ActiveAdminAddons::InputBase
|
2
|
+
include ActiveAdminAddons::FilterInput
|
3
|
+
|
4
|
+
def render_custom_input
|
5
|
+
concat(label_html)
|
6
|
+
concat_text_field(gteq_input_name)
|
7
|
+
concat(build_separator)
|
8
|
+
concat_text_field(lteq_input_name)
|
9
|
+
end
|
10
|
+
|
11
|
+
def concat_text_field(control_name)
|
12
|
+
concat(builder.text_field(control_name, input_html_options(control_name)))
|
13
|
+
end
|
14
|
+
|
15
|
+
alias :input_name :gteq_input_name
|
16
|
+
|
17
|
+
def input_html_options(input_name = gteq_input_name)
|
18
|
+
is_gt = (input_name == gteq_input_name)
|
19
|
+
|
20
|
+
{
|
21
|
+
type: "number",
|
22
|
+
step: "any",
|
23
|
+
value: @object.public_send(input_name),
|
24
|
+
placeholder: is_gt ? "min" : "max"
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|