spree_frontend 2.4.10 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (378) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE +1 -1
  5. data/README.md +39 -10
  6. data/Rakefile +29 -0
  7. data/{vendor → app}/assets/images/flags/ad.png +0 -0
  8. data/{vendor → app}/assets/images/flags/ae.png +0 -0
  9. data/{vendor → app}/assets/images/flags/af.png +0 -0
  10. data/{vendor → app}/assets/images/flags/ag.png +0 -0
  11. data/{vendor → app}/assets/images/flags/ai.png +0 -0
  12. data/{vendor → app}/assets/images/flags/al.png +0 -0
  13. data/{vendor → app}/assets/images/flags/am.png +0 -0
  14. data/{vendor → app}/assets/images/flags/an.png +0 -0
  15. data/{vendor → app}/assets/images/flags/ao.png +0 -0
  16. data/{vendor → app}/assets/images/flags/ar.png +0 -0
  17. data/{vendor → app}/assets/images/flags/as.png +0 -0
  18. data/{vendor → app}/assets/images/flags/at.png +0 -0
  19. data/{vendor → app}/assets/images/flags/au.png +0 -0
  20. data/{vendor → app}/assets/images/flags/aw.png +0 -0
  21. data/{vendor → app}/assets/images/flags/ax.png +0 -0
  22. data/{vendor → app}/assets/images/flags/az.png +0 -0
  23. data/{vendor → app}/assets/images/flags/ba.png +0 -0
  24. data/{vendor → app}/assets/images/flags/bb.png +0 -0
  25. data/{vendor → app}/assets/images/flags/bd.png +0 -0
  26. data/{vendor → app}/assets/images/flags/be.png +0 -0
  27. data/{vendor → app}/assets/images/flags/bf.png +0 -0
  28. data/{vendor → app}/assets/images/flags/bg.png +0 -0
  29. data/{vendor → app}/assets/images/flags/bh.png +0 -0
  30. data/{vendor → app}/assets/images/flags/bi.png +0 -0
  31. data/{vendor → app}/assets/images/flags/bj.png +0 -0
  32. data/{vendor → app}/assets/images/flags/bm.png +0 -0
  33. data/{vendor → app}/assets/images/flags/bn.png +0 -0
  34. data/{vendor → app}/assets/images/flags/bo.png +0 -0
  35. data/{vendor → app}/assets/images/flags/br.png +0 -0
  36. data/{vendor → app}/assets/images/flags/bs.png +0 -0
  37. data/{vendor → app}/assets/images/flags/bt.png +0 -0
  38. data/{vendor → app}/assets/images/flags/bv.png +0 -0
  39. data/{vendor → app}/assets/images/flags/bw.png +0 -0
  40. data/{vendor → app}/assets/images/flags/by.png +0 -0
  41. data/{vendor → app}/assets/images/flags/bz.png +0 -0
  42. data/{vendor → app}/assets/images/flags/ca.png +0 -0
  43. data/{vendor → app}/assets/images/flags/catalonia.png +0 -0
  44. data/{vendor → app}/assets/images/flags/cc.png +0 -0
  45. data/{vendor → app}/assets/images/flags/cd.png +0 -0
  46. data/{vendor → app}/assets/images/flags/cf.png +0 -0
  47. data/{vendor → app}/assets/images/flags/cg.png +0 -0
  48. data/{vendor → app}/assets/images/flags/ch.png +0 -0
  49. data/{vendor → app}/assets/images/flags/ci.png +0 -0
  50. data/{vendor → app}/assets/images/flags/ck.png +0 -0
  51. data/{vendor → app}/assets/images/flags/cl.png +0 -0
  52. data/{vendor → app}/assets/images/flags/cm.png +0 -0
  53. data/{vendor → app}/assets/images/flags/cn.png +0 -0
  54. data/{vendor → app}/assets/images/flags/co.png +0 -0
  55. data/{vendor → app}/assets/images/flags/cr.png +0 -0
  56. data/{vendor → app}/assets/images/flags/cs.png +0 -0
  57. data/{vendor → app}/assets/images/flags/cu.png +0 -0
  58. data/{vendor → app}/assets/images/flags/cv.png +0 -0
  59. data/{vendor → app}/assets/images/flags/cx.png +0 -0
  60. data/{vendor → app}/assets/images/flags/cy.png +0 -0
  61. data/{vendor → app}/assets/images/flags/cz.png +0 -0
  62. data/{vendor → app}/assets/images/flags/de.png +0 -0
  63. data/{vendor → app}/assets/images/flags/dj.png +0 -0
  64. data/{vendor → app}/assets/images/flags/dk.png +0 -0
  65. data/{vendor → app}/assets/images/flags/dm.png +0 -0
  66. data/{vendor → app}/assets/images/flags/do.png +0 -0
  67. data/{vendor → app}/assets/images/flags/dz.png +0 -0
  68. data/{vendor → app}/assets/images/flags/ec.png +0 -0
  69. data/{vendor → app}/assets/images/flags/ee.png +0 -0
  70. data/{vendor → app}/assets/images/flags/eg.png +0 -0
  71. data/{vendor → app}/assets/images/flags/eh.png +0 -0
  72. data/{vendor → app}/assets/images/flags/england.png +0 -0
  73. data/{vendor → app}/assets/images/flags/er.png +0 -0
  74. data/{vendor → app}/assets/images/flags/es.png +0 -0
  75. data/{vendor → app}/assets/images/flags/et.png +0 -0
  76. data/{vendor → app}/assets/images/flags/europeanunion.png +0 -0
  77. data/{vendor → app}/assets/images/flags/fam.png +0 -0
  78. data/{vendor → app}/assets/images/flags/fi.png +0 -0
  79. data/{vendor → app}/assets/images/flags/fj.png +0 -0
  80. data/{vendor → app}/assets/images/flags/fk.png +0 -0
  81. data/{vendor → app}/assets/images/flags/fm.png +0 -0
  82. data/{vendor → app}/assets/images/flags/fo.png +0 -0
  83. data/{vendor → app}/assets/images/flags/fr.png +0 -0
  84. data/{vendor → app}/assets/images/flags/ga.png +0 -0
  85. data/{vendor → app}/assets/images/flags/gb.png +0 -0
  86. data/{vendor → app}/assets/images/flags/gd.png +0 -0
  87. data/{vendor → app}/assets/images/flags/ge.png +0 -0
  88. data/{vendor → app}/assets/images/flags/gf.png +0 -0
  89. data/{vendor → app}/assets/images/flags/gh.png +0 -0
  90. data/{vendor → app}/assets/images/flags/gi.png +0 -0
  91. data/{vendor → app}/assets/images/flags/gl.png +0 -0
  92. data/{vendor → app}/assets/images/flags/gm.png +0 -0
  93. data/{vendor → app}/assets/images/flags/gn.png +0 -0
  94. data/{vendor → app}/assets/images/flags/gp.png +0 -0
  95. data/{vendor → app}/assets/images/flags/gq.png +0 -0
  96. data/{vendor → app}/assets/images/flags/gr.png +0 -0
  97. data/{vendor → app}/assets/images/flags/gs.png +0 -0
  98. data/{vendor → app}/assets/images/flags/gt.png +0 -0
  99. data/{vendor → app}/assets/images/flags/gu.png +0 -0
  100. data/{vendor → app}/assets/images/flags/gw.png +0 -0
  101. data/{vendor → app}/assets/images/flags/gy.png +0 -0
  102. data/{vendor → app}/assets/images/flags/hk.png +0 -0
  103. data/{vendor → app}/assets/images/flags/hm.png +0 -0
  104. data/{vendor → app}/assets/images/flags/hn.png +0 -0
  105. data/{vendor → app}/assets/images/flags/hr.png +0 -0
  106. data/{vendor → app}/assets/images/flags/ht.png +0 -0
  107. data/{vendor → app}/assets/images/flags/hu.png +0 -0
  108. data/{vendor → app}/assets/images/flags/id.png +0 -0
  109. data/{vendor → app}/assets/images/flags/ie.png +0 -0
  110. data/{vendor → app}/assets/images/flags/il.png +0 -0
  111. data/{vendor → app}/assets/images/flags/in.png +0 -0
  112. data/{vendor → app}/assets/images/flags/io.png +0 -0
  113. data/{vendor → app}/assets/images/flags/iq.png +0 -0
  114. data/{vendor → app}/assets/images/flags/ir.png +0 -0
  115. data/{vendor → app}/assets/images/flags/is.png +0 -0
  116. data/{vendor → app}/assets/images/flags/it.png +0 -0
  117. data/{vendor → app}/assets/images/flags/ja.png +0 -0
  118. data/{vendor → app}/assets/images/flags/jm.png +0 -0
  119. data/{vendor → app}/assets/images/flags/jo.png +0 -0
  120. data/{vendor → app}/assets/images/flags/ke.png +0 -0
  121. data/{vendor → app}/assets/images/flags/kg.png +0 -0
  122. data/{vendor → app}/assets/images/flags/kh.png +0 -0
  123. data/{vendor → app}/assets/images/flags/ki.png +0 -0
  124. data/{vendor → app}/assets/images/flags/km.png +0 -0
  125. data/{vendor → app}/assets/images/flags/kn.png +0 -0
  126. data/{vendor → app}/assets/images/flags/kp.png +0 -0
  127. data/{vendor → app}/assets/images/flags/kr.png +0 -0
  128. data/{vendor → app}/assets/images/flags/kw.png +0 -0
  129. data/{vendor → app}/assets/images/flags/ky.png +0 -0
  130. data/{vendor → app}/assets/images/flags/kz.png +0 -0
  131. data/{vendor → app}/assets/images/flags/la.png +0 -0
  132. data/{vendor → app}/assets/images/flags/lb.png +0 -0
  133. data/{vendor → app}/assets/images/flags/lc.png +0 -0
  134. data/{vendor → app}/assets/images/flags/li.png +0 -0
  135. data/{vendor → app}/assets/images/flags/lk.png +0 -0
  136. data/{vendor → app}/assets/images/flags/lr.png +0 -0
  137. data/{vendor → app}/assets/images/flags/ls.png +0 -0
  138. data/{vendor → app}/assets/images/flags/lt.png +0 -0
  139. data/{vendor → app}/assets/images/flags/lu.png +0 -0
  140. data/{vendor → app}/assets/images/flags/lv.png +0 -0
  141. data/{vendor → app}/assets/images/flags/ly.png +0 -0
  142. data/{vendor → app}/assets/images/flags/ma.png +0 -0
  143. data/{vendor → app}/assets/images/flags/mc.png +0 -0
  144. data/{vendor → app}/assets/images/flags/md.png +0 -0
  145. data/{vendor → app}/assets/images/flags/me.png +0 -0
  146. data/{vendor → app}/assets/images/flags/mg.png +0 -0
  147. data/{vendor → app}/assets/images/flags/mh.png +0 -0
  148. data/{vendor → app}/assets/images/flags/mk.png +0 -0
  149. data/{vendor → app}/assets/images/flags/ml.png +0 -0
  150. data/{vendor → app}/assets/images/flags/mm.png +0 -0
  151. data/{vendor → app}/assets/images/flags/mn.png +0 -0
  152. data/{vendor → app}/assets/images/flags/mo.png +0 -0
  153. data/{vendor → app}/assets/images/flags/mp.png +0 -0
  154. data/{vendor → app}/assets/images/flags/mq.png +0 -0
  155. data/{vendor → app}/assets/images/flags/mr.png +0 -0
  156. data/{vendor → app}/assets/images/flags/ms.png +0 -0
  157. data/{vendor → app}/assets/images/flags/mt.png +0 -0
  158. data/{vendor → app}/assets/images/flags/mu.png +0 -0
  159. data/{vendor → app}/assets/images/flags/mv.png +0 -0
  160. data/{vendor → app}/assets/images/flags/mw.png +0 -0
  161. data/{vendor → app}/assets/images/flags/mx.png +0 -0
  162. data/{vendor → app}/assets/images/flags/my.png +0 -0
  163. data/{vendor → app}/assets/images/flags/mz.png +0 -0
  164. data/{vendor → app}/assets/images/flags/na.png +0 -0
  165. data/{vendor → app}/assets/images/flags/nc.png +0 -0
  166. data/{vendor → app}/assets/images/flags/ne.png +0 -0
  167. data/{vendor → app}/assets/images/flags/nf.png +0 -0
  168. data/{vendor → app}/assets/images/flags/ng.png +0 -0
  169. data/{vendor → app}/assets/images/flags/ni.png +0 -0
  170. data/{vendor → app}/assets/images/flags/nl.png +0 -0
  171. data/{vendor → app}/assets/images/flags/no.png +0 -0
  172. data/{vendor → app}/assets/images/flags/np.png +0 -0
  173. data/{vendor → app}/assets/images/flags/nr.png +0 -0
  174. data/{vendor → app}/assets/images/flags/nu.png +0 -0
  175. data/{vendor → app}/assets/images/flags/nz.png +0 -0
  176. data/{vendor → app}/assets/images/flags/om.png +0 -0
  177. data/{vendor → app}/assets/images/flags/pa.png +0 -0
  178. data/{vendor → app}/assets/images/flags/pe.png +0 -0
  179. data/{vendor → app}/assets/images/flags/pf.png +0 -0
  180. data/{vendor → app}/assets/images/flags/pg.png +0 -0
  181. data/{vendor → app}/assets/images/flags/ph.png +0 -0
  182. data/{vendor → app}/assets/images/flags/pk.png +0 -0
  183. data/{vendor → app}/assets/images/flags/pl.png +0 -0
  184. data/{vendor → app}/assets/images/flags/pm.png +0 -0
  185. data/{vendor → app}/assets/images/flags/pn.png +0 -0
  186. data/{vendor → app}/assets/images/flags/pr.png +0 -0
  187. data/{vendor → app}/assets/images/flags/ps.png +0 -0
  188. data/{vendor → app}/assets/images/flags/pt.png +0 -0
  189. data/{vendor → app}/assets/images/flags/pw.png +0 -0
  190. data/{vendor → app}/assets/images/flags/py.png +0 -0
  191. data/{vendor → app}/assets/images/flags/qa.png +0 -0
  192. data/{vendor → app}/assets/images/flags/re.png +0 -0
  193. data/{vendor → app}/assets/images/flags/ro.png +0 -0
  194. data/{vendor → app}/assets/images/flags/rs.png +0 -0
  195. data/{vendor → app}/assets/images/flags/ru.png +0 -0
  196. data/{vendor → app}/assets/images/flags/rw.png +0 -0
  197. data/{vendor → app}/assets/images/flags/sa.png +0 -0
  198. data/{vendor → app}/assets/images/flags/sb.png +0 -0
  199. data/{vendor → app}/assets/images/flags/sc.png +0 -0
  200. data/{vendor → app}/assets/images/flags/scotland.png +0 -0
  201. data/{vendor → app}/assets/images/flags/sd.png +0 -0
  202. data/{vendor → app}/assets/images/flags/se.png +0 -0
  203. data/{vendor → app}/assets/images/flags/sg.png +0 -0
  204. data/{vendor → app}/assets/images/flags/sh.png +0 -0
  205. data/{vendor → app}/assets/images/flags/si.png +0 -0
  206. data/{vendor → app}/assets/images/flags/sj.png +0 -0
  207. data/{vendor → app}/assets/images/flags/sk.png +0 -0
  208. data/{vendor → app}/assets/images/flags/sl.png +0 -0
  209. data/{vendor → app}/assets/images/flags/sm.png +0 -0
  210. data/{vendor → app}/assets/images/flags/sn.png +0 -0
  211. data/{vendor → app}/assets/images/flags/so.png +0 -0
  212. data/{vendor → app}/assets/images/flags/sr.png +0 -0
  213. data/{vendor → app}/assets/images/flags/st.png +0 -0
  214. data/{vendor → app}/assets/images/flags/sv.png +0 -0
  215. data/{vendor → app}/assets/images/flags/sy.png +0 -0
  216. data/{vendor → app}/assets/images/flags/sz.png +0 -0
  217. data/{vendor → app}/assets/images/flags/tc.png +0 -0
  218. data/{vendor → app}/assets/images/flags/td.png +0 -0
  219. data/{vendor → app}/assets/images/flags/tf.png +0 -0
  220. data/{vendor → app}/assets/images/flags/tg.png +0 -0
  221. data/{vendor → app}/assets/images/flags/th.png +0 -0
  222. data/{vendor → app}/assets/images/flags/tj.png +0 -0
  223. data/{vendor → app}/assets/images/flags/tk.png +0 -0
  224. data/{vendor → app}/assets/images/flags/tl.png +0 -0
  225. data/{vendor → app}/assets/images/flags/tm.png +0 -0
  226. data/{vendor → app}/assets/images/flags/tn.png +0 -0
  227. data/{vendor → app}/assets/images/flags/to.png +0 -0
  228. data/{vendor → app}/assets/images/flags/tr.png +0 -0
  229. data/{vendor → app}/assets/images/flags/tt.png +0 -0
  230. data/{vendor → app}/assets/images/flags/tv.png +0 -0
  231. data/{vendor → app}/assets/images/flags/tw.png +0 -0
  232. data/{vendor → app}/assets/images/flags/tz.png +0 -0
  233. data/{vendor → app}/assets/images/flags/ua.png +0 -0
  234. data/{vendor → app}/assets/images/flags/ug.png +0 -0
  235. data/{vendor → app}/assets/images/flags/um.png +0 -0
  236. data/{vendor → app}/assets/images/flags/us.png +0 -0
  237. data/{vendor → app}/assets/images/flags/uy.png +0 -0
  238. data/{vendor → app}/assets/images/flags/uz.png +0 -0
  239. data/{vendor → app}/assets/images/flags/va.png +0 -0
  240. data/{vendor → app}/assets/images/flags/vc.png +0 -0
  241. data/{vendor → app}/assets/images/flags/ve.png +0 -0
  242. data/{vendor → app}/assets/images/flags/vg.png +0 -0
  243. data/{vendor → app}/assets/images/flags/vi.png +0 -0
  244. data/{vendor → app}/assets/images/flags/vn.png +0 -0
  245. data/{vendor → app}/assets/images/flags/vu.png +0 -0
  246. data/{vendor → app}/assets/images/flags/wales.png +0 -0
  247. data/{vendor → app}/assets/images/flags/wf.png +0 -0
  248. data/{vendor → app}/assets/images/flags/ws.png +0 -0
  249. data/{vendor → app}/assets/images/flags/ye.png +0 -0
  250. data/{vendor → app}/assets/images/flags/yt.png +0 -0
  251. data/{vendor → app}/assets/images/flags/za.png +0 -0
  252. data/{vendor → app}/assets/images/flags/zm.png +0 -0
  253. data/{vendor → app}/assets/images/flags/zw.png +0 -0
  254. data/app/assets/images/logo/spree_50.png +0 -0
  255. data/app/assets/images/spree_header.jpg +0 -0
  256. data/app/assets/javascripts/spree/frontend.js +1 -1
  257. data/app/assets/javascripts/spree/frontend/checkout/payment.js.coffee +2 -2
  258. data/app/assets/stylesheets/spree/frontend.css +4 -4
  259. data/app/assets/stylesheets/spree/frontend/_variables.scss +4 -61
  260. data/app/assets/stylesheets/spree/frontend/frontend_bootstrap.css.scss +102 -0
  261. data/app/controllers/spree/checkout_controller.rb +31 -27
  262. data/app/controllers/spree/orders_controller.rb +20 -8
  263. data/app/controllers/spree/store_controller.rb +2 -3
  264. data/app/controllers/spree/taxons_controller.rb +2 -2
  265. data/app/helpers/spree/frontend_helper.rb +93 -0
  266. data/app/helpers/spree/orders_helper.rb +16 -0
  267. data/app/helpers/spree/store_helper.rb +10 -0
  268. data/app/helpers/spree/taxons_helper.rb +19 -0
  269. data/app/models/spree/frontend_configuration.rb +1 -1
  270. data/app/views/kaminari/twitter-bootstrap-3/_first_page.html.erb +13 -0
  271. data/app/views/kaminari/twitter-bootstrap-3/_gap.html.erb +8 -0
  272. data/app/views/kaminari/twitter-bootstrap-3/_last_page.html.erb +13 -0
  273. data/app/views/kaminari/twitter-bootstrap-3/_next_page.html.erb +13 -0
  274. data/app/views/kaminari/twitter-bootstrap-3/_page.html.erb +12 -0
  275. data/app/views/kaminari/twitter-bootstrap-3/_paginator.html.erb +24 -0
  276. data/app/views/kaminari/twitter-bootstrap-3/_prev_page.html.erb +13 -0
  277. data/app/views/spree/address/_form.html.erb +24 -24
  278. data/app/views/spree/checkout/_address.html.erb +33 -22
  279. data/app/views/spree/checkout/_confirm.html.erb +10 -9
  280. data/app/views/spree/checkout/_delivery.html.erb +24 -20
  281. data/app/views/spree/checkout/_payment.html.erb +17 -18
  282. data/app/views/spree/checkout/_summary.html.erb +2 -2
  283. data/app/views/spree/checkout/edit.html.erb +23 -14
  284. data/app/views/spree/checkout/payment/_gateway.html.erb +31 -28
  285. data/app/views/spree/layouts/spree_application.html.erb +6 -12
  286. data/app/views/spree/orders/_adjustments.html.erb +5 -0
  287. data/app/views/spree/orders/_form.html.erb +8 -8
  288. data/app/views/spree/orders/_line_item.html.erb +6 -6
  289. data/app/views/spree/orders/edit.html.erb +14 -16
  290. data/app/views/spree/orders/show.html.erb +9 -4
  291. data/app/views/spree/products/_cart_form.html.erb +15 -11
  292. data/app/views/spree/products/_promotions.html.erb +1 -1
  293. data/app/views/spree/products/_properties.html.erb +2 -2
  294. data/app/views/spree/products/_taxons.html.erb +4 -4
  295. data/app/views/spree/products/_thumbnails.html.erb +3 -3
  296. data/app/views/spree/products/index.html.erb +13 -9
  297. data/app/views/spree/products/show.html.erb +11 -9
  298. data/app/views/spree/shared/_error_messages.html.erb +12 -0
  299. data/app/views/spree/shared/_filters.html.erb +4 -4
  300. data/app/views/spree/shared/_footer.html.erb +10 -6
  301. data/app/views/spree/shared/_google_add_items.js.erb +11 -0
  302. data/app/views/spree/shared/_google_analytics.js.erb +13 -0
  303. data/app/views/spree/shared/_google_checkout.js.erb +10 -0
  304. data/app/views/spree/shared/_google_purchase.js.erb +13 -0
  305. data/app/views/spree/shared/_head.html.erb +1 -1
  306. data/app/views/spree/shared/_header.html.erb +17 -5
  307. data/app/views/spree/shared/_login.html.erb +19 -0
  308. data/app/views/spree/shared/_login_bar.html.erb +6 -0
  309. data/app/views/spree/shared/_main_nav_bar.html.erb +15 -11
  310. data/app/views/spree/shared/_nav_bar.html.erb +3 -2
  311. data/app/views/spree/shared/_order_details.html.erb +30 -31
  312. data/app/views/spree/shared/_products.html.erb +19 -15
  313. data/app/views/spree/shared/_search.html.erb +8 -4
  314. data/app/views/spree/shared/_sidebar.html.erb +1 -1
  315. data/app/views/spree/shared/_taxonomies.html.erb +1 -1
  316. data/app/views/spree/taxons/show.html.erb +1 -1
  317. data/config/initializers/spree.rb +0 -2
  318. data/lib/spree/frontend.rb +5 -4
  319. data/lib/spree/frontend/engine.rb +2 -2
  320. data/script/rails +9 -0
  321. data/spec/controllers/controller_extension_spec.rb +115 -0
  322. data/spec/controllers/controller_helpers_spec.rb +26 -0
  323. data/spec/controllers/spree/checkout_controller_spec.rb +424 -0
  324. data/spec/controllers/spree/checkout_controller_with_views_spec.rb +36 -0
  325. data/spec/controllers/spree/content_controller_spec.rb +12 -0
  326. data/spec/controllers/spree/current_order_tracking_spec.rb +44 -0
  327. data/spec/controllers/spree/home_controller_spec.rb +27 -0
  328. data/spec/controllers/spree/orders_controller_ability_spec.rb +104 -0
  329. data/spec/controllers/spree/orders_controller_spec.rb +134 -0
  330. data/spec/controllers/spree/orders_controller_transitions_spec.rb +31 -0
  331. data/spec/controllers/spree/products_controller_spec.rb +36 -0
  332. data/spec/controllers/spree/taxons_controller_spec.rb +12 -0
  333. data/spec/features/address_spec.rb +93 -0
  334. data/spec/features/automatic_promotion_adjustments_spec.rb +47 -0
  335. data/spec/features/caching/products_spec.rb +55 -0
  336. data/spec/features/caching/taxons_spec.rb +22 -0
  337. data/spec/features/cart_spec.rb +84 -0
  338. data/spec/features/checkout_spec.rb +515 -0
  339. data/spec/features/checkout_unshippable_spec.rb +34 -0
  340. data/spec/features/coupon_code_spec.rb +87 -0
  341. data/spec/features/currency_spec.rb +18 -0
  342. data/spec/features/free_shipping_promotions_spec.rb +59 -0
  343. data/spec/features/locale_spec.rb +60 -0
  344. data/spec/features/order_spec.rb +74 -0
  345. data/spec/features/page_promotions_spec.rb +36 -0
  346. data/spec/features/products_spec.rb +262 -0
  347. data/spec/features/taxons_spec.rb +147 -0
  348. data/spec/features/template_rendering_spec.rb +19 -0
  349. data/spec/fixtures/thinking-cat.jpg +0 -0
  350. data/spec/helpers/frontend_helper_spec.rb +41 -0
  351. data/spec/helpers/order_helper_spec.rb +12 -0
  352. data/spec/helpers/taxons_helper_spec.rb +17 -0
  353. data/spec/spec_helper.rb +115 -0
  354. data/spec/support/shared_contexts/checkout_setup.rb +9 -0
  355. data/spec/support/shared_contexts/custom_products.rb +25 -0
  356. data/spec/support/shared_contexts/product_prototypes.rb +30 -0
  357. data/spec/views/spree/checkout/_summary_spec.rb +11 -0
  358. data/spree_frontend.gemspec +30 -0
  359. metadata +392 -282
  360. data/app/assets/images/icons/add-to-cart.png +0 -0
  361. data/app/assets/images/icons/checkout.png +0 -0
  362. data/app/assets/images/icons/delete.png +0 -0
  363. data/app/assets/images/icons/update.png +0 -0
  364. data/app/assets/images/spinner.gif +0 -0
  365. data/app/assets/images/spree/frontend/cart.png +0 -0
  366. data/app/assets/images/spree/frontend/select_arrow.gif +0 -0
  367. data/app/assets/stylesheets/spree/frontend/screen.css.scss +0 -1321
  368. data/app/views/spree/shared/_google_analytics.html.erb +0 -40
  369. data/config/initializers/assets.rb +0 -1
  370. data/config/initializers/check_for_orphaned_preferences.rb +0 -9
  371. data/config/initializers/deprecation_checker.rb +0 -7
  372. data/config/initializers/rails_5868.rb +0 -8
  373. data/lib/spree/frontend/preference_rescue.rb +0 -25
  374. data/vendor/assets/images/datepicker/cal.gif +0 -0
  375. data/vendor/assets/images/jquery.formalize/button.png +0 -0
  376. data/vendor/assets/images/jquery.formalize/select_arrow.gif +0 -0
  377. data/vendor/assets/javascripts/jquery.formalize.min.js +0 -1
  378. data/vendor/assets/stylesheets/jquery.formalize.css.erb +0 -363
