ext_form 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (333) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/Rakefile +31 -0
  4. data/app/assets/javascripts/ext_form/application.js +78 -0
  5. data/app/assets/javascripts/typeahead.js +1159 -0
  6. data/app/assets/stylesheets/ext_form/application.scss +15 -0
  7. data/app/assets/stylesheets/ext_form/application_bootstrap.css.scss +197 -0
  8. data/app/assets/stylesheets/ext_form/base.css.scss +32 -0
  9. data/config/routes.rb +2 -0
  10. data/lib/ext_form/builders/form_builder_base.rb +224 -0
  11. data/lib/ext_form/builders.rb +10 -0
  12. data/lib/ext_form/components/input_addons.rb +34 -0
  13. data/lib/ext_form/components.rb +7 -0
  14. data/lib/ext_form/engine.rb +14 -0
  15. data/lib/ext_form/helpers/form_helper.rb +222 -0
  16. data/lib/ext_form/helpers/form_tag_helper.rb +60 -0
  17. data/lib/ext_form/helpers/tags/auto_complete.rb +25 -0
  18. data/lib/ext_form/helpers/tags/collection_select.rb +19 -0
  19. data/lib/ext_form/helpers/tags/dt_picker.rb +27 -0
  20. data/lib/ext_form/helpers/tags/grouped_collection_select.rb +19 -0
  21. data/lib/ext_form/helpers/tags.rb +12 -0
  22. data/lib/ext_form/inputs/auto_complete.rb +11 -0
  23. data/lib/ext_form/inputs/base_mixin.rb +11 -0
  24. data/lib/ext_form/inputs/bootstrap_inputs_mixin.rb +13 -0
  25. data/lib/ext_form/inputs/collection_select.rb +15 -0
  26. data/lib/ext_form/inputs/dt_picker.rb +20 -0
  27. data/lib/ext_form/inputs/grouped_collection_select.rb +13 -0
  28. data/lib/ext_form/inputs.rb +15 -0
  29. data/lib/ext_form/layouts/base_layout.rb +82 -0
  30. data/lib/ext_form/layouts/bootstrap_layout.rb +23 -0
  31. data/lib/ext_form/layouts/default_layout.rb +29 -0
  32. data/lib/ext_form/layouts.rb +11 -0
  33. data/lib/ext_form/version.rb +3 -0
  34. data/lib/ext_form/wrappers/many_mixin.rb +18 -0
  35. data/lib/ext_form/wrappers/mixin.rb +49 -0
  36. data/lib/ext_form/wrappers/single_mixin.rb +18 -0
  37. data/lib/ext_form/wrappers.rb +11 -0
  38. data/lib/ext_form.rb +52 -0
  39. data/lib/generators/ext_form/USAGE +3 -0
  40. data/lib/generators/ext_form/install_generator.rb +113 -0
  41. data/lib/generators/ext_form/templates/README +15 -0
  42. data/lib/generators/ext_form/templates/_form.html.erb +12 -0
  43. data/lib/generators/ext_form/templates/_form.html.haml +12 -0
  44. data/lib/generators/ext_form/templates/_form.html.slim +12 -0
  45. data/lib/generators/ext_form/templates/config/initializers/z_ext_form.rb +70 -0
  46. data/lib/generators/ext_form/templates/config/initializers/z_ext_form_bootstrap.rb +59 -0
  47. data/lib/generators/ext_form/templates/config/locales/ext_form.en.yml +2 -0
  48. data/lib/tasks/ext_form_tasks.rake +4 -0
  49. data/spec/builders/ext_form_builder_bs_spec.rb +78 -0
  50. data/spec/builders/ext_form_builder_spec.rb +100 -0
  51. data/spec/dummy/README.rdoc +28 -0
  52. data/spec/dummy/Rakefile +6 -0
  53. data/spec/dummy/app/assets/javascripts/application.js +27 -0
  54. data/spec/dummy/app/assets/javascripts/order_headers.js +2 -0
  55. data/spec/dummy/app/assets/javascripts/order_lines.js +2 -0
  56. data/spec/dummy/app/assets/javascripts/shipments.js +2 -0
  57. data/spec/dummy/app/assets/stylesheets/application.css.scss +17 -0
  58. data/spec/dummy/app/assets/stylesheets/order_headers.css +4 -0
  59. data/spec/dummy/app/assets/stylesheets/order_lines.css +4 -0
  60. data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
  61. data/spec/dummy/app/assets/stylesheets/shipments.css +4 -0
  62. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  63. data/spec/dummy/app/controllers/order_headers_controller.rb +62 -0
  64. data/spec/dummy/app/controllers/order_lines_controller.rb +58 -0
  65. data/spec/dummy/app/controllers/shipments_controller.rb +58 -0
  66. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  67. data/spec/dummy/app/helpers/order_headers_helper.rb +2 -0
  68. data/spec/dummy/app/helpers/order_lines_helper.rb +2 -0
  69. data/spec/dummy/app/helpers/shipments_helper.rb +2 -0
  70. data/spec/dummy/app/models/order_header.rb +9 -0
  71. data/spec/dummy/app/models/order_line.rb +6 -0
  72. data/spec/dummy/app/models/order_type.rb +2 -0
  73. data/spec/dummy/app/models/shipment.rb +3 -0
  74. data/spec/dummy/app/views/layouts/application.html.erb +17 -0
  75. data/spec/dummy/app/views/order_headers/_form.html.erb +53 -0
  76. data/spec/dummy/app/views/order_headers/edit.html.erb +3 -0
  77. data/spec/dummy/app/views/order_headers/index.html.erb +29 -0
  78. data/spec/dummy/app/views/order_headers/new.html.erb +5 -0
  79. data/spec/dummy/app/views/order_headers/show.html.erb +14 -0
  80. data/spec/dummy/app/views/order_lines/_form.html.erb +33 -0
  81. data/spec/dummy/app/views/order_lines/edit.html.erb +6 -0
  82. data/spec/dummy/app/views/order_lines/index.html.erb +33 -0
  83. data/spec/dummy/app/views/order_lines/new.html.erb +5 -0
  84. data/spec/dummy/app/views/order_lines/show.html.erb +24 -0
  85. data/spec/dummy/app/views/shipments/_form.html.erb +37 -0
  86. data/spec/dummy/app/views/shipments/edit.html.erb +6 -0
  87. data/spec/dummy/app/views/shipments/index.html.erb +35 -0
  88. data/spec/dummy/app/views/shipments/new.html.erb +5 -0
  89. data/spec/dummy/app/views/shipments/show.html.erb +29 -0
  90. data/spec/dummy/bin/bundle +3 -0
  91. data/spec/dummy/bin/rails +4 -0
  92. data/spec/dummy/bin/rake +4 -0
  93. data/spec/dummy/config/application.rb +28 -0
  94. data/spec/dummy/config/boot.rb +5 -0
  95. data/spec/dummy/config/database.yml +25 -0
  96. data/spec/dummy/config/environment.rb +5 -0
  97. data/spec/dummy/config/environments/development.rb +29 -0
  98. data/spec/dummy/config/environments/production.rb +80 -0
  99. data/spec/dummy/config/environments/test.rb +36 -0
  100. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  101. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  102. data/spec/dummy/config/initializers/inflections.rb +16 -0
  103. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  104. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  105. data/spec/dummy/config/initializers/session_store.rb +3 -0
  106. data/spec/dummy/config/initializers/simple_form.rb +145 -0
  107. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  108. data/spec/dummy/config/initializers/z_ext_form.rb +70 -0
  109. data/spec/dummy/config/initializers/z_ext_form_bootstrap.rb +59 -0
  110. data/spec/dummy/config/locales/en.yml +23 -0
  111. data/spec/dummy/config/locales/ext_form.en.yml +26 -0
  112. data/spec/dummy/config/locales/simple_form.en.yml +26 -0
  113. data/spec/dummy/config/routes.rb +10 -0
  114. data/spec/dummy/config.ru +4 -0
  115. data/spec/dummy/db/development.sqlite3 +0 -0
  116. data/spec/dummy/db/migrate/20130822091938_create_order_headers.rb +10 -0
  117. data/spec/dummy/db/migrate/20130822092035_create_order_lines.rb +12 -0
  118. data/spec/dummy/db/migrate/20130822092136_create_shipments.rb +13 -0
  119. data/spec/dummy/db/migrate/20130913025429_add_order_date_to_order_headers.rb +5 -0
  120. data/spec/dummy/db/migrate/20130913082503_add_bill_to_customer_to_order_headers.rb +7 -0
  121. data/spec/dummy/db/migrate/20130914101200_create_order_types.rb +9 -0
  122. data/spec/dummy/db/migrate/20130914101232_add_order_type_id_to_order_headers.rb +5 -0
  123. data/spec/dummy/db/schema.rb +64 -0
  124. data/spec/dummy/db/seeds.rb +3 -0
  125. data/spec/dummy/db/test.sqlite3 +0 -0
  126. data/spec/dummy/lib/templates/erb/scaffold/_form.html.erb +12 -0
  127. data/spec/dummy/lib/templates/slim/scaffold/_form.html.slim +12 -0
  128. data/spec/dummy/log/development.log +30851 -0
  129. data/spec/dummy/log/test.log +8888 -0
  130. data/spec/dummy/public/404.html +58 -0
  131. data/spec/dummy/public/422.html +58 -0
  132. data/spec/dummy/public/500.html +57 -0
  133. data/spec/dummy/public/favicon.ico +0 -0
  134. data/spec/dummy/public/javascripts/nested_form.js +120 -0
  135. data/spec/dummy/spec/factories/order_types.rb +7 -0
  136. data/spec/dummy/tmp/cache/assets/development/sass/0be6a8d566db001f251fcb3d330b625bdcde50b0/select2.css.scssc +0 -0
  137. data/spec/dummy/tmp/cache/assets/development/sass/0f754ef2ba2bade74c446fd0dc8d2c538b2ee4ba/bootstrap-datetimepicker.cssc +0 -0
  138. data/spec/dummy/tmp/cache/assets/development/sass/43e39f3776203b555edf4427cbeca13a3e80bf4e/application.scssc +0 -0
  139. data/spec/dummy/tmp/cache/assets/development/sass/43e39f3776203b555edf4427cbeca13a3e80bf4e/application_bootstrap.css.scssc +0 -0
  140. data/spec/dummy/tmp/cache/assets/development/sass/43e39f3776203b555edf4427cbeca13a3e80bf4e/base.css.scssc +0 -0
  141. data/spec/dummy/tmp/cache/assets/development/sass/95877ca3fb97306427e6a8c3200a77fa726c2979/bootstrap-responsive.scssc +0 -0
  142. data/spec/dummy/tmp/cache/assets/development/sass/95877ca3fb97306427e6a8c3200a77fa726c2979/bootstrap.scssc +0 -0
  143. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_accordion.scssc +0 -0
  144. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_alerts.scssc +0 -0
  145. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_breadcrumbs.scssc +0 -0
  146. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_button-groups.scssc +0 -0
  147. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_buttons.scssc +0 -0
  148. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_carousel.scssc +0 -0
  149. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_close.scssc +0 -0
  150. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_code.scssc +0 -0
  151. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_component-animations.scssc +0 -0
  152. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_dropdowns.scssc +0 -0
  153. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_forms.scssc +0 -0
  154. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_grid.scssc +0 -0
  155. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_hero-unit.scssc +0 -0
  156. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_labels-badges.scssc +0 -0
  157. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_layouts.scssc +0 -0
  158. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_media.scssc +0 -0
  159. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_mixins.scssc +0 -0
  160. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_modals.scssc +0 -0
  161. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_navbar.scssc +0 -0
  162. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_navs.scssc +0 -0
  163. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_pager.scssc +0 -0
  164. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_pagination.scssc +0 -0
  165. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_popovers.scssc +0 -0
  166. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_progress-bars.scssc +0 -0
  167. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_reset.scssc +0 -0
  168. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-1200px-min.scssc +0 -0
  169. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-767px-max.scssc +0 -0
  170. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-768px-979px.scssc +0 -0
  171. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-navbar.scssc +0 -0
  172. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-utilities.scssc +0 -0
  173. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_scaffolding.scssc +0 -0
  174. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_sprites.scssc +0 -0
  175. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_tables.scssc +0 -0
  176. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_thumbnails.scssc +0 -0
  177. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_tooltip.scssc +0 -0
  178. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_type.scssc +0 -0
  179. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_utilities.scssc +0 -0
  180. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_variables.scssc +0 -0
  181. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_wells.scssc +0 -0
  182. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/bootstrap.scssc +0 -0
  183. data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/responsive.scssc +0 -0
  184. data/spec/dummy/tmp/cache/assets/development/sass/d8cdc3e1698ff449e2e9ab35ca24a00a8d724935/application.css.scssc +0 -0
  185. data/spec/dummy/tmp/cache/assets/development/sass/d8cdc3e1698ff449e2e9ab35ca24a00a8d724935/scaffolds.css.scssc +0 -0
  186. data/spec/dummy/tmp/cache/assets/development/sass/d8cdc3e1698ff449e2e9ab35ca24a00a8d724935/test_scaflds.css.scssc +0 -0
  187. data/spec/dummy/tmp/cache/assets/development/sprockets/00171108bd75279e653c1ffb5b4650b8 +0 -0
  188. data/spec/dummy/tmp/cache/assets/development/sprockets/05029f2e1c68338ac88af8005acab3ca +0 -0
  189. data/spec/dummy/tmp/cache/assets/development/sprockets/08318fdb5f5b783c22442a6aeb73730e +0 -0
  190. data/spec/dummy/tmp/cache/assets/development/sprockets/08f00d4a1bac197d382c2269a184f9e4 +0 -0
  191. data/spec/dummy/tmp/cache/assets/development/sprockets/0b6c06f6bcf535567c19f70f7aa5144d +0 -0
  192. data/spec/dummy/tmp/cache/assets/development/sprockets/0b9076b70e22dd7976e589018cdf65ca +0 -0
  193. data/spec/dummy/tmp/cache/assets/development/sprockets/0e8461b429e0249b8dc74d457fcc17d3 +0 -0
  194. data/spec/dummy/tmp/cache/assets/development/sprockets/0f074c0ea10680a3ba979bbd1d2ff756 +0 -0
  195. data/spec/dummy/tmp/cache/assets/development/sprockets/0f5877c1fb159c1a5f1602569a0cdde2 +0 -0
  196. data/spec/dummy/tmp/cache/assets/development/sprockets/0f8cf3c40768cf2ab52c613a7efc30cb +0 -0
  197. data/spec/dummy/tmp/cache/assets/development/sprockets/10fcfbe6ebae11a40c8eac41939a1b9a +0 -0
  198. data/spec/dummy/tmp/cache/assets/development/sprockets/126ebaa8ad57e48772c035caac2ed632 +0 -0
  199. data/spec/dummy/tmp/cache/assets/development/sprockets/13c6f1c4603d5736407a6b5f7889a056 +0 -0
  200. data/spec/dummy/tmp/cache/assets/development/sprockets/13f8355b45d7c46c05177fef3b7f6283 +0 -0
  201. data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  202. data/spec/dummy/tmp/cache/assets/development/sprockets/157d2eedb817dece09700185cd4101e3 +0 -0
  203. data/spec/dummy/tmp/cache/assets/development/sprockets/16039dc737e753516f4399dcd38d6de7 +0 -0
  204. data/spec/dummy/tmp/cache/assets/development/sprockets/19699f0bd9bbacb926aa665d057d7dcc +0 -0
  205. data/spec/dummy/tmp/cache/assets/development/sprockets/2013f24e3245656ca1e5890649a0b023 +0 -0
  206. data/spec/dummy/tmp/cache/assets/development/sprockets/26bd44751cc9640593dc583d6be8410d +0 -0
  207. data/spec/dummy/tmp/cache/assets/development/sprockets/272f5096d49f011351e9f4780c313741 +0 -0
  208. data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  209. data/spec/dummy/tmp/cache/assets/development/sprockets/32ef1c9e94a83350bad5e887c416c5b6 +0 -0
  210. data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  211. data/spec/dummy/tmp/cache/assets/development/sprockets/367865b241c60ef0e9a85c9f9910f7d4 +0 -0
  212. data/spec/dummy/tmp/cache/assets/development/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
  213. data/spec/dummy/tmp/cache/assets/development/sprockets/37984c7de5e7d22002a378234035e51c +0 -0
  214. data/spec/dummy/tmp/cache/assets/development/sprockets/4201264f7710f91dc1c389a2497eda7d +0 -0
  215. data/spec/dummy/tmp/cache/assets/development/sprockets/4843087e4f4577291013564353d9be98 +0 -0
  216. data/spec/dummy/tmp/cache/assets/development/sprockets/490b125495df24b66caa52d70f8aa64d +0 -0
  217. data/spec/dummy/tmp/cache/assets/development/sprockets/4c9470e682578ab5fc183f98fae5f42d +0 -0
  218. data/spec/dummy/tmp/cache/assets/development/sprockets/4e81b6b6eb1e1462b1eea2caee6bfcc6 +0 -0
  219. data/spec/dummy/tmp/cache/assets/development/sprockets/510da110ae528e2d22533be39ff696c5 +0 -0
  220. data/spec/dummy/tmp/cache/assets/development/sprockets/518c73ecd762cbf6d85a3ae693e08d01 +0 -0
  221. data/spec/dummy/tmp/cache/assets/development/sprockets/56401bbafd08927b55572c8ef7e88883 +0 -0
  222. data/spec/dummy/tmp/cache/assets/development/sprockets/5865993e4fa54b7f6f0186ebaffff12b +0 -0
  223. data/spec/dummy/tmp/cache/assets/development/sprockets/59f25755df49e4db5915553e3d2ef412 +0 -0
  224. data/spec/dummy/tmp/cache/assets/development/sprockets/5a48dae6fe5b78da3082b1347022ee01 +0 -0
  225. data/spec/dummy/tmp/cache/assets/development/sprockets/5f62321f43b55988b6cb95367556d822 +0 -0
  226. data/spec/dummy/tmp/cache/assets/development/sprockets/61fab520b090f94084c9a7ffc402ad3c +0 -0
  227. data/spec/dummy/tmp/cache/assets/development/sprockets/653178c2e0c5d134069e58196f7bf28e +0 -0
  228. data/spec/dummy/tmp/cache/assets/development/sprockets/661c74f15a009d482fdad85f811e6f8e +0 -0
  229. data/spec/dummy/tmp/cache/assets/development/sprockets/6668d3ee30c1513097c95bcc0a27696a +0 -0
  230. data/spec/dummy/tmp/cache/assets/development/sprockets/690b40f9a765547b660ac81cbd5ed378 +0 -0
  231. data/spec/dummy/tmp/cache/assets/development/sprockets/6bdff36d9dbeb7ae3e6802b482a04668 +0 -0
  232. data/spec/dummy/tmp/cache/assets/development/sprockets/6eaa97256ef2d58208ab91c60707acdb +0 -0
  233. data/spec/dummy/tmp/cache/assets/development/sprockets/6fa120c855c745c904828746e82b2b07 +0 -0
  234. data/spec/dummy/tmp/cache/assets/development/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
  235. data/spec/dummy/tmp/cache/assets/development/sprockets/715840f8887bc1e70ef3cc18b429cbc8 +0 -0
  236. data/spec/dummy/tmp/cache/assets/development/sprockets/754b02ea2ed1c85b7756de6452f4aeb7 +0 -0
  237. data/spec/dummy/tmp/cache/assets/development/sprockets/764fdaef2f219fafc8db0923a56c23a3 +0 -0
  238. data/spec/dummy/tmp/cache/assets/development/sprockets/78fdc1d9add39ed3fdcbf7cae3df4190 +0 -0
  239. data/spec/dummy/tmp/cache/assets/development/sprockets/7a7280187e89f6c4256217ea0fe1e787 +0 -0
  240. data/spec/dummy/tmp/cache/assets/development/sprockets/7b2d3e5e25b0901f78fbf8c9cb9570c4 +0 -0
  241. data/spec/dummy/tmp/cache/assets/development/sprockets/84eb79ed8e43cf9414e6ecfd38c5a19f +0 -0
  242. data/spec/dummy/tmp/cache/assets/development/sprockets/87172f2d7a412d1fe87d7775d589b883 +0 -0
  243. data/spec/dummy/tmp/cache/assets/development/sprockets/871fe15e38e1cf354ac33b4faf796fd3 +0 -0
  244. data/spec/dummy/tmp/cache/assets/development/sprockets/875849c72f053c7a7674e9fd72ee2cd4 +0 -0
  245. data/spec/dummy/tmp/cache/assets/development/sprockets/87a55c890eedab0cc5d1e3f2c2b2da4b +0 -0
  246. data/spec/dummy/tmp/cache/assets/development/sprockets/88741eb863751c5d5adb82282f6df5cd +0 -0
  247. data/spec/dummy/tmp/cache/assets/development/sprockets/8ab512c9b33ac90e699b73469d71f061 +0 -0
  248. data/spec/dummy/tmp/cache/assets/development/sprockets/8cc360b254f1bff91753f954e7591a9b +0 -0
  249. data/spec/dummy/tmp/cache/assets/development/sprockets/8ec990d84f5dedd35001397078415137 +0 -0
  250. data/spec/dummy/tmp/cache/assets/development/sprockets/9181401ef96921b28b49d4ec48261a4d +0 -0
  251. data/spec/dummy/tmp/cache/assets/development/sprockets/9409af55392b7f03edb441d5b53b931c +0 -0
  252. data/spec/dummy/tmp/cache/assets/development/sprockets/94e46c0e76c8f392586af76b0f6c6e93 +0 -0
  253. data/spec/dummy/tmp/cache/assets/development/sprockets/968566581a35be861fa4f8fed757dcae +0 -0
  254. data/spec/dummy/tmp/cache/assets/development/sprockets/96f8ac0ca90b5e46fb770d1695a77b2d +0 -0
  255. data/spec/dummy/tmp/cache/assets/development/sprockets/9b51a99e821d1802733dceac6764d18f +0 -0
  256. data/spec/dummy/tmp/cache/assets/development/sprockets/9d8681a4ce63f327a868f759096673e8 +0 -0
  257. data/spec/dummy/tmp/cache/assets/development/sprockets/a004f4ca229f6e9e761d2c86226e04f4 +0 -0
  258. data/spec/dummy/tmp/cache/assets/development/sprockets/a0a671e624f03533a82b1ec899bf3b21 +0 -0
  259. data/spec/dummy/tmp/cache/assets/development/sprockets/a0f669003bef02490064a16cfdb916fe +0 -0
  260. data/spec/dummy/tmp/cache/assets/development/sprockets/a411f643e05384fdb860f193e1dbe8f8 +0 -0
  261. data/spec/dummy/tmp/cache/assets/development/sprockets/a4abc5f3fc1bfe41be3470836766d110 +0 -0
  262. data/spec/dummy/tmp/cache/assets/development/sprockets/a82a869a86d5cbcbb101123eb6448f0c +0 -0
  263. data/spec/dummy/tmp/cache/assets/development/sprockets/a97cd428904e5968d05f7d3a5fd50f85 +0 -0
  264. data/spec/dummy/tmp/cache/assets/development/sprockets/aa87366fe7cd02f1be035665580cf066 +0 -0
  265. data/spec/dummy/tmp/cache/assets/development/sprockets/ada9a8c9882e963e6b98cdcaf20af34f +0 -0
  266. data/spec/dummy/tmp/cache/assets/development/sprockets/af326fcf9b4f69ff70d3610d0696b585 +0 -0
  267. data/spec/dummy/tmp/cache/assets/development/sprockets/af5ab48d2f371513fb609f8bdec3ac42 +0 -0
  268. data/spec/dummy/tmp/cache/assets/development/sprockets/b245fe00601bf4b4c2bd6ce9286a53dc +0 -0
  269. data/spec/dummy/tmp/cache/assets/development/sprockets/b51a3679ccee92d6e374deac3359cc69 +0 -0
  270. data/spec/dummy/tmp/cache/assets/development/sprockets/baed877d386dc374496dcd62af36bc5b +0 -0
  271. data/spec/dummy/tmp/cache/assets/development/sprockets/bc6f2f1da483ac27102f9412ee294dbf +0 -0
  272. data/spec/dummy/tmp/cache/assets/development/sprockets/bcca522c6302f184f12fe0e8a7d7e71a +0 -0
  273. data/spec/dummy/tmp/cache/assets/development/sprockets/bd3936370d0f952ada5774e2230046ed +0 -0
  274. data/spec/dummy/tmp/cache/assets/development/sprockets/c04a836e22ec09c7eae6eae9349efee3 +0 -0
  275. data/spec/dummy/tmp/cache/assets/development/sprockets/c13fc73ceafa45876a901b3e775b83ae +0 -0
  276. data/spec/dummy/tmp/cache/assets/development/sprockets/c2816385f6bc1d4ef24315437e9353d3 +0 -0
  277. data/spec/dummy/tmp/cache/assets/development/sprockets/c4e265ba144f19c1f646f9d8271c0702 +0 -0
  278. data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  279. data/spec/dummy/tmp/cache/assets/development/sprockets/d4c36568a5145e04bfbbefd37fecdde7 +0 -0
  280. data/spec/dummy/tmp/cache/assets/development/sprockets/d63d1c956772687b2dd2c9b43533e795 +0 -0
  281. data/spec/dummy/tmp/cache/assets/development/sprockets/d75dd624db3682fd4fed243c5f6f2e69 +0 -0
  282. data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  283. data/spec/dummy/tmp/cache/assets/development/sprockets/d7d3659361bd25606f9efaba128bf4c1 +0 -0
  284. data/spec/dummy/tmp/cache/assets/development/sprockets/d9fa58e1385bfb03f2ede65c90f36d70 +0 -0
  285. data/spec/dummy/tmp/cache/assets/development/sprockets/da8e37f2c9e3ea8f443def70515d1df0 +0 -0
  286. data/spec/dummy/tmp/cache/assets/development/sprockets/dcff3d1cd16d434b55e09399722e68be +0 -0
  287. data/spec/dummy/tmp/cache/assets/development/sprockets/e18f7bb0b671acf59ad700724547a456 +0 -0
  288. data/spec/dummy/tmp/cache/assets/development/sprockets/e459168835a5f27b832ace20874f7c10 +0 -0
  289. data/spec/dummy/tmp/cache/assets/development/sprockets/e618b87b000e1c8d606542b2a7b4936f +0 -0
  290. data/spec/dummy/tmp/cache/assets/development/sprockets/e6df0f40358bfc2568038d9cf71859a5 +0 -0
  291. data/spec/dummy/tmp/cache/assets/development/sprockets/ebe8c427280f71fed250770f7d5e0af8 +0 -0
  292. data/spec/dummy/tmp/cache/assets/development/sprockets/edefa48dfc6b66b08d68e6438d1344b4 +0 -0
  293. data/spec/dummy/tmp/cache/assets/development/sprockets/ee70ec49c833625099b94820cbfaf238 +0 -0
  294. data/spec/dummy/tmp/cache/assets/development/sprockets/eea8d1c182d93d92a52f24a90d5c92af +0 -0
  295. data/spec/dummy/tmp/cache/assets/development/sprockets/efe3e82d4fe0ca8a3427678a9cd1d070 +0 -0
  296. data/spec/dummy/tmp/cache/assets/development/sprockets/f024e5fd86a61ac8399d564f8202bbc8 +0 -0
  297. data/spec/dummy/tmp/cache/assets/development/sprockets/f12542794a06e22b1dbd97250d49deb1 +0 -0
  298. data/spec/dummy/tmp/cache/assets/development/sprockets/f34759266a45010771006dcbb608d179 +0 -0
  299. data/spec/dummy/tmp/cache/assets/development/sprockets/f466a3fe42e17653acb9980dae9be11a +0 -0
  300. data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  301. data/spec/dummy/tmp/cache/assets/development/sprockets/f86d0394f2c6bebf4ad490ce4a37d754 +0 -0
  302. data/spec/dummy/tmp/cache/assets/development/sprockets/fd5a31651e4fc8cf4a3199e8db16d53e +0 -0
  303. data/spec/dummy/tmp/cache/assets/development/sprockets/fd71e811fb40f0e16e339622af4c771f +0 -0
  304. data/spec/dummy/tmp/cache/assets/development/sprockets/fd843e12fcdd9539f8e3d7384a19bb31 +0 -0
  305. data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  306. data/spec/dummy/tmp/cache/assets/test/sprockets/19699f0bd9bbacb926aa665d057d7dcc +0 -0
  307. data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  308. data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  309. data/spec/dummy/tmp/cache/assets/test/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
  310. data/spec/dummy/tmp/cache/assets/test/sprockets/59f25755df49e4db5915553e3d2ef412 +0 -0
  311. data/spec/dummy/tmp/cache/assets/test/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
  312. data/spec/dummy/tmp/cache/assets/test/sprockets/764fdaef2f219fafc8db0923a56c23a3 +0 -0
  313. data/spec/dummy/tmp/cache/assets/test/sprockets/87172f2d7a412d1fe87d7775d589b883 +0 -0
  314. data/spec/dummy/tmp/cache/assets/test/sprockets/88741eb863751c5d5adb82282f6df5cd +0 -0
  315. data/spec/dummy/tmp/cache/assets/test/sprockets/96f8ac0ca90b5e46fb770d1695a77b2d +0 -0
  316. data/spec/dummy/tmp/cache/assets/test/sprockets/a4abc5f3fc1bfe41be3470836766d110 +0 -0
  317. data/spec/dummy/tmp/cache/assets/test/sprockets/af326fcf9b4f69ff70d3610d0696b585 +0 -0
  318. data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  319. data/spec/dummy/tmp/cache/assets/test/sprockets/d63d1c956772687b2dd2c9b43533e795 +0 -0
  320. data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  321. data/spec/dummy/tmp/cache/assets/test/sprockets/d7d3659361bd25606f9efaba128bf4c1 +0 -0
  322. data/spec/dummy/tmp/cache/assets/test/sprockets/f024e5fd86a61ac8399d564f8202bbc8 +0 -0
  323. data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  324. data/spec/dummy/tmp/cache/assets/test/sprockets/fd5a31651e4fc8cf4a3199e8db16d53e +0 -0
  325. data/spec/ext_form_spec.rb +12 -0
  326. data/spec/factories/order_header_factory.rb +22 -0
  327. data/spec/helpers/dt_picker_spec.rb +66 -0
  328. data/spec/helpers/dt_picker_tag_spec.rb +65 -0
  329. data/spec/helpers/form_helper_bs_spec.rb +102 -0
  330. data/spec/helpers/form_helper_spec.rb +109 -0
  331. data/spec/spec_helper.rb +15 -0
  332. data/spec/support/form_helper.rb +21 -0
  333. metadata +787 -0
