effective_bootstrap 0.0.1

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 (335) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +93 -0
  4. data/app/assets/icons/activity.svg +13 -0
  5. data/app/assets/icons/airplay.svg +14 -0
  6. data/app/assets/icons/alert-circle.svg +15 -0
  7. data/app/assets/icons/alert-octagon.svg +15 -0
  8. data/app/assets/icons/alert-triangle.svg +15 -0
  9. data/app/assets/icons/align-center.svg +16 -0
  10. data/app/assets/icons/align-justify.svg +16 -0
  11. data/app/assets/icons/align-left.svg +16 -0
  12. data/app/assets/icons/align-right.svg +16 -0
  13. data/app/assets/icons/anchor.svg +15 -0
  14. data/app/assets/icons/aperture.svg +19 -0
  15. data/app/assets/icons/arrow-down-circle.svg +15 -0
  16. data/app/assets/icons/arrow-down-left.svg +14 -0
  17. data/app/assets/icons/arrow-down-right.svg +14 -0
  18. data/app/assets/icons/arrow-down.svg +14 -0
  19. data/app/assets/icons/arrow-left-circle.svg +15 -0
  20. data/app/assets/icons/arrow-left.svg +14 -0
  21. data/app/assets/icons/arrow-right-circle.svg +15 -0
  22. data/app/assets/icons/arrow-right.svg +14 -0
  23. data/app/assets/icons/arrow-up-circle.svg +15 -0
  24. data/app/assets/icons/arrow-up-left.svg +14 -0
  25. data/app/assets/icons/arrow-up-right.svg +14 -0
  26. data/app/assets/icons/arrow-up.svg +14 -0
  27. data/app/assets/icons/at-sign.svg +14 -0
  28. data/app/assets/icons/award.svg +14 -0
  29. data/app/assets/icons/bar-chart-2.svg +15 -0
  30. data/app/assets/icons/bar-chart.svg +15 -0
  31. data/app/assets/icons/battery-charging.svg +15 -0
  32. data/app/assets/icons/battery.svg +14 -0
  33. data/app/assets/icons/bell-off.svg +14 -0
  34. data/app/assets/icons/bell.svg +13 -0
  35. data/app/assets/icons/bluetooth.svg +13 -0
  36. data/app/assets/icons/bold.svg +14 -0
  37. data/app/assets/icons/book-open.svg +14 -0
  38. data/app/assets/icons/book.svg +14 -0
  39. data/app/assets/icons/bookmark.svg +13 -0
  40. data/app/assets/icons/box.svg +15 -0
  41. data/app/assets/icons/briefcase.svg +14 -0
  42. data/app/assets/icons/calendar.svg +16 -0
  43. data/app/assets/icons/camera-off.svg +14 -0
  44. data/app/assets/icons/camera.svg +14 -0
  45. data/app/assets/icons/cast.svg +14 -0
  46. data/app/assets/icons/check-circle.svg +14 -0
  47. data/app/assets/icons/check-square.svg +14 -0
  48. data/app/assets/icons/check.svg +13 -0
  49. data/app/assets/icons/chevron-down.svg +13 -0
  50. data/app/assets/icons/chevron-left.svg +13 -0
  51. data/app/assets/icons/chevron-right.svg +13 -0
  52. data/app/assets/icons/chevron-up.svg +13 -0
  53. data/app/assets/icons/chevrons-down.svg +14 -0
  54. data/app/assets/icons/chevrons-left.svg +14 -0
  55. data/app/assets/icons/chevrons-right.svg +14 -0
  56. data/app/assets/icons/chevrons-up.svg +14 -0
  57. data/app/assets/icons/chrome.svg +17 -0
  58. data/app/assets/icons/circle.svg +13 -0
  59. data/app/assets/icons/clipboard.svg +14 -0
  60. data/app/assets/icons/clock.svg +14 -0
  61. data/app/assets/icons/cloud-drizzle.svg +19 -0
  62. data/app/assets/icons/cloud-lightning.svg +14 -0
  63. data/app/assets/icons/cloud-off.svg +14 -0
  64. data/app/assets/icons/cloud-rain.svg +16 -0
  65. data/app/assets/icons/cloud-snow.svg +19 -0
  66. data/app/assets/icons/cloud.svg +13 -0
  67. data/app/assets/icons/code.svg +14 -0
  68. data/app/assets/icons/codepen.svg +17 -0
  69. data/app/assets/icons/command.svg +13 -0
  70. data/app/assets/icons/compass.svg +14 -0
  71. data/app/assets/icons/copy.svg +14 -0
  72. data/app/assets/icons/corner-down-left.svg +14 -0
  73. data/app/assets/icons/corner-down-right.svg +14 -0
  74. data/app/assets/icons/corner-left-down.svg +14 -0
  75. data/app/assets/icons/corner-left-up.svg +14 -0
  76. data/app/assets/icons/corner-right-down.svg +14 -0
  77. data/app/assets/icons/corner-right-up.svg +14 -0
  78. data/app/assets/icons/corner-up-left.svg +14 -0
  79. data/app/assets/icons/corner-up-right.svg +14 -0
  80. data/app/assets/icons/cpu.svg +22 -0
  81. data/app/assets/icons/credit-card.svg +14 -0
  82. data/app/assets/icons/crop.svg +14 -0
  83. data/app/assets/icons/crosshair.svg +17 -0
  84. data/app/assets/icons/database.svg +15 -0
  85. data/app/assets/icons/delete.svg +15 -0
  86. data/app/assets/icons/disc.svg +14 -0
  87. data/app/assets/icons/dollar-sign.svg +14 -0
  88. data/app/assets/icons/download-cloud.svg +15 -0
  89. data/app/assets/icons/download.svg +15 -0
  90. data/app/assets/icons/droplet.svg +13 -0
  91. data/app/assets/icons/edit-2.svg +13 -0
  92. data/app/assets/icons/edit-3.svg +14 -0
  93. data/app/assets/icons/edit.svg +14 -0
  94. data/app/assets/icons/external-link.svg +15 -0
  95. data/app/assets/icons/eye-off.svg +14 -0
  96. data/app/assets/icons/eye.svg +14 -0
  97. data/app/assets/icons/facebook.svg +13 -0
  98. data/app/assets/icons/fast-forward.svg +14 -0
  99. data/app/assets/icons/feather.svg +15 -0
  100. data/app/assets/icons/file-minus.svg +15 -0
  101. data/app/assets/icons/file-plus.svg +16 -0
  102. data/app/assets/icons/file-text.svg +17 -0
  103. data/app/assets/icons/file.svg +14 -0
  104. data/app/assets/icons/film.svg +20 -0
  105. data/app/assets/icons/filter.svg +13 -0
  106. data/app/assets/icons/flag.svg +14 -0
  107. data/app/assets/icons/folder-minus.svg +14 -0
  108. data/app/assets/icons/folder-plus.svg +15 -0
  109. data/app/assets/icons/folder.svg +13 -0
  110. data/app/assets/icons/git-branch.svg +16 -0
  111. data/app/assets/icons/git-commit.svg +15 -0
  112. data/app/assets/icons/git-merge.svg +15 -0
  113. data/app/assets/icons/git-pull-request.svg +16 -0
  114. data/app/assets/icons/github.svg +13 -0
  115. data/app/assets/icons/gitlab.svg +13 -0
  116. data/app/assets/icons/globe.svg +15 -0
  117. data/app/assets/icons/grid.svg +16 -0
  118. data/app/assets/icons/hard-drive.svg +16 -0
  119. data/app/assets/icons/hash.svg +16 -0
  120. data/app/assets/icons/headphones.svg +14 -0
  121. data/app/assets/icons/heart.svg +13 -0
  122. data/app/assets/icons/help-circle.svg +15 -0
  123. data/app/assets/icons/home.svg +14 -0
  124. data/app/assets/icons/image.svg +15 -0
  125. data/app/assets/icons/inbox.svg +14 -0
  126. data/app/assets/icons/info.svg +15 -0
  127. data/app/assets/icons/instagram.svg +15 -0
  128. data/app/assets/icons/italic.svg +15 -0
  129. data/app/assets/icons/layers.svg +15 -0
  130. data/app/assets/icons/layout.svg +15 -0
  131. data/app/assets/icons/life-buoy.svg +19 -0
  132. data/app/assets/icons/link-2.svg +14 -0
  133. data/app/assets/icons/link.svg +14 -0
  134. data/app/assets/icons/linkedin.svg +15 -0
  135. data/app/assets/icons/list.svg +18 -0
  136. data/app/assets/icons/loader.svg +20 -0
  137. data/app/assets/icons/lock.svg +14 -0
  138. data/app/assets/icons/log-in.svg +15 -0
  139. data/app/assets/icons/log-out.svg +15 -0
  140. data/app/assets/icons/mail.svg +14 -0
  141. data/app/assets/icons/map-pin.svg +14 -0
  142. data/app/assets/icons/map.svg +15 -0
  143. data/app/assets/icons/maximize-2.svg +16 -0
  144. data/app/assets/icons/maximize.svg +13 -0
  145. data/app/assets/icons/menu.svg +15 -0
  146. data/app/assets/icons/message-circle.svg +13 -0
  147. data/app/assets/icons/message-square.svg +13 -0
  148. data/app/assets/icons/mic-off.svg +17 -0
  149. data/app/assets/icons/mic.svg +16 -0
  150. data/app/assets/icons/minimize-2.svg +16 -0
  151. data/app/assets/icons/minimize.svg +13 -0
  152. data/app/assets/icons/minus-circle.svg +14 -0
  153. data/app/assets/icons/minus-square.svg +14 -0
  154. data/app/assets/icons/minus.svg +13 -0
  155. data/app/assets/icons/monitor.svg +15 -0
  156. data/app/assets/icons/moon.svg +13 -0
  157. data/app/assets/icons/more-horizontal.svg +15 -0
  158. data/app/assets/icons/more-vertical.svg +15 -0
  159. data/app/assets/icons/move.svg +18 -0
  160. data/app/assets/icons/music.svg +14 -0
  161. data/app/assets/icons/navigation-2.svg +13 -0
  162. data/app/assets/icons/navigation.svg +13 -0
  163. data/app/assets/icons/octagon.svg +13 -0
  164. data/app/assets/icons/package.svg +16 -0
  165. data/app/assets/icons/paperclip.svg +13 -0
  166. data/app/assets/icons/pause-circle.svg +15 -0
  167. data/app/assets/icons/pause.svg +14 -0
  168. data/app/assets/icons/percent.svg +15 -0
  169. data/app/assets/icons/phone-call.svg +13 -0
  170. data/app/assets/icons/phone-forwarded.svg +15 -0
  171. data/app/assets/icons/phone-incoming.svg +15 -0
  172. data/app/assets/icons/phone-missed.svg +15 -0
  173. data/app/assets/icons/phone-off.svg +14 -0
  174. data/app/assets/icons/phone-outgoing.svg +15 -0
  175. data/app/assets/icons/phone.svg +13 -0
  176. data/app/assets/icons/pie-chart.svg +14 -0
  177. data/app/assets/icons/play-circle.svg +14 -0
  178. data/app/assets/icons/play.svg +13 -0
  179. data/app/assets/icons/plus-circle.svg +15 -0
  180. data/app/assets/icons/plus-square.svg +15 -0
  181. data/app/assets/icons/plus.svg +14 -0
  182. data/app/assets/icons/pocket.svg +14 -0
  183. data/app/assets/icons/power.svg +14 -0
  184. data/app/assets/icons/printer.svg +15 -0
  185. data/app/assets/icons/radio.svg +14 -0
  186. data/app/assets/icons/refresh-ccw.svg +15 -0
  187. data/app/assets/icons/refresh-cw.svg +15 -0
  188. data/app/assets/icons/repeat.svg +16 -0
  189. data/app/assets/icons/rewind.svg +14 -0
  190. data/app/assets/icons/rotate-ccw.svg +14 -0
  191. data/app/assets/icons/rotate-cw.svg +14 -0
  192. data/app/assets/icons/rss.svg +15 -0
  193. data/app/assets/icons/save.svg +15 -0
  194. data/app/assets/icons/scissors.svg +17 -0
  195. data/app/assets/icons/search.svg +14 -0
  196. data/app/assets/icons/send.svg +14 -0
  197. data/app/assets/icons/server.svg +16 -0
  198. data/app/assets/icons/settings.svg +14 -0
  199. data/app/assets/icons/share-2.svg +17 -0
  200. data/app/assets/icons/share.svg +15 -0
  201. data/app/assets/icons/shield-off.svg +15 -0
  202. data/app/assets/icons/shield.svg +13 -0
  203. data/app/assets/icons/shopping-bag.svg +15 -0
  204. data/app/assets/icons/shopping-cart.svg +15 -0
  205. data/app/assets/icons/shuffle.svg +17 -0
  206. data/app/assets/icons/sidebar.svg +14 -0
  207. data/app/assets/icons/skip-back.svg +14 -0
  208. data/app/assets/icons/skip-forward.svg +14 -0
  209. data/app/assets/icons/slack.svg +17 -0
  210. data/app/assets/icons/slash.svg +14 -0
  211. data/app/assets/icons/sliders.svg +21 -0
  212. data/app/assets/icons/smartphone.svg +14 -0
  213. data/app/assets/icons/speaker.svg +15 -0
  214. data/app/assets/icons/spinner.svg +1 -0
  215. data/app/assets/icons/square.svg +13 -0
  216. data/app/assets/icons/star.svg +13 -0
  217. data/app/assets/icons/stop-circle.svg +14 -0
  218. data/app/assets/icons/sun.svg +21 -0
  219. data/app/assets/icons/sunrise.svg +20 -0
  220. data/app/assets/icons/sunset.svg +20 -0
  221. data/app/assets/icons/tablet.svg +22 -0
  222. data/app/assets/icons/tag.svg +14 -0
  223. data/app/assets/icons/target.svg +15 -0
  224. data/app/assets/icons/terminal.svg +14 -0
  225. data/app/assets/icons/thermometer.svg +13 -0
  226. data/app/assets/icons/thumbs-down.svg +13 -0
  227. data/app/assets/icons/thumbs-up.svg +13 -0
  228. data/app/assets/icons/toggle-left.svg +14 -0
  229. data/app/assets/icons/toggle-right.svg +14 -0
  230. data/app/assets/icons/trash-2.svg +16 -0
  231. data/app/assets/icons/trash.svg +14 -0
  232. data/app/assets/icons/trending-down.svg +14 -0
  233. data/app/assets/icons/trending-up.svg +14 -0
  234. data/app/assets/icons/triangle.svg +13 -0
  235. data/app/assets/icons/truck.svg +16 -0
  236. data/app/assets/icons/tv.svg +14 -0
  237. data/app/assets/icons/twitter.svg +13 -0
  238. data/app/assets/icons/type.svg +15 -0
  239. data/app/assets/icons/umbrella.svg +13 -0
  240. data/app/assets/icons/underline.svg +14 -0
  241. data/app/assets/icons/unlock.svg +14 -0
  242. data/app/assets/icons/upload-cloud.svg +16 -0
  243. data/app/assets/icons/upload.svg +15 -0
  244. data/app/assets/icons/user-check.svg +15 -0
  245. data/app/assets/icons/user-minus.svg +15 -0
  246. data/app/assets/icons/user-plus.svg +16 -0
  247. data/app/assets/icons/user-x.svg +16 -0
  248. data/app/assets/icons/user.svg +14 -0
  249. data/app/assets/icons/users.svg +16 -0
  250. data/app/assets/icons/video-off.svg +14 -0
  251. data/app/assets/icons/video.svg +14 -0
  252. data/app/assets/icons/voicemail.svg +15 -0
  253. data/app/assets/icons/volume-1.svg +14 -0
  254. data/app/assets/icons/volume-2.svg +14 -0
  255. data/app/assets/icons/volume-x.svg +15 -0
  256. data/app/assets/icons/volume.svg +13 -0
  257. data/app/assets/icons/watch.svg +15 -0
  258. data/app/assets/icons/wifi-off.svg +19 -0
  259. data/app/assets/icons/wifi.svg +16 -0
  260. data/app/assets/icons/wind.svg +13 -0
  261. data/app/assets/icons/x-circle.svg +15 -0
  262. data/app/assets/icons/x-square.svg +15 -0
  263. data/app/assets/icons/x.svg +14 -0
  264. data/app/assets/icons/zap-off.svg +16 -0
  265. data/app/assets/icons/zap.svg +13 -0
  266. data/app/assets/icons/zoom-in.svg +16 -0
  267. data/app/assets/icons/zoom-out.svg +15 -0
  268. data/app/assets/javascripts/effective_bootstrap.js +9 -0
  269. data/app/assets/javascripts/effective_bootstrap/base.js.coffee +37 -0
  270. data/app/assets/javascripts/effective_date/initialize.js.coffee +4 -0
  271. data/app/assets/javascripts/effective_date/input.js +5 -0
  272. data/app/assets/javascripts/effective_datetime/bootstrap-datetimepicker.js +2637 -0
  273. data/app/assets/javascripts/effective_datetime/initialize.js.coffee +4 -0
  274. data/app/assets/javascripts/effective_datetime/input.js +5 -0
  275. data/app/assets/javascripts/effective_datetime/moment.js +4535 -0
  276. data/app/assets/javascripts/effective_datetime/overrides.js.coffee +38 -0
  277. data/app/assets/javascripts/effective_datetime/turbolinks.js.coffee +5 -0
  278. data/app/assets/javascripts/effective_phone/initialize.js.coffee +4 -0
  279. data/app/assets/javascripts/effective_phone/input.js +2 -0
  280. data/app/assets/javascripts/effective_phone/jquery.maskedInput.js +182 -0
  281. data/app/assets/javascripts/effective_price/input.js.coffee +34 -0
  282. data/app/assets/javascripts/effective_select/initialize.js.coffee +45 -0
  283. data/app/assets/javascripts/effective_select/input.js +3 -0
  284. data/app/assets/javascripts/effective_select/overrides.js.coffee +45 -0
  285. data/app/assets/javascripts/effective_select/select2.js +5746 -0
  286. data/app/assets/javascripts/effective_time/initialize.js.coffee +4 -0
  287. data/app/assets/javascripts/effective_time/input.js +5 -0
  288. data/app/assets/stylesheets/effective_bootstrap.scss +8 -0
  289. data/app/assets/stylesheets/effective_bootstrap/base.scss +11 -0
  290. data/app/assets/stylesheets/effective_bootstrap/icons.scss +27 -0
  291. data/app/assets/stylesheets/effective_date/input.scss +1 -0
  292. data/app/assets/stylesheets/effective_datetime/bootstrap-datetimepicker.scss +374 -0
  293. data/app/assets/stylesheets/effective_datetime/input.scss +2 -0
  294. data/app/assets/stylesheets/effective_datetime/overrides.scss +28 -0
  295. data/app/assets/stylesheets/effective_select/bootstrap-theme.css +564 -0
  296. data/app/assets/stylesheets/effective_select/input.scss +3 -0
  297. data/app/assets/stylesheets/effective_select/overrides.scss +92 -0
  298. data/app/assets/stylesheets/effective_select/select2.css +484 -0
  299. data/app/assets/stylesheets/effective_time/input.scss +1 -0
  300. data/app/helpers/effective_bootstrap_helper.rb +52 -0
  301. data/app/helpers/effective_form_builder_helper.rb +23 -0
  302. data/app/helpers/effective_icons_helper.rb +46 -0
  303. data/app/models/effective/access_denied.rb +17 -0
  304. data/app/models/effective/form_builder.rb +100 -0
  305. data/app/models/effective/form_input.rb +319 -0
  306. data/app/models/effective/form_inputs/check_box.rb +62 -0
  307. data/app/models/effective/form_inputs/checks.rb +73 -0
  308. data/app/models/effective/form_inputs/collection_input.rb +144 -0
  309. data/app/models/effective/form_inputs/date_field.rb +22 -0
  310. data/app/models/effective/form_inputs/datetime_field.rb +53 -0
  311. data/app/models/effective/form_inputs/email_field.rb +15 -0
  312. data/app/models/effective/form_inputs/error_field.rb +47 -0
  313. data/app/models/effective/form_inputs/form_group.rb +26 -0
  314. data/app/models/effective/form_inputs/number_field.rb +6 -0
  315. data/app/models/effective/form_inputs/password_field.rb +24 -0
  316. data/app/models/effective/form_inputs/phone_field.rb +34 -0
  317. data/app/models/effective/form_inputs/price_field.rb +37 -0
  318. data/app/models/effective/form_inputs/radios.rb +74 -0
  319. data/app/models/effective/form_inputs/select.rb +87 -0
  320. data/app/models/effective/form_inputs/static_field.rb +20 -0
  321. data/app/models/effective/form_inputs/submit.rb +42 -0
  322. data/app/models/effective/form_inputs/text_area.rb +11 -0
  323. data/app/models/effective/form_inputs/text_field.rb +6 -0
  324. data/app/models/effective/form_inputs/time_field.rb +22 -0
  325. data/app/models/effective/form_inputs/url_field.rb +15 -0
  326. data/app/views/effective/style_guide/__fields.html.haml +42 -0
  327. data/app/views/effective/style_guide/__inline_fields.html.haml +4 -0
  328. data/app/views/effective/style_guide/_effective_form_with.html.haml +23 -0
  329. data/app/views/effective/style_guide/_feather_icons.html.haml +9 -0
  330. data/config/effective_bootstrap.rb +24 -0
  331. data/lib/effective_bootstrap.rb +31 -0
  332. data/lib/effective_bootstrap/engine.rb +11 -0
  333. data/lib/effective_bootstrap/version.rb +3 -0
  334. data/lib/generators/effective_bootstrap/install_generator.rb +14 -0
  335. metadata +419 -0