@@ -1,7 +1,5 @@
1
1
  module Spree
2
2
  class OrdersController < Spree::StoreController
3
- ssl_required :show
4
-
5
3
  before_action :check_authorization
6
4
  rescue_from ActiveRecord::RecordNotFound, :with => :render_404
7
5
  helper 'spree/products', 'spree/orders'
@@ -9,7 +7,6 @@ module Spree
9
7
  respond_to :html
10
8
 
11
9
  before_action :assign_order_with_lock, only: :update
12
- before_action :apply_coupon_code, only: :update
13
10
  skip_before_action :verify_authenticity_token, only: [:populate]
14
11
 
15
12
  def show
@@ -41,14 +38,29 @@ module Spree
41
38
 
42
39
  # Adds a new item to the order (creating a new order if none already exists)
43
40
  def populate
44
- populator = Spree::OrderPopulator.new(current_order(create_order_if_necessary: true), current_currency)
45
- if populator.populate(params[:variant_id], params[:quantity], params[:options])
46
- respond_with(@order) do |format|
47
- format.html { redirect_to cart_path }
41
+ order = current_order(create_order_if_necessary: true)
42
+ variant = Spree::Variant.find(params[:variant_id])
43
+ quantity = params[:quantity].to_i
44
+ options = (params[:options] || {}).merge(currency: current_currency)
45
+
46
+ # 2,147,483,647 is crazy. See issue #2695.
47
+ if quantity.between?(1, 2_147_483_647)
48
+ begin
49
+ order.contents.add(variant, quantity, options)
50
+ rescue ActiveRecord::RecordInvalid => e
51
+ error = e.record.errors.full_messages.join(", ")
48
52
  end
