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