activeadmin_addons_rails6 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +24 -0
  4. data/app/assets/images/fileicons/file_extension_3gp.png +0 -0
  5. data/app/assets/images/fileicons/file_extension_7z.png +0 -0
  6. data/app/assets/images/fileicons/file_extension_ace.png +0 -0
  7. data/app/assets/images/fileicons/file_extension_ai.png +0 -0
  8. data/app/assets/images/fileicons/file_extension_aif.png +0 -0
  9. data/app/assets/images/fileicons/file_extension_aiff.png +0 -0
  10. data/app/assets/images/fileicons/file_extension_amr.png +0 -0
  11. data/app/assets/images/fileicons/file_extension_asf.png +0 -0
  12. data/app/assets/images/fileicons/file_extension_asx.png +0 -0
  13. data/app/assets/images/fileicons/file_extension_bat.png +0 -0
  14. data/app/assets/images/fileicons/file_extension_bin.png +0 -0
  15. data/app/assets/images/fileicons/file_extension_bmp.png +0 -0
  16. data/app/assets/images/fileicons/file_extension_bup.png +0 -0
  17. data/app/assets/images/fileicons/file_extension_cab.png +0 -0
  18. data/app/assets/images/fileicons/file_extension_cbr.png +0 -0
  19. data/app/assets/images/fileicons/file_extension_cda.png +0 -0
  20. data/app/assets/images/fileicons/file_extension_cdl.png +0 -0
  21. data/app/assets/images/fileicons/file_extension_cdr.png +0 -0
  22. data/app/assets/images/fileicons/file_extension_chm.png +0 -0
  23. data/app/assets/images/fileicons/file_extension_dat.png +0 -0
  24. data/app/assets/images/fileicons/file_extension_divx.png +0 -0
  25. data/app/assets/images/fileicons/file_extension_dll.png +0 -0
  26. data/app/assets/images/fileicons/file_extension_dmg.png +0 -0
  27. data/app/assets/images/fileicons/file_extension_doc.png +0 -0
  28. data/app/assets/images/fileicons/file_extension_docx.png +0 -0
  29. data/app/assets/images/fileicons/file_extension_dss.png +0 -0
  30. data/app/assets/images/fileicons/file_extension_dvf.png +0 -0
  31. data/app/assets/images/fileicons/file_extension_dwg.png +0 -0
  32. data/app/assets/images/fileicons/file_extension_eml.png +0 -0
  33. data/app/assets/images/fileicons/file_extension_eps.png +0 -0
  34. data/app/assets/images/fileicons/file_extension_exe.png +0 -0
  35. data/app/assets/images/fileicons/file_extension_fla.png +0 -0
  36. data/app/assets/images/fileicons/file_extension_flv.png +0 -0
  37. data/app/assets/images/fileicons/file_extension_gif.png +0 -0
  38. data/app/assets/images/fileicons/file_extension_gz.png +0 -0
  39. data/app/assets/images/fileicons/file_extension_hqx.png +0 -0
  40. data/app/assets/images/fileicons/file_extension_htm.png +0 -0
  41. data/app/assets/images/fileicons/file_extension_html.png +0 -0
  42. data/app/assets/images/fileicons/file_extension_ifo.png +0 -0
  43. data/app/assets/images/fileicons/file_extension_indd.png +0 -0
  44. data/app/assets/images/fileicons/file_extension_iso.png +0 -0
  45. data/app/assets/images/fileicons/file_extension_jar.png +0 -0
  46. data/app/assets/images/fileicons/file_extension_jpeg.png +0 -0
  47. data/app/assets/images/fileicons/file_extension_jpg.png +0 -0
  48. data/app/assets/images/fileicons/file_extension_lnk.png +0 -0
  49. data/app/assets/images/fileicons/file_extension_log.png +0 -0
  50. data/app/assets/images/fileicons/file_extension_m4a.png +0 -0
  51. data/app/assets/images/fileicons/file_extension_m4b.png +0 -0
  52. data/app/assets/images/fileicons/file_extension_m4p.png +0 -0
  53. data/app/assets/images/fileicons/file_extension_m4v.png +0 -0
  54. data/app/assets/images/fileicons/file_extension_mcd.png +0 -0
  55. data/app/assets/images/fileicons/file_extension_mdb.png +0 -0
  56. data/app/assets/images/fileicons/file_extension_mid.png +0 -0
  57. data/app/assets/images/fileicons/file_extension_mov.png +0 -0
  58. data/app/assets/images/fileicons/file_extension_mp2.png +0 -0
  59. data/app/assets/images/fileicons/file_extension_mp3.png +0 -0
  60. data/app/assets/images/fileicons/file_extension_mp4.png +0 -0
  61. data/app/assets/images/fileicons/file_extension_mpeg.png +0 -0
  62. data/app/assets/images/fileicons/file_extension_mpg.png +0 -0
  63. data/app/assets/images/fileicons/file_extension_msi.png +0 -0
  64. data/app/assets/images/fileicons/file_extension_mswmm.png +0 -0
  65. data/app/assets/images/fileicons/file_extension_ogg.png +0 -0
  66. data/app/assets/images/fileicons/file_extension_pdf.png +0 -0
  67. data/app/assets/images/fileicons/file_extension_png.png +0 -0
  68. data/app/assets/images/fileicons/file_extension_pps.png +0 -0
  69. data/app/assets/images/fileicons/file_extension_ppt.png +0 -0
  70. data/app/assets/images/fileicons/file_extension_pptx.png +0 -0
  71. data/app/assets/images/fileicons/file_extension_ps.png +0 -0
  72. data/app/assets/images/fileicons/file_extension_psd.png +0 -0
  73. data/app/assets/images/fileicons/file_extension_pst.png +0 -0
  74. data/app/assets/images/fileicons/file_extension_ptb.png +0 -0
  75. data/app/assets/images/fileicons/file_extension_pub.png +0 -0
  76. data/app/assets/images/fileicons/file_extension_qbb.png +0 -0
  77. data/app/assets/images/fileicons/file_extension_qbw.png +0 -0
  78. data/app/assets/images/fileicons/file_extension_qxd.png +0 -0
  79. data/app/assets/images/fileicons/file_extension_ram.png +0 -0
  80. data/app/assets/images/fileicons/file_extension_rar.png +0 -0
  81. data/app/assets/images/fileicons/file_extension_rm.png +0 -0
  82. data/app/assets/images/fileicons/file_extension_rmvb.png +0 -0
  83. data/app/assets/images/fileicons/file_extension_rtf.png +0 -0
  84. data/app/assets/images/fileicons/file_extension_sea.png +0 -0
  85. data/app/assets/images/fileicons/file_extension_ses.png +0 -0
  86. data/app/assets/images/fileicons/file_extension_sit.png +0 -0
  87. data/app/assets/images/fileicons/file_extension_sitx.png +0 -0
  88. data/app/assets/images/fileicons/file_extension_ss.png +0 -0
  89. data/app/assets/images/fileicons/file_extension_swf.png +0 -0
  90. data/app/assets/images/fileicons/file_extension_tgz.png +0 -0
  91. data/app/assets/images/fileicons/file_extension_thm.png +0 -0
  92. data/app/assets/images/fileicons/file_extension_tif.png +0 -0
  93. data/app/assets/images/fileicons/file_extension_tmp.png +0 -0
  94. data/app/assets/images/fileicons/file_extension_torrent.png +0 -0
  95. data/app/assets/images/fileicons/file_extension_ttf.png +0 -0
  96. data/app/assets/images/fileicons/file_extension_txt.png +0 -0
  97. data/app/assets/images/fileicons/file_extension_unknown.png +0 -0
  98. data/app/assets/images/fileicons/file_extension_vcd.png +0 -0
  99. data/app/assets/images/fileicons/file_extension_vob.png +0 -0
  100. data/app/assets/images/fileicons/file_extension_wav.png +0 -0
  101. data/app/assets/images/fileicons/file_extension_wma.png +0 -0
  102. data/app/assets/images/fileicons/file_extension_wmv.png +0 -0
  103. data/app/assets/images/fileicons/file_extension_wps.png +0 -0
  104. data/app/assets/images/fileicons/file_extension_xls.png +0 -0
  105. data/app/assets/images/fileicons/file_extension_xlsx.png +0 -0
  106. data/app/assets/images/fileicons/file_extension_xpi.png +0 -0
  107. data/app/assets/images/fileicons/file_extension_zip.png +0 -0
  108. data/app/assets/images/material/icons/keyboard_arrow_down.svg +4 -0
  109. data/app/assets/images/material/icons/keyboard_arrow_left.svg +4 -0
  110. data/app/assets/images/material/icons/keyboard_arrow_right.svg +4 -0
  111. data/app/assets/images/material/icons/keyboard_arrow_up.svg +4 -0
  112. data/app/assets/images/material/icons/today.svg +4 -0
  113. data/app/assets/javascripts/activeadmin_addons/all.js +753 -0
  114. data/app/assets/stylesheets/activeadmin_addons/addons/interactive_select_tag.scss +30 -0
  115. data/app/assets/stylesheets/activeadmin_addons/addons/material-datepicker.scss +173 -0
  116. data/app/assets/stylesheets/activeadmin_addons/addons/material-toggle_bool.scss +52 -0
  117. data/app/assets/stylesheets/activeadmin_addons/addons/toggle_bool.scss +52 -0
  118. data/app/assets/stylesheets/activeadmin_addons/all.scss +19 -0
  119. data/app/assets/stylesheets/activeadmin_addons/imports/jquery-datepicker.scss +1 -0
  120. data/app/assets/stylesheets/activeadmin_addons/imports/webpack/jquery-datepicker.scss +1 -0
  121. data/app/assets/stylesheets/activeadmin_addons/inputs/color-picker.scss +4 -0
  122. data/app/assets/stylesheets/activeadmin_addons/inputs/date-time-picker.scss +5 -0
  123. data/app/assets/stylesheets/activeadmin_addons/inputs/numeric-range-filter.scss +12 -0
  124. data/app/assets/stylesheets/activeadmin_addons/inputs/select2.scss +3 -0
  125. data/app/assets/stylesheets/activeadmin_addons/inputs/selected-list.scss +27 -0
  126. data/app/assets/stylesheets/activeadmin_addons/material.scss +53 -0
  127. data/app/assets/stylesheets/activeadmin_addons/vendor/palette-color-picker.scss +155 -0
  128. data/app/inputs/active_admin/inputs/select_input.rb +11 -0
  129. data/app/inputs/ajax_filter_input.rb +6 -0
  130. data/app/inputs/color_picker_input.rb +37 -0
  131. data/app/inputs/date_range_input.rb +5 -0
  132. data/app/inputs/date_time_picker_input.rb +64 -0
  133. data/app/inputs/nested_level_input.rb +51 -0
  134. data/app/inputs/nested_select_input.rb +88 -0
  135. data/app/inputs/numeric_range_filter_input.rb +27 -0
  136. data/app/inputs/range_select_input.rb +6 -0
  137. data/app/inputs/search_select_filter_input.rb +12 -0
  138. data/app/inputs/search_select_input.rb +29 -0
  139. data/app/inputs/selected_list_input.rb +54 -0
  140. data/app/inputs/tags_input.rb +55 -0
  141. data/app/javascript/activeadmin_addons/addons/interactive_select_tag.js +95 -0
  142. data/app/javascript/activeadmin_addons/addons/toggle_bool.js +39 -0
  143. data/app/javascript/activeadmin_addons/all.js +14 -0
  144. data/app/javascript/activeadmin_addons/config.js +10 -0
  145. data/app/javascript/activeadmin_addons/inputs/color-picker.js +16 -0
  146. data/app/javascript/activeadmin_addons/inputs/date-time-picker.js +28 -0
  147. data/app/javascript/activeadmin_addons/inputs/nested-select.js +170 -0
  148. data/app/javascript/activeadmin_addons/inputs/search-select.js +76 -0
  149. data/app/javascript/activeadmin_addons/inputs/select2.js +52 -0
  150. data/app/javascript/activeadmin_addons/inputs/selected-list.js +107 -0
  151. data/app/javascript/activeadmin_addons/inputs/tags.js +76 -0
  152. data/app/javascript/activeadmin_addons/vendor/jquery_palette_color_picker/palette-color-picker.js +265 -0
  153. data/lib/activeadmin_addons.rb +27 -0
  154. data/lib/activeadmin_addons/active_admin_config.rb +9 -0
  155. data/lib/activeadmin_addons/addons/attachment_builder.rb +60 -0
  156. data/lib/activeadmin_addons/addons/bool_builder.rb +31 -0
  157. data/lib/activeadmin_addons/addons/image_builder.rb +12 -0
  158. data/lib/activeadmin_addons/addons/list_builder.rb +73 -0
  159. data/lib/activeadmin_addons/addons/number_builder.rb +25 -0
  160. data/lib/activeadmin_addons/addons/state_builder.rb +39 -0
  161. data/lib/activeadmin_addons/addons/tag_builder.rb +91 -0
  162. data/lib/activeadmin_addons/addons/toggle_bool_builder.rb +44 -0
  163. data/lib/activeadmin_addons/engine.rb +19 -0
  164. data/lib/activeadmin_addons/support/custom_builder.rb +91 -0
  165. data/lib/activeadmin_addons/support/enumerize_formtastic_support.rb +18 -0
  166. data/lib/activeadmin_addons/support/input_base.rb +53 -0
  167. data/lib/activeadmin_addons/support/input_helpers/filter_input.rb +8 -0
  168. data/lib/activeadmin_addons/support/input_helpers/filter_input_methods.rb +32 -0
  169. data/lib/activeadmin_addons/support/input_helpers/input_html_helpers.rb +43 -0
  170. data/lib/activeadmin_addons/support/input_helpers/input_methods.rb +67 -0
  171. data/lib/activeadmin_addons/support/input_helpers/input_options_handler.rb +90 -0
  172. data/lib/activeadmin_addons/support/input_helpers/select_helpers.rb +89 -0
  173. data/lib/activeadmin_addons/support/set_datepicker.rb +13 -0
  174. data/lib/activeadmin_addons/version.rb +3 -0
  175. data/lib/activeadmin_addons_rails_6.rb +5 -0
  176. data/lib/generators/activeadmin_addons/assets/assets_generator.rb +53 -0
  177. data/lib/generators/activeadmin_addons/install/install_generator.rb +19 -0
  178. data/lib/generators/activeadmin_addons/install/templates/initializer.rb +12 -0
  179. data/lib/generators/activeadmin_addons/webpacker/webpacker_generator.rb +35 -0
  180. data/lib/tasks/activeadmin_addons_tasks.rake +4 -0
  181. data/vendor/assets/select2/select2.css +481 -0
  182. data/vendor/assets/select2/select2.full.js +6820 -0
  183. 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,6 @@
1
+ class AjaxFilterInput < SearchSelectFilterInput
2
+ def to_html
3
+ warn "[DEPRECATION] use :search_select_filter instead of :ajax_filter"
4
+ super
5
+ end
6
+ 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,5 @@
1
+ class DateRangeInput < ActiveAdmin::Inputs::Filters::DateRangeInput
2
+ def input_html_options
3
+ super.except(:maxlength, :size).merge({ autocomplete: 'off' })
4
+ end
5
+ 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