49
53
  else
50
- flash[:error] = populator.errors.full_messages.join(" ")
54
+ error = Spree.t(:please_enter_reasonable_quantity)
55
+ end
56
+
57
+ if error
58
+ flash[:error] = error
51
59
  redirect_back_or_default(spree.root_path)
60
+ else
61
+ respond_with(order) do |format|
62
+ format.html { redirect_to cart_path }
63
+ end
52
64
  end
53
65
  end
54
66
 
@@ -5,11 +5,11 @@ module Spree
5
5
  skip_before_action :set_current_order, only: :cart_link
6
6
 
7
7
  def unauthorized
8
- render 'spree/shared/unauthorized', :layout => Spree::Config[:layout], :status => 401
8
+ render 'spree/shared/unauthorized', layout: Spree::Config[:layout], status: 401
9
9
  end
10
10
 
11
11
  def cart_link
12
- render :partial => 'spree/shared/link_to_cart'
12
+ render partial: 'spree/shared/link_to_cart'
13
13
  fresh_when(simple_current_order)
14
14
  end
15
15
 
@@ -37,4 +37,3 @@ module Spree
37
37
  end
38
38
  end
39
39
  end
40
-
@@ -1,12 +1,12 @@
1
1
  module Spree
2
2
  class TaxonsController < Spree::StoreController
