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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/Rakefile +31 -0
- data/app/assets/javascripts/ext_form/application.js +78 -0
- data/app/assets/javascripts/typeahead.js +1159 -0
- data/app/assets/stylesheets/ext_form/application.scss +15 -0
- data/app/assets/stylesheets/ext_form/application_bootstrap.css.scss +197 -0
- data/app/assets/stylesheets/ext_form/base.css.scss +32 -0
- data/config/routes.rb +2 -0
- data/lib/ext_form/builders/form_builder_base.rb +224 -0
- data/lib/ext_form/builders.rb +10 -0
- data/lib/ext_form/components/input_addons.rb +34 -0
- data/lib/ext_form/components.rb +7 -0
- data/lib/ext_form/engine.rb +14 -0
- data/lib/ext_form/helpers/form_helper.rb +222 -0
- data/lib/ext_form/helpers/form_tag_helper.rb +60 -0
- data/lib/ext_form/helpers/tags/auto_complete.rb +25 -0
- data/lib/ext_form/helpers/tags/collection_select.rb +19 -0
- data/lib/ext_form/helpers/tags/dt_picker.rb +27 -0
- data/lib/ext_form/helpers/tags/grouped_collection_select.rb +19 -0
- data/lib/ext_form/helpers/tags.rb +12 -0
- data/lib/ext_form/inputs/auto_complete.rb +11 -0
- data/lib/ext_form/inputs/base_mixin.rb +11 -0
- data/lib/ext_form/inputs/bootstrap_inputs_mixin.rb +13 -0
- data/lib/ext_form/inputs/collection_select.rb +15 -0
- data/lib/ext_form/inputs/dt_picker.rb +20 -0
- data/lib/ext_form/inputs/grouped_collection_select.rb +13 -0
- data/lib/ext_form/inputs.rb +15 -0
- data/lib/ext_form/layouts/base_layout.rb +82 -0
- data/lib/ext_form/layouts/bootstrap_layout.rb +23 -0
- data/lib/ext_form/layouts/default_layout.rb +29 -0
- data/lib/ext_form/layouts.rb +11 -0
- data/lib/ext_form/version.rb +3 -0
- data/lib/ext_form/wrappers/many_mixin.rb +18 -0
- data/lib/ext_form/wrappers/mixin.rb +49 -0
- data/lib/ext_form/wrappers/single_mixin.rb +18 -0
- data/lib/ext_form/wrappers.rb +11 -0
- data/lib/ext_form.rb +52 -0
- data/lib/generators/ext_form/USAGE +3 -0
- data/lib/generators/ext_form/install_generator.rb +113 -0
- data/lib/generators/ext_form/templates/README +15 -0
- data/lib/generators/ext_form/templates/_form.html.erb +12 -0
- data/lib/generators/ext_form/templates/_form.html.haml +12 -0
- data/lib/generators/ext_form/templates/_form.html.slim +12 -0
- data/lib/generators/ext_form/templates/config/initializers/z_ext_form.rb +70 -0
- data/lib/generators/ext_form/templates/config/initializers/z_ext_form_bootstrap.rb +59 -0
- data/lib/generators/ext_form/templates/config/locales/ext_form.en.yml +2 -0
- data/lib/tasks/ext_form_tasks.rake +4 -0
- data/spec/builders/ext_form_builder_bs_spec.rb +78 -0
- data/spec/builders/ext_form_builder_spec.rb +100 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +27 -0
- data/spec/dummy/app/assets/javascripts/order_headers.js +2 -0
- data/spec/dummy/app/assets/javascripts/order_lines.js +2 -0
- data/spec/dummy/app/assets/javascripts/shipments.js +2 -0
- data/spec/dummy/app/assets/stylesheets/application.css.scss +17 -0
- data/spec/dummy/app/assets/stylesheets/order_headers.css +4 -0
- data/spec/dummy/app/assets/stylesheets/order_lines.css +4 -0
- data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
- data/spec/dummy/app/assets/stylesheets/shipments.css +4 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/controllers/order_headers_controller.rb +62 -0
- data/spec/dummy/app/controllers/order_lines_controller.rb +58 -0
- data/spec/dummy/app/controllers/shipments_controller.rb +58 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/helpers/order_headers_helper.rb +2 -0
- data/spec/dummy/app/helpers/order_lines_helper.rb +2 -0
- data/spec/dummy/app/helpers/shipments_helper.rb +2 -0
- data/spec/dummy/app/models/order_header.rb +9 -0
- data/spec/dummy/app/models/order_line.rb +6 -0
- data/spec/dummy/app/models/order_type.rb +2 -0
- data/spec/dummy/app/models/shipment.rb +3 -0
- data/spec/dummy/app/views/layouts/application.html.erb +17 -0
- data/spec/dummy/app/views/order_headers/_form.html.erb +53 -0
- data/spec/dummy/app/views/order_headers/edit.html.erb +3 -0
- data/spec/dummy/app/views/order_headers/index.html.erb +29 -0
- data/spec/dummy/app/views/order_headers/new.html.erb +5 -0
- data/spec/dummy/app/views/order_headers/show.html.erb +14 -0
- data/spec/dummy/app/views/order_lines/_form.html.erb +33 -0
- data/spec/dummy/app/views/order_lines/edit.html.erb +6 -0
- data/spec/dummy/app/views/order_lines/index.html.erb +33 -0
- data/spec/dummy/app/views/order_lines/new.html.erb +5 -0
- data/spec/dummy/app/views/order_lines/show.html.erb +24 -0
- data/spec/dummy/app/views/shipments/_form.html.erb +37 -0
- data/spec/dummy/app/views/shipments/edit.html.erb +6 -0
- data/spec/dummy/app/views/shipments/index.html.erb +35 -0
- data/spec/dummy/app/views/shipments/new.html.erb +5 -0
- data/spec/dummy/app/views/shipments/show.html.erb +29 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +28 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +29 -0
- data/spec/dummy/config/environments/production.rb +80 -0
- data/spec/dummy/config/environments/test.rb +36 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +12 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/simple_form.rb +145 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/initializers/z_ext_form.rb +70 -0
- data/spec/dummy/config/initializers/z_ext_form_bootstrap.rb +59 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/locales/ext_form.en.yml +26 -0
- data/spec/dummy/config/locales/simple_form.en.yml +26 -0
- data/spec/dummy/config/routes.rb +10 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20130822091938_create_order_headers.rb +10 -0
- data/spec/dummy/db/migrate/20130822092035_create_order_lines.rb +12 -0
- data/spec/dummy/db/migrate/20130822092136_create_shipments.rb +13 -0
- data/spec/dummy/db/migrate/20130913025429_add_order_date_to_order_headers.rb +5 -0
- data/spec/dummy/db/migrate/20130913082503_add_bill_to_customer_to_order_headers.rb +7 -0
- data/spec/dummy/db/migrate/20130914101200_create_order_types.rb +9 -0
- data/spec/dummy/db/migrate/20130914101232_add_order_type_id_to_order_headers.rb +5 -0
- data/spec/dummy/db/schema.rb +64 -0
- data/spec/dummy/db/seeds.rb +3 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/lib/templates/erb/scaffold/_form.html.erb +12 -0
- data/spec/dummy/lib/templates/slim/scaffold/_form.html.slim +12 -0
- data/spec/dummy/log/development.log +30851 -0
- data/spec/dummy/log/test.log +8888 -0
- data/spec/dummy/public/404.html +58 -0
- data/spec/dummy/public/422.html +58 -0
- data/spec/dummy/public/500.html +57 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/javascripts/nested_form.js +120 -0
- data/spec/dummy/spec/factories/order_types.rb +7 -0
- data/spec/dummy/tmp/cache/assets/development/sass/0be6a8d566db001f251fcb3d330b625bdcde50b0/select2.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/0f754ef2ba2bade74c446fd0dc8d2c538b2ee4ba/bootstrap-datetimepicker.cssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/43e39f3776203b555edf4427cbeca13a3e80bf4e/application.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/43e39f3776203b555edf4427cbeca13a3e80bf4e/application_bootstrap.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/43e39f3776203b555edf4427cbeca13a3e80bf4e/base.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/95877ca3fb97306427e6a8c3200a77fa726c2979/bootstrap-responsive.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/95877ca3fb97306427e6a8c3200a77fa726c2979/bootstrap.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_accordion.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_alerts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_breadcrumbs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_button-groups.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_buttons.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_carousel.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_close.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_code.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_component-animations.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_dropdowns.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_forms.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_grid.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_hero-unit.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_labels-badges.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_layouts.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_media.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_mixins.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_modals.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_navbar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_navs.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_pager.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_pagination.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_popovers.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_progress-bars.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_reset.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-1200px-min.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-767px-max.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-768px-979px.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-navbar.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_responsive-utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_scaffolding.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_sprites.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_tables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_thumbnails.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_tooltip.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_type.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_utilities.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_variables.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/_wells.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/bootstrap.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/c75ed21fe4fe5a931216dc17f876dea4e6c936a7/responsive.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/d8cdc3e1698ff449e2e9ab35ca24a00a8d724935/application.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/d8cdc3e1698ff449e2e9ab35ca24a00a8d724935/scaffolds.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sass/d8cdc3e1698ff449e2e9ab35ca24a00a8d724935/test_scaflds.css.scssc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/00171108bd75279e653c1ffb5b4650b8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/05029f2e1c68338ac88af8005acab3ca +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/08318fdb5f5b783c22442a6aeb73730e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/08f00d4a1bac197d382c2269a184f9e4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0b6c06f6bcf535567c19f70f7aa5144d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0b9076b70e22dd7976e589018cdf65ca +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0e8461b429e0249b8dc74d457fcc17d3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0f074c0ea10680a3ba979bbd1d2ff756 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0f5877c1fb159c1a5f1602569a0cdde2 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/0f8cf3c40768cf2ab52c613a7efc30cb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/10fcfbe6ebae11a40c8eac41939a1b9a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/126ebaa8ad57e48772c035caac2ed632 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13c6f1c4603d5736407a6b5f7889a056 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13f8355b45d7c46c05177fef3b7f6283 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/157d2eedb817dece09700185cd4101e3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/16039dc737e753516f4399dcd38d6de7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/19699f0bd9bbacb926aa665d057d7dcc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2013f24e3245656ca1e5890649a0b023 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/26bd44751cc9640593dc583d6be8410d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/272f5096d49f011351e9f4780c313741 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/32ef1c9e94a83350bad5e887c416c5b6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/367865b241c60ef0e9a85c9f9910f7d4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/37984c7de5e7d22002a378234035e51c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4201264f7710f91dc1c389a2497eda7d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4843087e4f4577291013564353d9be98 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/490b125495df24b66caa52d70f8aa64d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4c9470e682578ab5fc183f98fae5f42d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/4e81b6b6eb1e1462b1eea2caee6bfcc6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/510da110ae528e2d22533be39ff696c5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/518c73ecd762cbf6d85a3ae693e08d01 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/56401bbafd08927b55572c8ef7e88883 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5865993e4fa54b7f6f0186ebaffff12b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/59f25755df49e4db5915553e3d2ef412 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5a48dae6fe5b78da3082b1347022ee01 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/5f62321f43b55988b6cb95367556d822 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/61fab520b090f94084c9a7ffc402ad3c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/653178c2e0c5d134069e58196f7bf28e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/661c74f15a009d482fdad85f811e6f8e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6668d3ee30c1513097c95bcc0a27696a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/690b40f9a765547b660ac81cbd5ed378 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6bdff36d9dbeb7ae3e6802b482a04668 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6eaa97256ef2d58208ab91c60707acdb +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6fa120c855c745c904828746e82b2b07 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/715840f8887bc1e70ef3cc18b429cbc8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/754b02ea2ed1c85b7756de6452f4aeb7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/764fdaef2f219fafc8db0923a56c23a3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/78fdc1d9add39ed3fdcbf7cae3df4190 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7a7280187e89f6c4256217ea0fe1e787 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/7b2d3e5e25b0901f78fbf8c9cb9570c4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/84eb79ed8e43cf9414e6ecfd38c5a19f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/87172f2d7a412d1fe87d7775d589b883 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/871fe15e38e1cf354ac33b4faf796fd3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/875849c72f053c7a7674e9fd72ee2cd4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/87a55c890eedab0cc5d1e3f2c2b2da4b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/88741eb863751c5d5adb82282f6df5cd +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8ab512c9b33ac90e699b73469d71f061 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8cc360b254f1bff91753f954e7591a9b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/8ec990d84f5dedd35001397078415137 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9181401ef96921b28b49d4ec48261a4d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9409af55392b7f03edb441d5b53b931c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/94e46c0e76c8f392586af76b0f6c6e93 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/968566581a35be861fa4f8fed757dcae +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/96f8ac0ca90b5e46fb770d1695a77b2d +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9b51a99e821d1802733dceac6764d18f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/9d8681a4ce63f327a868f759096673e8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a004f4ca229f6e9e761d2c86226e04f4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a0a671e624f03533a82b1ec899bf3b21 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a0f669003bef02490064a16cfdb916fe +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a411f643e05384fdb860f193e1dbe8f8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a4abc5f3fc1bfe41be3470836766d110 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a82a869a86d5cbcbb101123eb6448f0c +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/a97cd428904e5968d05f7d3a5fd50f85 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/aa87366fe7cd02f1be035665580cf066 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ada9a8c9882e963e6b98cdcaf20af34f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/af326fcf9b4f69ff70d3610d0696b585 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/af5ab48d2f371513fb609f8bdec3ac42 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b245fe00601bf4b4c2bd6ce9286a53dc +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/b51a3679ccee92d6e374deac3359cc69 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/baed877d386dc374496dcd62af36bc5b +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bc6f2f1da483ac27102f9412ee294dbf +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bcca522c6302f184f12fe0e8a7d7e71a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/bd3936370d0f952ada5774e2230046ed +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c04a836e22ec09c7eae6eae9349efee3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c13fc73ceafa45876a901b3e775b83ae +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c2816385f6bc1d4ef24315437e9353d3 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/c4e265ba144f19c1f646f9d8271c0702 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d4c36568a5145e04bfbbefd37fecdde7 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d63d1c956772687b2dd2c9b43533e795 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d75dd624db3682fd4fed243c5f6f2e69 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d7d3659361bd25606f9efaba128bf4c1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/d9fa58e1385bfb03f2ede65c90f36d70 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/da8e37f2c9e3ea8f443def70515d1df0 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/dcff3d1cd16d434b55e09399722e68be +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e18f7bb0b671acf59ad700724547a456 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e459168835a5f27b832ace20874f7c10 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e618b87b000e1c8d606542b2a7b4936f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/e6df0f40358bfc2568038d9cf71859a5 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ebe8c427280f71fed250770f7d5e0af8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/edefa48dfc6b66b08d68e6438d1344b4 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/ee70ec49c833625099b94820cbfaf238 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/eea8d1c182d93d92a52f24a90d5c92af +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/efe3e82d4fe0ca8a3427678a9cd1d070 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f024e5fd86a61ac8399d564f8202bbc8 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f12542794a06e22b1dbd97250d49deb1 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f34759266a45010771006dcbb608d179 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f466a3fe42e17653acb9980dae9be11a +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/f86d0394f2c6bebf4ad490ce4a37d754 +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fd5a31651e4fc8cf4a3199e8db16d53e +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fd71e811fb40f0e16e339622af4c771f +0 -0
- data/spec/dummy/tmp/cache/assets/development/sprockets/fd843e12fcdd9539f8e3d7384a19bb31 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/19699f0bd9bbacb926aa665d057d7dcc +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/371bf96e99717688ed7313a0c53f4212 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/59f25755df49e4db5915553e3d2ef412 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/6fc757c2c8329244ca95d6909865bbc2 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/764fdaef2f219fafc8db0923a56c23a3 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/87172f2d7a412d1fe87d7775d589b883 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/88741eb863751c5d5adb82282f6df5cd +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/96f8ac0ca90b5e46fb770d1695a77b2d +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/a4abc5f3fc1bfe41be3470836766d110 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/af326fcf9b4f69ff70d3610d0696b585 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d63d1c956772687b2dd2c9b43533e795 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/d7d3659361bd25606f9efaba128bf4c1 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f024e5fd86a61ac8399d564f8202bbc8 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/fd5a31651e4fc8cf4a3199e8db16d53e +0 -0
- data/spec/ext_form_spec.rb +12 -0
- data/spec/factories/order_header_factory.rb +22 -0
- data/spec/helpers/dt_picker_spec.rb +66 -0
- data/spec/helpers/dt_picker_tag_spec.rb +65 -0
- data/spec/helpers/form_helper_bs_spec.rb +102 -0
- data/spec/helpers/form_helper_spec.rb +109 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/support/form_helper.rb +21 -0
- 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,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,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
|