ext_form 0.1.4

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