3
- rescue_from ActiveRecord::RecordNotFound, :with => :render_404
3
+ rescue_from ActiveRecord::RecordNotFound, with: :render_404
4
4
  helper 'spree/products'
5
5
 
6
6
  respond_to :html
7
7
 
8
8
  def show
9
- @taxon = Taxon.find_by_permalink!(params[:id])
9
+ @taxon = Taxon.friendly.find(params[:id])
10
10
  return unless @taxon
11
11
 
12
12
  @searcher = build_searcher(params.merge(taxon: @taxon.id, include_images: true))
@@ -0,0 +1,93 @@
1
+ module Spree
2
+ module FrontendHelper
3
+ def body_class
4
+ @body_class ||= content_for?(:sidebar) ? 'two-col' : 'one-col'
5
+ @body_class
6
+ end
7
+
8
+ def breadcrumbs(taxon, separator="&nbsp;")
9
+ return "" if current_page?("/") || taxon.nil?
10
+ separator = raw(separator)
11
+ crumbs = [content_tag(:li, content_tag(:span, link_to(Spree.t(:home), spree.root_path, itemprop: "url") + separator, itemprop: "title"), itemscope: "itemscope", itemtype: "http://data-vocabulary.org/Breadcrumb")]
12
+ if taxon
13
+ crumbs << content_tag(:li, content_tag(:span, link_to(Spree.t(:products), products_path, itemprop: "url") + separator, itemprop: "title"), itemscope: "itemscope", itemtype: "http://data-vocabulary.org/Breadcrumb")
14
+ crumbs << taxon.ancestors.collect { |ancestor| content_tag(:li, content_tag(:span, link_to(ancestor.name , seo_url(ancestor), itemprop: "url") + separator, itemprop: "title"), itemscope: "itemscope", itemtype: "http://data-vocabulary.org/Breadcrumb") } unless taxon.ancestors.empty?
15
+ crumbs << content_tag(:li, content_tag(:span, link_to(taxon.name , seo_url(taxon), itemprop: "url"), itemprop: "title"), class: 'active', itemscope: "itemscope", itemtype: "http://data-vocabulary.org/Breadcrumb")
16
+ else
17
+ crumbs << content_tag(:li, content_tag(:span, Spree.t(:products), itemprop: "title"), class: 'active', itemscope: "itemscope", itemtype: "http://data-vocabulary.org/Breadcrumb")
18
+ end
19
+ crumb_list = content_tag(:ol, raw(crumbs.flatten.map{|li| li.mb_chars}.join), class: 'breadcrumb')
20
+ content_tag(:nav, crumb_list, id: 'breadcrumbs', class: 'col-md-12')
21
+ end
22
+
23
+ def checkout_progress
24
+ states = @order.checkout_steps
25
+ items = states.map do |state|
26
+ text = Spree.t("order_state.#{state}").titleize
27
+
28
+ css_classes = []
29
+ current_index = states.index(@order.state)
30
+ state_index = states.index(state)
31
+
32
+ if state_index < current_index
33
+ css_classes << 'completed'
34
+ text = link_to text, checkout_state_path(state)
35
+ end
36
+
37
+ css_classes << 'next' if state_index == current_index + 1
38
+ css_classes << 'active' if state == @order.state
39
+ css_classes << 'first' if state_index == 0
40
+ css_classes << 'last' if state_index == states.length - 1
41
+ # No more joined classes. IE6 is not a target browser.
42
+ # Hack: Stops <a> being wrapped round previous items twice.
43
+ if state_index < current_index
44
+ content_tag('li', text, class: css_classes.join(' '))
45
+ else
46
+ content_tag('li', content_tag('a', text), class: css_classes.join(' '))
47
+ end
48
+ end
49
+ content_tag('ul', raw(items.join("\n")), class: 'progress-steps nav nav-pills nav-justified', id: "checkout-step-#{@order.state}")
50
+ end
51
+
52
+ def flash_messages(opts = {})
53
+ ignore_types = ["order_completed"].concat(Array(opts[:ignore_types]).map(&:to_s) || [])
54
+
55
+ flash.each do |msg_type, text|
56
+ unless ignore_types.include?(msg_type)
57
+ concat(content_tag :div, text, class: "alert alert-#{msg_type}")
58
+ end
59
+ end
60
+ nil
61
+ end
62
+
63
+ def link_to_cart(text = nil)
64
+ text = text ? h(text) : Spree.t('cart')
65
+ css_class = nil
66
+
67
+ if simple_current_order.nil? or simple_current_order.item_count.zero?
68
+ text = "<span class='glyphicon glyphicon-shopping-cart'></span> #{text}: (#{Spree.t('empty')})"
69
+ css_class = 'empty'
70
+ else
71
+ text = "<span class='glyphicon glyphicon-shopping-cart'></span> #{text}: (#{simple_current_order.item_count}) <span class='amount'>#{simple_current_order.display_total.to_html}</span>"
72
+ css_class = 'full'
73
+ end
74
+
75
+ link_to text.html_safe, spree.cart_path, :class => "cart-info #{css_class}"
76
+ end
77
+
78
+ # helper to determine if its appropriate to show the store menu
79
+ def store_menu?
80
+ %w{thank_you}.exclude? params[:action]
81
+ end
82
+
83
+ def taxons_tree(root_taxon, current_taxon, max_level = 1)
84
+ return '' if max_level < 1 || root_taxon.children.empty?
85
+ content_tag :div, class: 'list-group' do
86
+ root_taxon.children.map do |taxon|
87
+ css_class = (current_taxon && current_taxon.self_and_ancestors.include?(taxon)) ? 'list-group-item active' : 'list-group-item'
88
+ link_to(taxon.name, seo_url(taxon), class: css_class) + taxons_tree(taxon, current_taxon, max_level - 1)
89
+ end.join("\n").html_safe
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,16 @@
1
+ require 'truncate_html'
2
+ require 'app/helpers/truncate_html_helper'
3
+
4
+ module Spree
5
+ module OrdersHelper
6
+ include TruncateHtmlHelper
7
+
8
+ def truncated_product_description(product)
9
+ truncate_html(raw(product.description))
10
+ end
11
+
12
+ def order_just_completed?(order)
13
+ flash[:order_completed] && order.present?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,10 @@
1
+ # Methods added to this helper will be available to all templates in the frontend.
2
+ module Spree
3
+ module StoreHelper
4
+ def cache_key_for_taxons
5
+ max_updated_at = @taxons.maximum(:updated_at).to_i
6
+ parts = [@taxon.try(:id), max_updated_at].compact.join("-")
7
+ "#{I18n.locale}/taxons/#{parts}"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module TaxonsHelper
3
+ # Retrieves the collection of products to display when "previewing" a taxon. This is abstracted into a helper so
4
+ # that we can use configurations as well as make it easier for end users to override this determination. One idea is
5
+ # to show the most popular products for a particular taxon (that is an exercise left to the developer.)
6
+ def taxon_preview(taxon, max=4)
7
+ products = taxon.active_products.select("DISTINCT (spree_products.id), spree_products.*, spree_products_taxons.position").limit(max)
8
+ if (products.size < max)
9
+ products_arel = Spree::Product.arel_table
10
+ taxon.descendants.each do |taxon|
11
+ to_get = max - products.length
12
+ products += taxon.active_products.select("DISTINCT (spree_products.id), spree_products.*, spree_products_taxons.position").where(products_arel[:id].not_in(products.map(&:id))).limit(to_get)
13
+ break if products.size >= max
14
+ end
15
+ end
16
+ products
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  class FrontendConfiguration < Preferences::Configuration
3
- preference :locale, :string, :default => Rails.application.config.i18n.default_locale
3
+ preference :locale, :string, default: Rails.application.config.i18n.default_locale
4
4
  end