@@ -0,0 +1,6 @@
1
+ module Effective
2
+ module FormInputs
3
+ class NumberField < Effective::FormInput
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,24 @@
1
+ module Effective
2
+ module FormInputs
3
+ class PasswordField < Effective::FormInput
4
+
5
+ def input_html_options
6
+ { class: 'form-control' }
7
+ end
8
+
9
+ def input_group_options
10
+ { input_group: { class: 'input-group' }, prepend: content_tag(:span, icon('lock'), class: 'input-group-text') }
11
+ end
12
+
13
+ def feedback_options
14
+ case layout
15
+ when :inline
16
+ false
17
+ else
18
+ { valid: { class: 'valid-feedback' }, invalid: { class: 'invalid-feedback' }, reset: true }
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,34 @@
1
+ module Effective
2
+ module FormInputs
3
+ class PhoneField < Effective::FormInput
4
+
5
+ DEFAULT_TEL_MASK = '(999) 999-9999? x99999'
6
+ DEFAULT_CELL_MASK = '(999) 999-9999'
7
+
8
+ def input_html_options
9
+ { class: 'form-control effective_phone', placeholder: '(555) 555-5555' }
10
+ end
11
+
12
+ def input_js_options
13
+ { mask: ((cell? || fax?) ? DEFAULT_CELL_MASK : DEFAULT_TEL_MASK), placeholder: '_' }
14
+ end
15
+
16
+ def input_group_options
17
+ { input_group: { class: 'input-group' }, prepend: content_tag(:span, icon('phone'), class: 'input-group-text') }
18
+ end
19
+
20
+ private
21
+
22
+ def fax?
23
+ return @fax unless @fax.nil?
24
+ @fax = options.key?(:fax) ? options.delete(:fax) : name.to_s.include?('fax')
25
+ end
26
+
27
+ def cell?
28
+ return @cell unless @cell.nil?
29
+ @cell = options.key?(:cell) ? options.delete(:cell) : name.to_s.include?('cell')
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ module Effective
2
+ module FormInputs
3
+ class PriceField < Effective::FormInput
4
+
5
+ def build_input(&block)
6
+ @builder.hidden_field(name, value: price, id: tag_id + '_value_as_integer') +
7
+ @template.text_field_tag(name, @template.number_to_currency(currency, unit: ''), options[:input].merge(id: tag_id, name: nil))
8
+ end
9
+
10
+ def input_group_options
11
+ { input_group: { class: 'input-group' }, prepend: content_tag(:span, icon('dollar-sign'), class: 'input-group-text') }
12
+ end
13
+
14
+ def input_html_options
15
+ { class: 'form-control effective_price', maxlength: 14, autocomplete: 'off', 'data-include-blank': include_blank? }
16
+ end
17
+
18
+ private
19
+
20
+ def price
21
+ return (include_blank? ? 0 : nil) unless value
22
+ value.kind_of?(Integer) ? value : ('%.2f' % (val / 100.0))
23
+ end
24
+
25
+ def currency
26
+ return (include_blank? ? 0.00 : nil) unless value
27
+ value.kind_of?(Integer) ? ('%.2f' % (val / 100.0)) : value
28
+ end
29
+
30
+ def include_blank? # default false
31
+ return @include_blank unless @include_blank.nil?
32
+ @include_blank = (options.delete(:include_blank) || false)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,74 @@
1
+ # http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select
2
+ module Effective
3
+ module FormInputs
4
+ class Radios < CollectionInput
5
+
6
+ def build_input(&block)
7
+ @builder.collection_radio_buttons(name, options_collection, value_method, label_method, collection_options, item_input_options) { |builder| build_item(builder) }
8
+ end
9
+
10
+ def build_wrapper(&block)
11
+ if layout == :horizontal
12
+ content_tag(:fieldset, content_tag(:div, yield, class: 'row'), options[:wrapper])
13
+ else
14
+ content_tag(:fieldset, yield, options[:wrapper])
15
+ end
16
+ end
17
+
18
+ def wrapper_options
19
+ { class: "form-group #{tag_id}" }
20
+ end
21
+
22
+ def feedback_options
23
+ return false if layout == :inline
24
+
25
+ {
26
+ valid: { class: 'valid-feedback', style: ('display: block;' if has_error? && !has_error?(name)) }.compact,
27
+ invalid: { class: 'invalid-feedback', style: ('display: block;' if has_error?(name)) }.compact
28
+ }
29
+ end
30
+
31
+ def input_html_options
32
+ if custom?
33
+ { class: 'custom-control-input' }
34
+ else
35
+ { class: 'form-check-input' }
36
+ end
37
+ end
38
+
39
+ def build_label
40
+ return BLANK if options[:label] == false
41
+ return BLANK if name.kind_of?(NilClass)
42
+
43
+ text = (options[:label].delete(:text) || (object.class.human_attribute_name(name) if object) || BLANK).html_safe
44
+
45
+ content_tag((inline? ? :label : :legend), text, options[:label])
46
+ end
47
+
48
+ def build_item(builder)
49
+ build_item_wrap { builder.radio_button + builder.label(item_label_options) }
50
+ end
51
+
52
+ def build_item_wrap(&block)
53
+ if custom?
54
+ content_tag(:div, yield, class: 'custom-control custom-radio ' + (inline? ? 'custom-control-inline' : 'form-group'))
55
+ else
56
+ content_tag(:div, yield, class: 'form-check' + (inline? ? ' form-check-inline' : ''))
57
+ end
58
+ end
59
+
60
+ def item_input_options
61
+ options[:input].except(:inline, :custom)
62
+ end
63
+
64
+ def item_label_options
65
+ if custom?
66
+ { class: 'custom-control-label' }
67
+ else
68
+ { class: 'form-check-label' }
69
+ end
70
+ end
71
+
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,87 @@
1
+ # http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select
2
+ # select(object, method, choices = nil, options = {}, html_options = {}, &block)
3
+ # ActionView::Helpers::FormBuilder.instance_method(:check_box).bind(self).call(m, opts, v)`
4
+
5
+ module Effective
6
+ module FormInputs
7
+ class Select < CollectionInput
8
+
9
+ def build_input(&block)
10
+ html = if grouped? && polymorphic?
11
+ @builder.grouped_collection_select(polymorphic_id_method, options_collection, group_method, group_label_method, option_key_method, option_value_method, collection_options, html_options)
12
+ elsif grouped?
13
+ @builder.grouped_collection_select(name, options_collection, group_method, group_label_method, option_key_method, option_value_method, collection_options, html_options)
14
+ else
15
+ @builder.collection_select(name, options_collection, value_method, label_method, collection_options, html_options)
16
+ end
17
+
18
+ if polymorphic?
19
+ html += @builder.hidden_field(polymorphic_type_method, value: polymorphic_type_value)
20
+ html += @builder.hidden_field(polymorphic_id_method, value: polymorphic_id_value)
21
+ end
22
+
23
+ if single_selected?
24
+ html.gsub!('selected="selected"', '') if html.sub!('selected="selected"', "selected='selected'")
25
+ end
26
+
27
+ html.html_safe
28
+ end
29
+
30
+ def input_js_options
31
+ opts = {
32
+ theme: 'bootstrap',
33
+ minimumResultsForSearch: 6,
34
+ width: 'style',
35
+ placeholder: (input_html_options.delete(:placeholder) || 'Please choose'),
36
+ allowClear: !multiple?,
37
+ tokenSeparators: ([',', ';', '\n', '\t'] if tags?),
38
+ tags: (true if tags?),
39
+ template: js_template,
40
+ containerClass: ('hide-disabled' if hide_disabled?),
41
+ dropdownClass: ('hide-disabled' if hide_disabled?),
42
+ }.compact
43
+ end
44
+
45
+ def input_html_options
46
+ classes = [
47
+ 'effective_select',
48
+ 'form-control',
49
+ ('polymorphic' if polymorphic?),
50
+ ('grouped' if grouped?),
51
+ ('hide-disabled' if hide_disabled?),
52
+ ('tags-input' if tags?),
53
+ ].compact.join(' ')
54
+
55
+ { class: classes, multiple: (true if multiple?), include_blank: !multiple? }.compact
56
+ end
57
+
58
+ private
59
+
60
+ def multiple?
61
+ return @multiple unless @multiple.nil?
62
+ @multiple = (options.delete(:multiple) || false) || tags?
63
+ end
64
+
65
+ def tags?
66
+ return @tags unless @tags.nil?
67
+ @tags = (options.delete(:tags) || false)
68
+ end
69
+
70
+ def hide_disabled?
71
+ return @hide_disabled unless @hide_disabled.nil?
72
+ @hide_disabled = (options.delete(:hide_disabled) || false)
73
+ end
74
+
75
+ def single_selected?
76
+ return @single_selected unless @single_selected.nil?
77
+ @single_selected = (options.delete(:single_selected) || false)
78
+ end
79
+
80
+ def js_template
81
+ return @js_template unless @js_template.nil?
82
+ @js_template = options.delete(:template)
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,20 @@
1
+ module Effective
2
+ module FormInputs
3
+ class StaticField < Effective::FormInput
4
+
5
+ def input_html_options
6
+ { class: 'form-control-plaintext', readonly: false }
7
+ end
8
+
9
+ def feedback_options
10
+ false
11
+ end
12
+
13
+ def build_input(&block)
14
+ content = block_given? ? capture(&block) : (options[:input].delete(:value) || value)
15
+ content_tag(:p, content, options[:input].except(:readonly, :required, :value).merge(id: tag_id))
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,42 @@
1
+ module Effective
2
+ module FormInputs
3
+ class Submit < Effective::FormInput
4
+
5
+ def build_input(&block)
6
+ content_tag(:button, name, options[:input])
7
+ end
8
+
9
+ def wrapper_options
10
+ if layout == :horizontal
11
+ { class: 'form-group row form-actions'}
12
+ else
13
+ { class: 'form-group form-actions'}
14
+ end
15
+ end
16
+
17
+ def input_html_options
18
+ { class: 'btn btn-primary', type: 'submit', name: 'commit', value: name }
19
+ end
20
+
21
+ def label_options
22
+ false
23
+ end
24
+
25
+ def feedback_options
26
+ case layout
27
+ when :inline
28
+ false
29
+ else
30
+ {
31
+ valid: { class: 'valid-feedback', text: 'Looks good! Submitting...' },
32
+ invalid: {
33
+ class: 'invalid-feedback',
34
+ text: 'one or more errors are present. please fix the errors above and try again.'
35
+ }
36
+ }
37
+ end
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ module Effective
2
+ module FormInputs
3
+ class TextArea < Effective::FormInput
4
+
5
+ def input_html_options
6
+ { class: 'form-control', rows: 3 }
7
+ end
8
+
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ module Effective
2
+ module FormInputs
3
+ class TextField < Effective::FormInput
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,22 @@
1
+ module Effective
2
+ module FormInputs
3
+ class TimeField < DatetimeField
4
+
5
+ def input_html_options
6
+ {
7
+ class: ['form-control', 'effective_date_time_picker', 'effective_time', ('not-date-linked' if not_date_linked?)].compact.join(' '),
8
+ pattern: '\d{2}:\d{2}'
9
+ }
10
+ end
11
+
12
+ def input_js_options
13
+ { format: 'HH:mm', showTodayButton: true, showClear: true, useCurrent: 'hour', disabledDates: disabled_dates.presence }.compact
14
+ end
15
+
16
+ def input_group_options
17
+ { input_group: { class: 'input-group' }, prepend: content_tag(:span, icon('clock'), class: 'input-group-text') }
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ module Effective
2
+ module FormInputs
3
+ class UrlField < Effective::FormInput
4
+
5
+ def input_html_options
6
+ { class: 'form-control', placeholder: 'https://www.example.com' }
7
+ end
8
+
9
+ def input_group_options
10
+ { input_group: { class: 'input-group' }, prepend: content_tag(:span, icon('link'), class: 'input-group-text') }
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,42 @@
1
+ = f.text_field :title, hint: 'This is a text_field'
2
+ = f.email_field :email, hint: 'This is an email_field'
3
+ = f.check_box :archived, hint: 'This is a check_box', id: "archived_#{uid}"
4
+
5
+ = f.datetime_field :start_at, hint: 'This is a linked datetime_field'
6
+ = f.datetime_field :end_at, hint: 'This is a linked datetime_field'
7
+ = f.date_field :date, hint: 'This is a date_field'
8
+ = f.time_field :time, hint: 'This is a time_field'
9
+
10
+ = f.check_box :option1, inline: true, id: "option1_#{uid}"
11
+ = f.check_box :option2, inline: true, id: "option2_#{uid}"
12
+ = f.check_box :option3, inline: true, id: "option3_#{uid}"
13
+
14
+ = f.number_field :number, hint: 'This is a number_field'
15
+ = f.password_field :password, hint: 'This is a password_field'
16
+
17
+ = f.phone_field :phone, hint: 'This is a phone_field'
18
+ = f.phone_field :fax, hint: 'This is a phone_field'
19
+ = f.phone_field :cell, hint: 'This is a phone_field'
20
+
21
+ = f.price_field :price, hint: 'This is a price_field'
22
+
23
+ = f.static_field :static_text, hint: 'This is a static_field'
24
+ = f.static_field :static_text, hint: 'This is a static_field built from a block' do
25
+ #{content_tag(:strong, 'This is rich text')} built from #{content_tag(:em, 'normal haml')} block
26
+
27
+ = f.text_area :details, hint: 'This is a text_area'
28
+ = f.url_field :url, hint: 'This is a url_field'
29
+
30
+ = f.select :food, EffectiveStyleGuide.foods, hint: 'This is a select'
31
+ = f.select :color, EffectiveStyleGuide.colors, tags: true, hint: 'This is a select with tags: true'
32
+ = f.select :color, EffectiveStyleGuide.grouped_colors, grouped: true, multiple: true, selected: ['red', 'yellow'], hint: 'This is a select with grouped: true, multiple: true'
33
+
34
+ = f.checks :food, EffectiveStyleGuide.foods, hint: 'This is a checks'
35
+ = f.checks :drink, EffectiveStyleGuide.drinks, custom: false, hint: 'This is a checks with custom: false'
36
+ = f.checks :color, EffectiveStyleGuide.colors, inline: true, hint: 'This is a checks with inline: true'
37
+
38
+ = f.radios "food_#{uid}", EffectiveStyleGuide.foods, hint: 'This is a radios'
39
+ = f.radios "drink_#{uid}", EffectiveStyleGuide.drinks, custom: false, hint: 'This is a radios with custom: false'
40
+ = f.radios "color_#{uid}", EffectiveStyleGuide.colors, inline: true, hint: 'This is a radios with inline: true'
41
+
42
+ = f.submit
@@ -0,0 +1,4 @@
1
+ = f.text_field :title
2
+ = f.email_field :email
3
+ = f.check_box :archived, id: "archived_#{uid}"
4
+ = f.submit 'Save and Continue'