@@ -0,0 +1,222 @@
1
+ module ExtForm
2
+ module Helpers
3
+ module FormHelper
4
+ extend ActiveSupport::Concern
5
+
6
+ include FormTagHelper
7
+
8
+ # Helper that wrapped simple_form_for and layout management.
9
+ #
10
+ # record - an object extending ActiveRecord::Base
11
+ # options - add option l , the others are as the same as the
12
+ # simple_form_for
13
+ # :l - layout options
14
+ # :layout - it 's a string ,specify the scale of
15
+ # columns.
16
+ # for example: '1:1', '1:2', '1:1:1'
17
+ # :spacing - left and right padding of form, should be
18
+ # number or percentage.
19
+ # :label_width - label width of input, should be number or
20
+ # percentage.
21
+ # :max_width - max width of form, should be number or
22
+ # percentage. -
23
+ #
24
+ # Example:
25
+ #
26
+ # <%= ext_form_for(@project, l: {layout: '1:1:1'}) do |f| %>
27
+ # <%= f.inputs do %>
28
+ # <%= f.input :name %>
29
+ # <%= f.input :description %>
30
+ # <% end %>
31
+ # <% end %>
32
+ def ext_form_for(record, options = {}, &block)
33
+ redefine_options(options)
34
+ simple_form_for(record, options, &wrapped_inputs(&block))
35
+ end
36
+
37
+ # Wrapper for using ExtForm inside a rails form.
38
+ # you shouldn't use ext_fields_for directly yet, it is not tested now.
39
+ # TODO: this feature needs to be tested.
40
+ #
41
+ # Example:
42
+ #
43
+ # form_for @user do |f|
44
+ # f.text_field :username
45
+ # f.text_field :email
46
+ # ext_fields_for @post, l: {layout: '1'} do |posts_form|
47
+ # posts_form.inputs do
48
+ # posts_form.input :title
49
+ # posts_form.input :content
50
+ # end
51
+ # end
52
+ # end
53
+ def ext_fields_for(record_name, record_object = nil, options = {}, &block)
54
+ options, record_object = record_object, nil if record_object.is_a?(Hash) && record_object.extractable_options?
55
+ redefine_options(options)
56
+ simple_fields_for(record_name, record_object, options, &block)
57
+ end
58
+
59
+ # Use bootstrap-datetimepicker instead of date_select or time_select
60
+ #
61
+ #
62
+ # object_name - the object name of form builder
63
+ # method - method of object
64
+ # options - all options are as same as text field.
65
+ # data -
66
+ # format - yyyy-mm-dd, yyyy/mm/dd.....
67
+ # week_start - 0-6
68
+ # start_date - can't pick the date before the start_date.
69
+ # end_date - can't pick the date after the end_date.
70
+ # view_mode - 0..month,1..year,2..10 years
71
+ # min_view_mode - not be tested....
72
+ # language - default pt-BR, see bootstrap-datetimepicker API
73
+ # mask_input - true, false disables the text input mask
74
+ # pick_date - true, false disables the date picker
75
+ # pick_time - true, false disables de time picker
76
+ # pick_12_hour_format - false, true enables the 12-hour format time picker
77
+ # pick_seconds - true
78
+ #
79
+ # Example:
80
+ #
81
+ # You can use 3 types of dt_picker: date_picker, time_picker, dt_picker.
82
+ #
83
+ # ext_form would guess the input_type.
84
+ # The field name ends with '_date' will be set to date_picker.
85
+ # The field name ends with '_at' or '_time' will be set to dt_picker.
86
+ #
87
+ # <%= ext_form_for(@project, l: {layout: '1:1:1'}) do |f| %>
88
+ # <%= f.inputs do %>
89
+ # <%= f.input :estimated_start_date %>
90
+ # <% end %>
91
+ # <% end %>
92
+ #
93
+ # will produce:
94
+ #
95
+ # <div class="input-append">
96
+ # <input class="span3 date_picker optional"
97
+ # data-format="yyyy-MM-dd"
98
+ # data-language="zh-CN"
99
+ # data-pick-time="false"
100
+ # id="project_estimated_start_date"
101
+ # name="project[estimated_start_date]"
102
+ # type="text" value="2013-09-12" />
103
+ # <script>
104
+ # //<![CDATA[
105
+ # $ (function() { $ ('#order_header_order_date').trigger('dt_picker_load'); });
106
+ # //]]>
107
+ # </script>
108
+ # <span class="add-on"><i data-date-icon="icon-calendar" data-time-icon="icon-time"></i></span>
109
+ # </div>
110
+ #
111
+ # When page is loaded, datetimepicker will be automatically loaded.
112
+ def dt_picker(object_name, method, options={})
113
+ ExtForm::Helpers::Tags::DtPicker.new(object_name, method, self, options).render
114
+ end
115
+
116
+ # JS auto complete feature using twitter typeahead.js, pass options through data.
117
+ #
118
+ # object_name - the object name of form builder
119
+ # method - method of object
120
+ # options - all options are as same as text field.
121
+ # data -
122
+ # dataset - see: https://github.com/twitter/typeahead.js#api
123
+ # mapping - A hash represents that the datum selected maps to inputs in the form, when you want select
124
+ # a result and put some values relative to the other fields at the same time, you can use it.
125
+ # format: {datum_name: 'input_id', datum_name2: 'input_id2'}
126
+ #
127
+ # Example:
128
+ # <%= ext_form_for(@order) do |f| %>
129
+ # <%= f.hidden_field :customer_id %>
130
+ # <%= f.inputs do %>
131
+ # <%= f.input :customer, as: :auto_complete, input_html: {
132
+ # data: {
133
+ # dataset: {
134
+ # name: 'customer',
135
+ # local: [
136
+ # {id: 1, value: 'customer1', address: 'address1'},
137
+ # {id: 2, value: 'customer2', address: 'address2'},
138
+ # {id: 3, value: 'customer3', address: 'address3'},
139
+ # {id: 4, value: 'customer4', address: 'address4'}
140
+ # ]
141
+ # },
142
+ # mapping: {
143
+ # id: 'order_customer_id',
144
+ # address: 'order_customer_address'
145
+ # }
146
+ # }
147
+ # } %>
148
+ # <%= f.input :customer_address %>
149
+ # <% end %>
150
+ # <% end %>
151
+ #
152
+ # When you select a customer, id will be put into hidden field whose id is "order_customer_id",
153
+ # address will be put into text field whose id is "order_customer_address".
154
+ #
155
+ # If you input an invalid customer name, relative fields will be cleared.
156
+ def auto_complete(object_name, method, options={})
157
+ ExtForm::Helpers::Tags::AutoComplete.new(object_name, method, self, options).render
158
+ end
159
+
160
+ def collection_select2(object_name, method, collection, value_method, text_method, options={}, html_options={})
161
+ ExtForm::Helpers::Tags::CollectionSelect.new(object_name, method, self, collection, value_method,
162
+ text_method, options, html_options).render
163
+ end
164
+
165
+ def grouped_collection_select2(object_name, method, collection, group_method,
166
+ group_label_method, option_key_method, option_value_method, options={}, html_options={})
167
+ ExtForm::Helpers::Tags::GroupedCollectionSelect.new(object_name, method, self, collection, group_method,
168
+ group_label_method, option_key_method,
169
+ option_value_method, options,
170
+ html_options).render
171
+ end
172
+
173
+ private
174
+
175
+ def redefine_options(options={})
176
+ options[:builder] ||= ExtForm::Builders::FormBuilderBase
177
+ options[:wrapper] ||= ExtForm.default_wrapper
178
+ options[:html] ||= {}
179
+ new_class = []
180
+ new_class << options[:html].delete(:class)
181
+ new_class << ExtForm.form_class
182
+ options[:html][:class] = new_class.compact.join(' ')
183
+ end
184
+
185
+ def wrapped_inputs(&block)
186
+ proc { |f|
187
+ layout = f.l
188
+ output = []
189
+ if f.l.instance_of?(ExtForm::Layouts::DefaultLayout)
190
+ output << default_wrapper(f, layout, &block)
191
+ else
192
+ output << bootstrap_wrapper(f, layout, &block)
193
+ end
194
+ output << after_nested_form_callbacks
195
+ output.compact.join.html_safe
196
+ }
197
+ end
198
+
199
+ def default_wrapper(f, layout, &block)
200
+ spacing = layout.layout_config[:spacing]
201
+ suffix = layout.layout_config[:measure]
202
+
203
+ content_tag('div', nil,
204
+ class: 'all-inputs',
205
+ style: "padding-left: #{spacing}#{suffix}; padding-right: #{spacing}#{suffix}; "\
206
+ "width: #{layout.actual_width}#{suffix};") do
207
+ capture(f, &block)
208
+ end
209
+ end
210
+
211
+ def bootstrap_wrapper(f, layout, &block)
212
+ spacing = layout.layout_config[:spacing]
213
+ [(content_tag('div', ' ', class: "left-spacing span#{spacing}") if spacing.to_i > 0),
214
+ content_tag('div', nil, class: "all-inputs span#{layout.actual_width}") { capture(f, &block) },
215
+ (content_tag('div', ' ', class: "right-spacing span#{spacing}") if spacing.to_i > 0)
216
+ ].compact.join.html_safe
217
+ end
218
+ end
219
+ end
220
+ end
221
+
222
+ ActionView::Base.send :include, ExtForm::Helpers::FormHelper
@@ -0,0 +1,60 @@
1
+ module ExtForm
2
+ module Helpers
3
+ module FormTagHelper
4
+ extend ActiveSupport::Concern
5
+
6
+ # Datetime picker tag helper, based on bootstrap-datetimepicker
7
+ #
8
+ # object_name - the object name of form builder
9
+ # method - method of object
10
+ # options - all options are as same as text field.
11
+ # data -
12
+ # format - yyyy-mm-dd, yyyy/mm/dd.....
13
+ # week_start - 0-6
14
+ # start_date - can't pick the date before the start_date.
15
+ # end_date - can't pick the date after the end_date.
16
+ # view_mode - 0..month,1..year,2..10 years
17
+ # min_view_mode - not be tested....
18
+ # language - default pt-BR, see bootstrap-datetimepicker API
19
+ # mask_input - true, false disables the text input mask
20
+ # pick_date - true, false disables the date picker
21
+ # pick_time - true, false disables de time picker
22
+ # pick_12_hour_format - false, true enables the 12-hour format time picker
23
+ # pick_seconds - true
24
+ def dt_picker_tag(name, value, options={})
25
+ id = sanitize_to_id(name)
26
+ default_options = {id: id}
27
+ options.reverse_merge!(default_options)
28
+
29
+ output = content_tag(:div, nil, class: 'input-append') do
30
+ [text_field_tag(name, value, options),
31
+ content_tag(:span, nil, class: 'add-on') do
32
+ content_tag(:i, nil, data: {date_icon: 'icon-calendar', time_icon: 'icon-time'})
33
+ end
34
+ ].join.html_safe
35
+ end
36
+ output << javascript_tag do
37
+ "$('##{options[:id]}').trigger('dt_picker_load');".html_safe
38
+ end
39
+
40
+ output.html_safe
41
+ end
42
+
43
+ # JS auto complete feature using twitter typeahead.js, pass options through data.
44
+ # see: ExtForm::Helpers::FormHelper#auto_complete
45
+ # TODO: this feature needs to be tested.
46
+ def auto_complete_tag(name, value, options={})
47
+ id = sanitize_to_id(name)
48
+ default_options = {id: id}
49
+ options.reverse_merge!(default_options)
50
+
51
+ output = text_field_tag(name, value, options)
52
+ output << javascript_tag do
53
+ "$('##{options[:id]}').trigger('auto_complete_load');".html_safe
54
+ end
55
+
56
+ output.html_safe
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,25 @@
1
+ module ExtForm
2
+ module Helpers
3
+ module Tags
4
+
5
+ class AutoComplete < ActionView::Helpers::Tags::TextField
6
+ def render
7
+ output = super
8
+
9
+ html_options = {}
10
+ add_default_name_and_id(html_options)
11
+
12
+ output << @template_object.javascript_tag do
13
+ "$(function(){$('##{html_options['id']}').trigger('auto_complete_load');});".html_safe
14
+ end
15
+ output.html_safe
16
+ end
17
+
18
+ def self.field_type
19
+ 'text'
20
+ end
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ module ExtForm
2
+ module Helpers
3
+ module Tags
4
+ class CollectionSelect < ActionView::Helpers::Tags::CollectionSelect
5
+ def render
6
+ output = super
7
+
8
+ html_options = {}
9
+ add_default_name_and_id(html_options)
10
+
11
+ output << @template_object.javascript_tag do
12
+ "$(function(){$('##{html_options['id']}').trigger('select2_load');});".html_safe
13
+ end
14
+ output.html_safe
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ module ExtForm
2
+ module Helpers
3
+ module Tags
4
+ class DtPicker < ActionView::Helpers::Tags::TextField
5
+
6
+ def render
7
+ if value_before_type_cast(object).present?
8
+ @options[:value] = value_before_type_cast(object).match(/\d{4}-\d{1,2}-\d{1,2}(\s\d{1,2}:\d{1,2}:\d{1,2})?/)
9
+ end
10
+ output = super
11
+
12
+ html_options = {}
13
+ add_default_name_and_id(html_options)
14
+
15
+ output << @template_object.javascript_tag do
16
+ "$(function(){$('##{html_options['id']}').trigger('dt_picker_load');});".html_safe
17
+ end
18
+ output.html_safe
19
+ end
20
+
21
+ def self.field_type
22
+ 'text'
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ module ExtForm
2
+ module Helpers
3
+ module Tags
4
+ class GroupedCollectionSelect < ActionView::Helpers::Tags::GroupedCollectionSelect
5
+ def render
6
+ output = super
7
+
8
+ html_options = {}
9
+ add_default_name_and_id(html_options)
10
+
11
+ output << @template_object.javascript_tag do
12
+ "$(function(){$('##{html_options['id']}').trigger('select2_load');});".html_safe
13
+ end
14
+ output.html_safe
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ module ExtForm
2
+ module Helpers
3
+ module Tags
4
+ extend ActiveSupport::Autoload
5
+
6
+ autoload :DtPicker
7
+ autoload :AutoComplete
8
+ autoload :CollectionSelect
9
+ autoload :GroupedCollectionSelect
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module ExtForm
2
+ module Inputs
3
+ class AutoComplete < SimpleForm::Inputs::StringInput
4
+
5
+ def input
6
+ @builder.send(input_type, attribute_name, input_html_options)
7
+ end
8
+ end
9
+ end
10
+ end
11
+
@@ -0,0 +1,11 @@
1
+ module ExtForm
2
+ module Inputs
3
+ module BaseMixin
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ delegate :l, :input_seq, to: :@builder
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module ExtForm
2
+ module Inputs
3
+ module BootstrapInputsMixin
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ include ExtForm::Components::InputAddons
8
+ disable :input_addon
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ module ExtForm
2
+ module Inputs
3
+ class CollectionSelect < SimpleForm::Inputs::CollectionSelectInput
4
+ def input
5
+ label_method, value_method = detect_collection_methods
6
+
7
+ @builder.collection_select2(
8
+ attribute_name, collection, value_method, label_method,
9
+ input_options, input_html_options
10
+ )
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,20 @@
1
+ module ExtForm
2
+ module Inputs
3
+ class DtPicker < SimpleForm::Inputs::StringInput
4
+ enable :input_addon
5
+
6
+ attr_accessor :addon_options
7
+
8
+ def initialize(builder, attribute_name, column, input_type, options = {})
9
+ self.addon_options = options.delete(:input_addon) || {}
10
+ self.addon_options.merge!({datetimepicker: true})
11
+ super
12
+ end
13
+
14
+ def input
15
+ @builder.send(input_type, attribute_name, input_html_options)
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,13 @@
1
+ module ExtForm
2
+ module Inputs
3
+ class GroupedCollectionSelect < SimpleForm::Inputs::GroupedCollectionSelectInput
4
+ def input
5
+ label_method, value_method = detect_collection_methods
6
+ @builder.grouped_collection_select2(attribute_name, grouped_collection,
7
+ group_method, group_label_method, value_method, label_method,
8
+ input_options, input_html_options)
9
+ end
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,15 @@
1
+ module ExtForm
2
+ module Inputs
3
+ extend ActiveSupport::Autoload
4
+
5
+ eager_autoload do
6
+ autoload :BaseMixin
7
+ autoload :BootstrapInputsMixin
8
+ autoload :DtPicker
9
+ autoload :AutoComplete
10
+ autoload :CollectionSelect
11
+ autoload :GroupedCollectionSelect
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,82 @@
1
+ module ExtForm
2
+ module Layouts
3
+ module BaseLayout
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ attr_accessor :layout_config, :layout, :actual_width
8
+ end
9
+
10
+ # Internal: setup layout configuration and setup the default layout of form, you can change it
11
+ # in a particular row.
12
+ #
13
+ # config - layout config, default nil, it must be a hash.
14
+ # :layout - it's a string ,specify the scale of columns.
15
+ # for example: '1:1', '1:2', '1:1:1'
16
+ # :spacing - left and right padding of form, should be number or percentage.
17
+ # :label_width - label width of input, should be number or percentage.
18
+ # :max_width - max width of form, should be number or percentage.
19
+ #
20
+ # All width options should be all numbers or all percentages, or it will not
21
+ # be calculated correctly.
22
+ #
23
+ # I'm looking for a method to provide responding design. Any contribution will be
24
+ # appreciated.
25
+ #
26
+ def setup_config(config)
27
+ self.layout_config = if config && config.is_a?(Hash)
28
+ config.delete(:layout) unless layout_available?(config[:layout])
29
+ config.delete(:spacing) unless width_available?(config[:spacing])
30
+ config.delete(:label_width) unless width_available?(config[:label_width])
31
+ config.delete(:max_width) unless width_available?(config[:max_width])
32
+ config.delete(:measure) unless measure_available?(config[:measure])
33
+
34
+ config.reverse_merge(ExtForm.default_layout)
35
+ else
36
+ ExtForm.default_layout.dup
37
+ end
38
+
39
+ self.layout = calculate_layout(layout_config)
40
+ self.actual_width = calc_actual_width
41
+ end
42
+
43
+ def width_available?(width)
44
+ raise NotImplementedError
45
+ end
46
+
47
+ def measure_available?(measure)
48
+ raise NotImplementedError
49
+ end
50
+
51
+ def layout_available?(layout)
52
+ layout && layout.match(/^\d(:\d){0,2}$/)
53
+ end
54
+
55
+ def calculate_layout(config)
56
+ layout = []
57
+ cols = config[:layout].split(':').map { |s| s.to_i }
58
+
59
+ cols.each do |c|
60
+ layout << [config[:label_width], calculate_input_width(config[:max_width], config[:label_width], config[:spacing], cols.sum, c)]
61
+ end
62
+ layout
63
+ end
64
+
65
+ def calc_actual_width
66
+ raise NotImplementedError
67
+ end
68
+
69
+ def calculate_input_width(max_width, label_width, spacing, cols_sum, c)
70
+ raise NotImplementedError
71
+ end
72
+
73
+ def label_width(seq)
74
+ self.layout[seq][0]
75
+ end
76
+
77
+ def input_width(seq)
78
+ self.layout[seq][1]
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,23 @@
1
+ module ExtForm
2
+ module Layouts
3
+ class BootstrapLayout
4
+ include BaseLayout
5
+
6
+ def width_available?(width)
7
+ width && width.match(/^\d+$/) && width.to_i <= 12
8
+ end
9
+
10
+ def measure_available?(measure)
11
+ true
12
+ end
13
+
14
+ def calc_actual_width
15
+ self.layout_config[:max_width].to_i - 2 * self.layout_config[:spacing].to_i
16
+ end
17
+
18
+ def calculate_input_width(max_width, label_width, spacing, cols_sum, c)
19
+ (((max_width.to_f - spacing.to_f * 2) / cols_sum * c).floor - label_width.to_i).to_s
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,29 @@
1
+ module ExtForm
2
+ module Layouts
3
+ class DefaultLayout
4
+ include BaseLayout
5
+
6
+ # Internal: decide option width whether is available,
7
+ # possible formats are number% or number.
8
+ #
9
+ # width - option width
10
+ #
11
+ # Returns true or false.
12
+ def width_available?(width)
13
+ width && width.match(/^\d+\.?\d?$/)
14
+ end
15
+
16
+ def measure_available?(measure)
17
+ %w(% px pt em cm).include?(measure)
18
+ end
19
+
20
+ def calc_actual_width
21
+ self.layout.flatten.map(&:to_f).sum
22
+ end
23
+
24
+ def calculate_input_width(max_width, label_width, spacing, cols_sum, c)
25
+ ((max_width.to_f - 2 * spacing.to_f) / cols_sum * c - label_width.to_f).to_s
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ module ExtForm
2
+ module Layouts
3
+ extend ActiveSupport::Autoload
4
+
5
+ eager_autoload do
6
+ autoload :BaseLayout
7
+ autoload :DefaultLayout
8
+ autoload :BootstrapLayout
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module ExtForm
2
+ VERSION = '0.1.4'
3
+ end
@@ -0,0 +1,18 @@
1
+ module ExtForm
2
+ module Wrappers
3
+ module ManyMixin
4
+ extend ActiveSupport::Concern
5
+ include Mixin
6
+
7
+ included do
8
+ def render_with_layout(input)
9
+ wrap_style_options(input, @defaults[:layout], namespace) if @defaults[:layout]
10
+ render_without_layout(input)
11
+ end
12
+
13
+ alias_method_chain :render, :layout
14
+ end
15
+
16
+ end
17
+ end
18
+ end