5
5
  end
@@ -0,0 +1,13 @@
1
+ <%# Link to the "First" page
2
+ - available local variables
3
+ url: url to the first page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% unless current_page.first? %>
10
+ <li class="first">
11
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
12
+ </li>
13
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%# Non-link tag that stands for skipped pages...
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ num_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ -%>
8
+ <li class="page gap disabled"><a href="#" onclick="return false;"><%= raw(t 'views.pagination.truncate') %></a></li>
@@ -0,0 +1,13 @@
1
+ <%# Link to the "Last" page
2
+ - available local variables
3
+ url: url to the last page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% unless current_page.last? %>
10
+ <li class="last next"><%# "next" class present for border styling in twitter bootstrap %>
11
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
12
+ </li>
13
+ <% end %>
@@ -0,0 +1,13 @@
1
+ <%# Link to the "Next" page
2
+ - available local variables
3
+ url: url to the next page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% unless current_page.last? %>
10
+ <li class="next_page">
11
+ <%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
12
+ </li>
13
+ <% end %>
@@ -0,0 +1,12 @@
1
+ <%# Link showing page number
2
+ - available local variables
3
+ page: a page object for "this" page
4
+ url: url to this page
5
+ current_page: a page object for the currently displayed page
6
+ num_pages: total number of pages
7
+ per_page: number of items to fetch per page
8
+ remote: data-remote
9
+ -%>
10
+ <li class="page<%= ' active' if page.current? %>">
11
+ <%= link_to page, url, opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
12
+ </li>
@@ -0,0 +1,24 @@
1
+ <%# The container tag
2
+ - available local variables
3
+ current_page: a page object for the currently displayed page
4
+ num_pages: total number of pages
5
+ per_page: number of items to fetch per page
6
+ remote: data-remote
7
+ paginator: the paginator that renders the pagination tags inside
8
+ -%>
9
+ <%- pagination_class ||= '' %>
10
+ <%= paginator.render do -%>
11
+ <ul class="pagination <%= pagination_class %>">
12
+ <%= first_page_tag unless current_page.first? %>
13
+ <%= prev_page_tag unless current_page.first? %>
14
+ <% each_page do |page| -%>
15
+ <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
16
+ <%= page_tag page %>
17
+ <% elsif !page.was_truncated? -%>
18
+ <%= gap_tag %>
19
+ <% end -%>
20
+ <% end -%>
21
+ <%= next_page_tag unless current_page.last? %>
22
+ <%= last_page_tag unless current_page.last? %>
23
+ </ul>
24
+ <% end -%>
@@ -0,0 +1,13 @@
1
+ <%# Link to the "Previous" page
2
+ - available local variables
3
+ url: url to the previous page
4
+ current_page: a page object for the currently displayed page
5
+ num_pages: total number of pages
6
+ per_page: number of items to fetch per page
7
+ remote: data-remote
8
+ -%>
9
+ <% unless current_page.first? %>
10
+ <li class="prev">
11
+ <%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
12
+ </li>
13
+ <% end %>
@@ -1,40 +1,40 @@
1
1
  <% address_id = address_type.chars.first %>
2
2
  <div class="inner" data-hook=<%="#{address_type}_inner" %>>
3
- <p class="field" id=<%="#{address_id}firstname" %>>
3
+ <p class="form-group" id=<%="#{address_id}firstname" %>>
4
4
  <%= form.label :firstname, Spree.t(:first_name) %><span class="required">*</span><br />
5
- <%= form.text_field :firstname, :class => 'required' %>
5
+ <%= form.text_field :firstname, :class => 'form-control required' %>
6
6
  </p>
7
- <p class="field" id=<%="#{address_id}lastname" %>>
7
+ <p class="form-group" id=<%="#{address_id}lastname" %>>
8
8
  <%= form.label :lastname, Spree.t(:last_name) %><span class="required">*</span><br />
9
- <%= form.text_field :lastname, :class => 'required' %>
9
+ <%= form.text_field :lastname, :class => 'form-control required' %>
10
10
  </p>
11
11
  <% if Spree::Config[:company] %>
12
- <p class="field" id=<%="#{address_id}company" %>>
12
+ <p class="form-group" id=<%="#{address_id}company" %>>
13
13
  <%= form.label :company, Spree.t(:company) %><br />
14
- <%= form.text_field :company %>
14
+ <%= form.text_field :company, :class => 'form-control' %>
15
15
  </p>
16
16
  <% end %>
17
- <p class="field" id=<%="#{address_id}address1" %>>
17
+ <p class="form-group" id=<%="#{address_id}address1" %>>
18
18
  <%= form.label :address1, Spree.t(:street_address) %><span class="required">*</span><br />
19
- <%= form.text_field :address1, :class => 'required' %>
19
+ <%= form.text_field :address1, :class => 'form-control required' %>
20
20
  </p>
21
- <p class="field" id=<%="#{address_id}address2" %>>
21
+ <p class="form-group" id=<%="#{address_id}address2" %>>
22
22
  <%= form.label :address2, Spree.t(:street_address_2) %><br />
23
- <%= form.text_field :address2 %>
23
+ <%= form.text_field :address2, :class => 'form-control' %>
24
24
  </p>
25
- <p class="field" id=<%="#{address_id}city" %>>
25
+ <p class="form-group" id=<%="#{address_id}city" %>>
26
26
  <%= form.label :city, Spree.t(:city) %><span class="required">*</span><br />
27
- <%= form.text_field :city, :class => 'required' %>
27
+ <%= form.text_field :city, :class => 'form-control required' %>
28
28
  </p>
29
- <p class="field" id=<%="#{address_id}country" %>>
29
+ <p class="form-group" id=<%="#{address_id}country" %>>
30
30
  <%= form.label :country_id, Spree.t(:country) %><span class="required">*</span><br />
31
31
  <span id=<%="#{address_id}country-selection" %>>
32
- <%= form.collection_select :country_id, available_countries, :id, :name, {}, {:class => 'required'} %>
32
+ <%= form.collection_select :country_id, available_countries, :id, :name, {}, {:class => 'form-control required'} %>
33
33
  </span>
34
34
  </p>
35
35
 
36
36
  <% if Spree::Config[:address_requires_state] %>
37
- <p class="field" id=<%="#{address_id}state" %>>
37
+ <p class="form-group" id=<%="#{address_id}state" %>>
38
38
  <% have_states = !address.country.states.empty? %>
39
39
  <%= form.label :state, Spree.t(:state) %><span class='required' id=<%="#{address_id}state-required"%>>*</span><br/>
40
40
 
@@ -42,10 +42,10 @@
42
42
  form.collection_select(:state_id, address.country.states,
43
43
  :id, :name,
44
44
  {:include_blank => true},
45
- {:class => have_states ? 'required' : 'hidden',
45
+ {:class => have_states ? 'form-control required' : 'form-control hidden',
46
46
  :disabled => !have_states}) +
47
47
  form.text_field(:state_name,
48
- :class => !have_states ? 'required' : 'hidden',
48
+ :class => !have_states ? 'form-control required' : 'form-control hidden',
49
49
  :disabled => have_states)
50
50
  ].join.gsub('"', "'").gsub("\n", "")
51
51
  %>
@@ -54,22 +54,22 @@
54
54
  <% end %>
55
55
  </p>
56
56
  <noscript>
57
- <%= form.text_field :state_name, :class => 'required' %>
57
+ <%= form.text_field :state_name, :class => 'form-control required' %>
58
58
  </noscript>
59
59
  <% end %>
60
60
 
61
- <p class="field" id=<%="#{address_id}zipcode" %>>
61
+ <p class="form-group" id=<%="#{address_id}zipcode" %>>
62
62
  <%= form.label :zipcode, Spree.t(:zip) %><% if address.require_zipcode? %><span class="required">*</span><br /><% end %>
63
- <%= form.text_field :zipcode, :class => "#{'required' if address.require_zipcode?}" %>
63
+ <%= form.text_field :zipcode, :class => "form-control #{'required' if address.require_zipcode?}" %>
64
64
  </p>
65
- <p class="field" id=<%="#{address_id}phone" %>>
65
+ <p class="form-group" id=<%="#{address_id}phone" %>>
66
66
  <%= form.label :phone, Spree.t(:phone) %><% if address.require_phone? %><span class="required">*</span><br /><% end %>
67
- <%= form.phone_field :phone, :class => "#{'required' if address.require_phone?}" %>
67
+ <%= form.phone_field :phone, :class => "form-control #{'required' if address.require_phone?}" %>
68
68
  </p>
69
69
  <% if Spree::Config[:alternative_shipping_phone] %>
70
- <p class="field" id=<%="#{address_id}altphone" %>>
70
+ <p class="form-group" id=<%="#{address_id}altphone" %>>
71
71
  <%= form.label :alternative_phone, Spree.t(:alternative_phone) %><br />
72
- <%= form.phone_field :alternative_phone %>
72
+ <%= form.phone_field :alternative_phone, :class => 'form-control' %>
73
73
  </p>
74
74
  <% end %>
75
75
  </div>
@@ -1,28 +1,39 @@
1
- <div class="columns alpha six" data-hook="billing_fieldset_wrapper">
2
- <fieldset id="billing" data-hook>
3
- <%= form.fields_for :bill_address do |bill_form| %>
4
- <legend align="center"><%= Spree.t(:billing_address) %></legend>
5
- <%= render :partial => 'spree/address/form', :locals => { :form => bill_form, :address_type => 'billing', :address => @order.bill_address } %>
6
- <% end %>
7
- </fieldset>
8
- </div>
1
+ <div class="row">
2
+ <div class="col-sm-6" data-hook="billing_fieldset_wrapper">
3
+ <div class="panel panel-default" id="billing" data-hook>
4
+ <%= form.fields_for :bill_address do |bill_form| %>
5
+ <div class="panel-heading">
6
+ <h3 class="panel-title"><%= Spree.t(:billing_address) %></h3>
7
+ </div>
8
+ <div class="panel-body">
9
+ <%= render :partial => 'spree/address/form', :locals => { :form => bill_form, :address_type => 'billing', :address => @order.bill_address } %>
10
+ </div>
11
+ <% end %>
12
+ </div>
13
+ </div>
9
14
 
10
- <div class="columns omega six" data-hook="shipping_fieldset_wrapper">
11
- <fieldset id="shipping" data-hook>
12
- <%= form.fields_for :ship_address do |ship_form| %>
13
- <legend align="center"><%= Spree.t(:shipping_address) %></legend>
14
- <p class="field checkbox" data-hook="use_billing">
15
- <%= check_box_tag 'order[use_billing]', '1', @order.shipping_eq_billing_address? %>
16
- <%= label_tag :order_use_billing, Spree.t(:use_billing_address), :id => 'use_billing' %>
17
- </p>
18
- <%= render :partial => 'spree/address/form', :locals => { :form => ship_form, :address_type => 'shipping', :address => @order.ship_address } %>
19
- <% end %>
20
- </fieldset>
15
+ <div class="col-sm-6" data-hook="shipping_fieldset_wrapper">
16
+ <div class="panel panel-default" id="shipping" data-hook>
17
+ <%= form.fields_for :ship_address do |ship_form| %>
18
+ <div class="panel-heading">
19
+ <h3 class="panel-title"><%= Spree.t(:shipping_address) %></h3>
20
+ </div>
21
+ <div class="panel-body">
22
+ <p class="field checkbox" data-hook="use_billing">
23
+ <%= label_tag :order_use_billing, :id => 'use_billing' do %>
24
+ <%= check_box_tag 'order[use_billing]', '1', @order.shipping_eq_billing_address? %>
25
+ <%= Spree.t(:use_billing_address) %>
26
+ <% end %>
27
+ </p>
28
+ <%= render :partial => 'spree/address/form', :locals => { :form => ship_form, :address_type => 'shipping', :address => @order.ship_address } %>
29
+ </div>
30
+ <% end %>
31
+ </div>
32
+ </div>
21
33
  </div>
22
- <hr class="clear" />
23
34
 
24
- <div class="form-buttons" data-hook="buttons">
25
- <%= submit_tag Spree.t(:save_and_continue), :class => 'continue button primary' %>
35
+ <div class="well text-right form-buttons" data-hook="buttons">
36
+ <%= submit_tag Spree.t(:save_and_continue), :class => 'btn btn-lg btn-success' %>
26
37
  <% if try_spree_current_user %>
27
38
  <span data-hook="save_user_address">
28
39
  &nbsp; &nbsp;