goca-spree-frontend 3.1.14.rails.5.0

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 (424) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +6 -0
  3. data/LICENSE +26 -0
  4. data/README.md +50 -0
  5. data/Rakefile +15 -0
  6. data/app/assets/images/credit_cards/amex_cid.gif +0 -0
  7. data/app/assets/images/credit_cards/credit_card.gif +0 -0
  8. data/app/assets/images/credit_cards/discover_cid.gif +0 -0
  9. data/app/assets/images/credit_cards/icons/american_express.png +0 -0
  10. data/app/assets/images/credit_cards/icons/cirrus.png +0 -0
  11. data/app/assets/images/credit_cards/icons/delta.png +0 -0
  12. data/app/assets/images/credit_cards/icons/diners_club.png +0 -0
  13. data/app/assets/images/credit_cards/icons/directdebit.png +0 -0
  14. data/app/assets/images/credit_cards/icons/discover.png +0 -0
  15. data/app/assets/images/credit_cards/icons/egold.png +0 -0
  16. data/app/assets/images/credit_cards/icons/maestro.png +0 -0
  17. data/app/assets/images/credit_cards/icons/master.png +0 -0
  18. data/app/assets/images/credit_cards/icons/paypal.png +0 -0
  19. data/app/assets/images/credit_cards/icons/solo.png +0 -0
  20. data/app/assets/images/credit_cards/icons/switch.png +0 -0
  21. data/app/assets/images/credit_cards/icons/visa.png +0 -0
  22. data/app/assets/images/credit_cards/icons/visaelectron.png +0 -0
  23. data/app/assets/images/credit_cards/icons/westernunion.png +0 -0
  24. data/app/assets/images/credit_cards/icons/wirecard.png +0 -0
  25. data/app/assets/images/credit_cards/icons/worldpay.png +0 -0
  26. data/app/assets/images/credit_cards/master_cid.jpg +0 -0
  27. data/app/assets/images/credit_cards/visa_cid.gif +0 -0
  28. data/app/assets/images/favicon.ico +0 -0
  29. data/app/assets/images/flags/ad.png +0 -0
  30. data/app/assets/images/flags/ae.png +0 -0
  31. data/app/assets/images/flags/af.png +0 -0
  32. data/app/assets/images/flags/ag.png +0 -0
  33. data/app/assets/images/flags/ai.png +0 -0
  34. data/app/assets/images/flags/al.png +0 -0
  35. data/app/assets/images/flags/am.png +0 -0
  36. data/app/assets/images/flags/an.png +0 -0
  37. data/app/assets/images/flags/ao.png +0 -0
  38. data/app/assets/images/flags/ar.png +0 -0
  39. data/app/assets/images/flags/as.png +0 -0
  40. data/app/assets/images/flags/at.png +0 -0
  41. data/app/assets/images/flags/au.png +0 -0
  42. data/app/assets/images/flags/aw.png +0 -0
  43. data/app/assets/images/flags/ax.png +0 -0
  44. data/app/assets/images/flags/az.png +0 -0
  45. data/app/assets/images/flags/ba.png +0 -0
  46. data/app/assets/images/flags/bb.png +0 -0
  47. data/app/assets/images/flags/bd.png +0 -0
  48. data/app/assets/images/flags/be.png +0 -0
  49. data/app/assets/images/flags/bf.png +0 -0
  50. data/app/assets/images/flags/bg.png +0 -0
  51. data/app/assets/images/flags/bh.png +0 -0
  52. data/app/assets/images/flags/bi.png +0 -0
  53. data/app/assets/images/flags/bj.png +0 -0
  54. data/app/assets/images/flags/bm.png +0 -0
  55. data/app/assets/images/flags/bn.png +0 -0
  56. data/app/assets/images/flags/bo.png +0 -0
  57. data/app/assets/images/flags/br.png +0 -0
  58. data/app/assets/images/flags/bs.png +0 -0
  59. data/app/assets/images/flags/bt.png +0 -0
  60. data/app/assets/images/flags/bv.png +0 -0
  61. data/app/assets/images/flags/bw.png +0 -0
  62. data/app/assets/images/flags/by.png +0 -0
  63. data/app/assets/images/flags/bz.png +0 -0
  64. data/app/assets/images/flags/ca.png +0 -0
  65. data/app/assets/images/flags/catalonia.png +0 -0
  66. data/app/assets/images/flags/cc.png +0 -0
  67. data/app/assets/images/flags/cd.png +0 -0
  68. data/app/assets/images/flags/cf.png +0 -0
  69. data/app/assets/images/flags/cg.png +0 -0
  70. data/app/assets/images/flags/ch.png +0 -0
  71. data/app/assets/images/flags/ci.png +0 -0
  72. data/app/assets/images/flags/ck.png +0 -0
  73. data/app/assets/images/flags/cl.png +0 -0
  74. data/app/assets/images/flags/cm.png +0 -0
  75. data/app/assets/images/flags/cn.png +0 -0
  76. data/app/assets/images/flags/co.png +0 -0
  77. data/app/assets/images/flags/cr.png +0 -0
  78. data/app/assets/images/flags/cs.png +0 -0
  79. data/app/assets/images/flags/cu.png +0 -0
  80. data/app/assets/images/flags/cv.png +0 -0
  81. data/app/assets/images/flags/cx.png +0 -0
  82. data/app/assets/images/flags/cy.png +0 -0
  83. data/app/assets/images/flags/cz.png +0 -0
  84. data/app/assets/images/flags/de.png +0 -0
  85. data/app/assets/images/flags/dj.png +0 -0
  86. data/app/assets/images/flags/dk.png +0 -0
  87. data/app/assets/images/flags/dm.png +0 -0
  88. data/app/assets/images/flags/do.png +0 -0
  89. data/app/assets/images/flags/dz.png +0 -0
  90. data/app/assets/images/flags/ec.png +0 -0
  91. data/app/assets/images/flags/ee.png +0 -0
  92. data/app/assets/images/flags/eg.png +0 -0
  93. data/app/assets/images/flags/eh.png +0 -0
  94. data/app/assets/images/flags/england.png +0 -0
  95. data/app/assets/images/flags/er.png +0 -0
  96. data/app/assets/images/flags/es.png +0 -0
  97. data/app/assets/images/flags/et.png +0 -0
  98. data/app/assets/images/flags/europeanunion.png +0 -0
  99. data/app/assets/images/flags/fam.png +0 -0
  100. data/app/assets/images/flags/fi.png +0 -0
  101. data/app/assets/images/flags/fj.png +0 -0
  102. data/app/assets/images/flags/fk.png +0 -0
  103. data/app/assets/images/flags/fm.png +0 -0
  104. data/app/assets/images/flags/fo.png +0 -0
  105. data/app/assets/images/flags/fr.png +0 -0
  106. data/app/assets/images/flags/ga.png +0 -0
  107. data/app/assets/images/flags/gb.png +0 -0
  108. data/app/assets/images/flags/gd.png +0 -0
  109. data/app/assets/images/flags/ge.png +0 -0
  110. data/app/assets/images/flags/gf.png +0 -0
  111. data/app/assets/images/flags/gh.png +0 -0
  112. data/app/assets/images/flags/gi.png +0 -0
  113. data/app/assets/images/flags/gl.png +0 -0
  114. data/app/assets/images/flags/gm.png +0 -0
  115. data/app/assets/images/flags/gn.png +0 -0
  116. data/app/assets/images/flags/gp.png +0 -0
  117. data/app/assets/images/flags/gq.png +0 -0
  118. data/app/assets/images/flags/gr.png +0 -0
  119. data/app/assets/images/flags/gs.png +0 -0
  120. data/app/assets/images/flags/gt.png +0 -0
  121. data/app/assets/images/flags/gu.png +0 -0
  122. data/app/assets/images/flags/gw.png +0 -0
  123. data/app/assets/images/flags/gy.png +0 -0
  124. data/app/assets/images/flags/hk.png +0 -0
  125. data/app/assets/images/flags/hm.png +0 -0
  126. data/app/assets/images/flags/hn.png +0 -0
  127. data/app/assets/images/flags/hr.png +0 -0
  128. data/app/assets/images/flags/ht.png +0 -0
  129. data/app/assets/images/flags/hu.png +0 -0
  130. data/app/assets/images/flags/id.png +0 -0
  131. data/app/assets/images/flags/ie.png +0 -0
  132. data/app/assets/images/flags/il.png +0 -0
  133. data/app/assets/images/flags/in.png +0 -0
  134. data/app/assets/images/flags/io.png +0 -0
  135. data/app/assets/images/flags/iq.png +0 -0
  136. data/app/assets/images/flags/ir.png +0 -0
  137. data/app/assets/images/flags/is.png +0 -0
  138. data/app/assets/images/flags/it.png +0 -0
  139. data/app/assets/images/flags/ja.png +0 -0
  140. data/app/assets/images/flags/jm.png +0 -0
  141. data/app/assets/images/flags/jo.png +0 -0
  142. data/app/assets/images/flags/ke.png +0 -0
  143. data/app/assets/images/flags/kg.png +0 -0
  144. data/app/assets/images/flags/kh.png +0 -0
  145. data/app/assets/images/flags/ki.png +0 -0
  146. data/app/assets/images/flags/km.png +0 -0
  147. data/app/assets/images/flags/kn.png +0 -0
  148. data/app/assets/images/flags/kp.png +0 -0
  149. data/app/assets/images/flags/kr.png +0 -0
  150. data/app/assets/images/flags/kw.png +0 -0
  151. data/app/assets/images/flags/ky.png +0 -0
  152. data/app/assets/images/flags/kz.png +0 -0
  153. data/app/assets/images/flags/la.png +0 -0
  154. data/app/assets/images/flags/lb.png +0 -0
  155. data/app/assets/images/flags/lc.png +0 -0
  156. data/app/assets/images/flags/li.png +0 -0
  157. data/app/assets/images/flags/lk.png +0 -0
  158. data/app/assets/images/flags/lr.png +0 -0
  159. data/app/assets/images/flags/ls.png +0 -0
  160. data/app/assets/images/flags/lt.png +0 -0
  161. data/app/assets/images/flags/lu.png +0 -0
  162. data/app/assets/images/flags/lv.png +0 -0
  163. data/app/assets/images/flags/ly.png +0 -0
  164. data/app/assets/images/flags/ma.png +0 -0
  165. data/app/assets/images/flags/mc.png +0 -0
  166. data/app/assets/images/flags/md.png +0 -0
  167. data/app/assets/images/flags/me.png +0 -0
  168. data/app/assets/images/flags/mg.png +0 -0
  169. data/app/assets/images/flags/mh.png +0 -0
  170. data/app/assets/images/flags/mk.png +0 -0
  171. data/app/assets/images/flags/ml.png +0 -0
  172. data/app/assets/images/flags/mm.png +0 -0
  173. data/app/assets/images/flags/mn.png +0 -0
  174. data/app/assets/images/flags/mo.png +0 -0
  175. data/app/assets/images/flags/mp.png +0 -0
  176. data/app/assets/images/flags/mq.png +0 -0
  177. data/app/assets/images/flags/mr.png +0 -0
  178. data/app/assets/images/flags/ms.png +0 -0
  179. data/app/assets/images/flags/mt.png +0 -0
  180. data/app/assets/images/flags/mu.png +0 -0
  181. data/app/assets/images/flags/mv.png +0 -0
  182. data/app/assets/images/flags/mw.png +0 -0
  183. data/app/assets/images/flags/mx.png +0 -0
  184. data/app/assets/images/flags/my.png +0 -0
  185. data/app/assets/images/flags/mz.png +0 -0
  186. data/app/assets/images/flags/na.png +0 -0
  187. data/app/assets/images/flags/nc.png +0 -0
  188. data/app/assets/images/flags/ne.png +0 -0
  189. data/app/assets/images/flags/nf.png +0 -0
  190. data/app/assets/images/flags/ng.png +0 -0
  191. data/app/assets/images/flags/ni.png +0 -0
  192. data/app/assets/images/flags/nl.png +0 -0
  193. data/app/assets/images/flags/no.png +0 -0
  194. data/app/assets/images/flags/np.png +0 -0
  195. data/app/assets/images/flags/nr.png +0 -0
  196. data/app/assets/images/flags/nu.png +0 -0
  197. data/app/assets/images/flags/nz.png +0 -0
  198. data/app/assets/images/flags/om.png +0 -0
  199. data/app/assets/images/flags/pa.png +0 -0
  200. data/app/assets/images/flags/pe.png +0 -0
  201. data/app/assets/images/flags/pf.png +0 -0
  202. data/app/assets/images/flags/pg.png +0 -0
  203. data/app/assets/images/flags/ph.png +0 -0
  204. data/app/assets/images/flags/pk.png +0 -0
  205. data/app/assets/images/flags/pl.png +0 -0
  206. data/app/assets/images/flags/pm.png +0 -0
  207. data/app/assets/images/flags/pn.png +0 -0
  208. data/app/assets/images/flags/pr.png +0 -0
  209. data/app/assets/images/flags/ps.png +0 -0
  210. data/app/assets/images/flags/pt.png +0 -0
  211. data/app/assets/images/flags/pw.png +0 -0
  212. data/app/assets/images/flags/py.png +0 -0
  213. data/app/assets/images/flags/qa.png +0 -0
  214. data/app/assets/images/flags/re.png +0 -0
  215. data/app/assets/images/flags/ro.png +0 -0
  216. data/app/assets/images/flags/rs.png +0 -0
  217. data/app/assets/images/flags/ru.png +0 -0
  218. data/app/assets/images/flags/rw.png +0 -0
  219. data/app/assets/images/flags/sa.png +0 -0
  220. data/app/assets/images/flags/sb.png +0 -0
  221. data/app/assets/images/flags/sc.png +0 -0
  222. data/app/assets/images/flags/scotland.png +0 -0
  223. data/app/assets/images/flags/sd.png +0 -0
  224. data/app/assets/images/flags/se.png +0 -0
  225. data/app/assets/images/flags/sg.png +0 -0
  226. data/app/assets/images/flags/sh.png +0 -0
  227. data/app/assets/images/flags/si.png +0 -0
  228. data/app/assets/images/flags/sj.png +0 -0
  229. data/app/assets/images/flags/sk.png +0 -0
  230. data/app/assets/images/flags/sl.png +0 -0
  231. data/app/assets/images/flags/sm.png +0 -0
  232. data/app/assets/images/flags/sn.png +0 -0
  233. data/app/assets/images/flags/so.png +0 -0
  234. data/app/assets/images/flags/sr.png +0 -0
  235. data/app/assets/images/flags/st.png +0 -0
  236. data/app/assets/images/flags/sv.png +0 -0
  237. data/app/assets/images/flags/sy.png +0 -0
  238. data/app/assets/images/flags/sz.png +0 -0
  239. data/app/assets/images/flags/tc.png +0 -0
  240. data/app/assets/images/flags/td.png +0 -0
  241. data/app/assets/images/flags/tf.png +0 -0
  242. data/app/assets/images/flags/tg.png +0 -0
  243. data/app/assets/images/flags/th.png +0 -0
  244. data/app/assets/images/flags/tj.png +0 -0
  245. data/app/assets/images/flags/tk.png +0 -0
  246. data/app/assets/images/flags/tl.png +0 -0
  247. data/app/assets/images/flags/tm.png +0 -0
  248. data/app/assets/images/flags/tn.png +0 -0
  249. data/app/assets/images/flags/to.png +0 -0
  250. data/app/assets/images/flags/tr.png +0 -0
  251. data/app/assets/images/flags/tt.png +0 -0
  252. data/app/assets/images/flags/tv.png +0 -0
  253. data/app/assets/images/flags/tw.png +0 -0
  254. data/app/assets/images/flags/tz.png +0 -0
  255. data/app/assets/images/flags/ua.png +0 -0
  256. data/app/assets/images/flags/ug.png +0 -0
  257. data/app/assets/images/flags/um.png +0 -0
  258. data/app/assets/images/flags/us.png +0 -0
  259. data/app/assets/images/flags/uy.png +0 -0
  260. data/app/assets/images/flags/uz.png +0 -0
  261. data/app/assets/images/flags/va.png +0 -0
  262. data/app/assets/images/flags/vc.png +0 -0
  263. data/app/assets/images/flags/ve.png +0 -0
  264. data/app/assets/images/flags/vg.png +0 -0
  265. data/app/assets/images/flags/vi.png +0 -0
  266. data/app/assets/images/flags/vn.png +0 -0
  267. data/app/assets/images/flags/vu.png +0 -0
  268. data/app/assets/images/flags/wales.png +0 -0
  269. data/app/assets/images/flags/wf.png +0 -0
  270. data/app/assets/images/flags/ws.png +0 -0
  271. data/app/assets/images/flags/ye.png +0 -0
  272. data/app/assets/images/flags/yt.png +0 -0
  273. data/app/assets/images/flags/za.png +0 -0
  274. data/app/assets/images/flags/zm.png +0 -0
  275. data/app/assets/images/flags/zw.png +0 -0
  276. data/app/assets/images/logo/spree_50.png +0 -0
  277. data/app/assets/images/spree_header.jpg +0 -0
  278. data/app/assets/javascripts/spree/frontend/cart.js.coffee +15 -0
  279. data/app/assets/javascripts/spree/frontend/checkout/address.js.coffee +83 -0
  280. data/app/assets/javascripts/spree/frontend/checkout/payment.js.coffee +81 -0
  281. data/app/assets/javascripts/spree/frontend/checkout.js.coffee +16 -0
  282. data/app/assets/javascripts/spree/frontend/product.js.coffee +54 -0
  283. data/app/assets/javascripts/spree/frontend.js +9 -0
  284. data/app/assets/stylesheets/spree/frontend/_variables.scss +4 -0
  285. data/app/assets/stylesheets/spree/frontend/frontend_bootstrap.css.scss +102 -0
  286. data/app/assets/stylesheets/spree/frontend.css +5 -0
  287. data/app/controllers/spree/checkout_controller.rb +205 -0
  288. data/app/controllers/spree/content_controller.rb +23 -0
  289. data/app/controllers/spree/home_controller.rb +13 -0
  290. data/app/controllers/spree/locale_controller.rb +16 -0
  291. data/app/controllers/spree/orders_controller.rb +113 -0
  292. data/app/controllers/spree/products_controller.rb +60 -0
  293. data/app/controllers/spree/store_controller.rb +44 -0
  294. data/app/controllers/spree/taxons_controller.rb +23 -0
  295. data/app/helpers/spree/frontend_helper.rb +95 -0
  296. data/app/helpers/spree/orders_helper.rb +16 -0
  297. data/app/helpers/spree/store_helper.rb +10 -0
  298. data/app/helpers/spree/taxons_helper.rb +20 -0
  299. data/app/models/spree/frontend_configuration.rb +5 -0
  300. data/app/views/kaminari/twitter-bootstrap-3/_first_page.html.erb +13 -0
  301. data/app/views/kaminari/twitter-bootstrap-3/_gap.html.erb +8 -0
  302. data/app/views/kaminari/twitter-bootstrap-3/_last_page.html.erb +13 -0
  303. data/app/views/kaminari/twitter-bootstrap-3/_next_page.html.erb +13 -0
  304. data/app/views/kaminari/twitter-bootstrap-3/_page.html.erb +12 -0
  305. data/app/views/kaminari/twitter-bootstrap-3/_paginator.html.erb +25 -0
  306. data/app/views/kaminari/twitter-bootstrap-3/_prev_page.html.erb +13 -0
  307. data/app/views/spree/address/_form.html.erb +89 -0
  308. data/app/views/spree/checkout/_address.html.erb +44 -0
  309. data/app/views/spree/checkout/_confirm.html.erb +13 -0
  310. data/app/views/spree/checkout/_delivery.html.erb +101 -0
  311. data/app/views/spree/checkout/_payment.html.erb +71 -0
  312. data/app/views/spree/checkout/_summary.html.erb +72 -0
  313. data/app/views/spree/checkout/edit.html.erb +49 -0
  314. data/app/views/spree/checkout/payment/_check.html.erb +0 -0
  315. data/app/views/spree/checkout/payment/_gateway.html.erb +42 -0
  316. data/app/views/spree/checkout/payment/_storecredit.html.erb +16 -0
  317. data/app/views/spree/content/cvv.html.erb +13 -0
  318. data/app/views/spree/content/test.html.erb +1 -0
  319. data/app/views/spree/home/index.html.erb +12 -0
  320. data/app/views/spree/layouts/spree_application.html.erb +29 -0
  321. data/app/views/spree/orders/_adjustment_row.html.erb +8 -0
  322. data/app/views/spree/orders/_adjustments.html.erb +29 -0
  323. data/app/views/spree/orders/_form.html.erb +28 -0
  324. data/app/views/spree/orders/_line_item.html.erb +37 -0
  325. data/app/views/spree/orders/edit.html.erb +43 -0
  326. data/app/views/spree/orders/show.html.erb +28 -0
  327. data/app/views/spree/payments/_payment.html.erb +18 -0
  328. data/app/views/spree/products/_cart_form.html.erb +76 -0
  329. data/app/views/spree/products/_image.html.erb +5 -0
  330. data/app/views/spree/products/_promotions.html.erb +20 -0
  331. data/app/views/spree/products/_properties.html.erb +15 -0
  332. data/app/views/spree/products/_taxons.html.erb +8 -0
  333. data/app/views/spree/products/_thumbnails.html.erb +19 -0
  334. data/app/views/spree/products/index.html.erb +27 -0
  335. data/app/views/spree/products/show.html.erb +48 -0
  336. data/app/views/spree/shared/_address.html.erb +38 -0
  337. data/app/views/spree/shared/_error_messages.html.erb +12 -0
  338. data/app/views/spree/shared/_filters.html.erb +28 -0
  339. data/app/views/spree/shared/_google_add_items.js.erb +11 -0
  340. data/app/views/spree/shared/_google_analytics.js.erb +18 -0
  341. data/app/views/spree/shared/_google_checkout.js.erb +10 -0
  342. data/app/views/spree/shared/_google_purchase.js.erb +13 -0
  343. data/app/views/spree/shared/_head.html.erb +14 -0
  344. data/app/views/spree/shared/_header.html.erb +15 -0
  345. data/app/views/spree/shared/_link_to_cart.html.erb +1 -0
  346. data/app/views/spree/shared/_login.html.erb +19 -0
  347. data/app/views/spree/shared/_login_bar.html.erb +6 -0
  348. data/app/views/spree/shared/_main_nav_bar.html.erb +16 -0
  349. data/app/views/spree/shared/_nav_bar.html.erb +7 -0
  350. data/app/views/spree/shared/_order_details.html.erb +136 -0
  351. data/app/views/spree/shared/_products.html.erb +48 -0
  352. data/app/views/spree/shared/_search.html.erb +16 -0
  353. data/app/views/spree/shared/_shipment_tracking.html.erb +10 -0
  354. data/app/views/spree/shared/_sidebar.html.erb +3 -0
  355. data/app/views/spree/shared/_taxonomies.html.erb +12 -0
  356. data/app/views/spree/shared/forbidden.html.erb +0 -0
  357. data/app/views/spree/shared/unauthorized.html.erb +0 -0
  358. data/app/views/spree/store/cart_link.html.erb +1 -0
  359. data/app/views/spree/taxons/_taxon.html.erb +4 -0
  360. data/app/views/spree/taxons/show.html.erb +20 -0
  361. data/config/initializers/assets.rb +1 -0
  362. data/config/initializers/canonical_rails.rb +15 -0
  363. data/config/initializers/spree.rb +2 -0
  364. data/config/routes.rb +32 -0
  365. data/lib/spree/frontend/engine.rb +19 -0
  366. data/lib/spree/frontend/middleware/seo_assist.rb +51 -0
  367. data/lib/spree/frontend.rb +11 -0
  368. data/lib/spree_frontend.rb +1 -0
  369. data/lib/tasks/rake_util.rb +19 -0
  370. data/lib/tasks/taxon.rake +14 -0
  371. data/script/rails +9 -0
  372. data/spec/fixtures/thinking-cat.jpg +0 -0
  373. data/spree_frontend.gemspec +28 -0
  374. data/vendor/assets/javascripts/jquery.validate/additional-methods.min.js +12 -0
  375. data/vendor/assets/javascripts/jquery.validate/jquery.validate.min.js +12 -0
  376. data/vendor/assets/javascripts/jquery.validate/localization/messages_ar.js +25 -0
  377. data/vendor/assets/javascripts/jquery.validate/localization/messages_bg.js +25 -0
  378. data/vendor/assets/javascripts/jquery.validate/localization/messages_ca.js +25 -0
  379. data/vendor/assets/javascripts/jquery.validate/localization/messages_cs.js +25 -0
  380. data/vendor/assets/javascripts/jquery.validate/localization/messages_da.js +22 -0
  381. data/vendor/assets/javascripts/jquery.validate/localization/messages_de.js +22 -0
  382. data/vendor/assets/javascripts/jquery.validate/localization/messages_el.js +25 -0
  383. data/vendor/assets/javascripts/jquery.validate/localization/messages_es.js +25 -0
  384. data/vendor/assets/javascripts/jquery.validate/localization/messages_et.js +23 -0
  385. data/vendor/assets/javascripts/jquery.validate/localization/messages_eu.js +25 -0
  386. data/vendor/assets/javascripts/jquery.validate/localization/messages_fa.js +25 -0
  387. data/vendor/assets/javascripts/jquery.validate/localization/messages_fi.js +23 -0
  388. data/vendor/assets/javascripts/jquery.validate/localization/messages_fr.js +47 -0
  389. data/vendor/assets/javascripts/jquery.validate/localization/messages_ge.js +23 -0
  390. data/vendor/assets/javascripts/jquery.validate/localization/messages_he.js +25 -0
  391. data/vendor/assets/javascripts/jquery.validate/localization/messages_hr.js +25 -0
  392. data/vendor/assets/javascripts/jquery.validate/localization/messages_hu.js +24 -0
  393. data/vendor/assets/javascripts/jquery.validate/localization/messages_it.js +25 -0
  394. data/vendor/assets/javascripts/jquery.validate/localization/messages_ja.js +25 -0
  395. data/vendor/assets/javascripts/jquery.validate/localization/messages_ka.js +25 -0
  396. data/vendor/assets/javascripts/jquery.validate/localization/messages_kk.js +25 -0
  397. data/vendor/assets/javascripts/jquery.validate/localization/messages_ko.js +25 -0
  398. data/vendor/assets/javascripts/jquery.validate/localization/messages_lt.js +25 -0
  399. data/vendor/assets/javascripts/jquery.validate/localization/messages_lv.js +25 -0
  400. data/vendor/assets/javascripts/jquery.validate/localization/messages_ms.js +25 -0
  401. data/vendor/assets/javascripts/jquery.validate/localization/messages_nl.js +35 -0
  402. data/vendor/assets/javascripts/jquery.validate/localization/messages_no.js +25 -0
  403. data/vendor/assets/javascripts/jquery.validate/localization/messages_pl.js +25 -0
  404. data/vendor/assets/javascripts/jquery.validate/localization/messages_ptbr.js +24 -0
  405. data/vendor/assets/javascripts/jquery.validate/localization/messages_ptpt.js +24 -0
  406. data/vendor/assets/javascripts/jquery.validate/localization/messages_ro.js +25 -0
  407. data/vendor/assets/javascripts/jquery.validate/localization/messages_ru.js +25 -0
  408. data/vendor/assets/javascripts/jquery.validate/localization/messages_se.js +23 -0
  409. data/vendor/assets/javascripts/jquery.validate/localization/messages_si.js +25 -0
  410. data/vendor/assets/javascripts/jquery.validate/localization/messages_sk.js +22 -0
  411. data/vendor/assets/javascripts/jquery.validate/localization/messages_sl.js +25 -0
  412. data/vendor/assets/javascripts/jquery.validate/localization/messages_sr.js +25 -0
  413. data/vendor/assets/javascripts/jquery.validate/localization/messages_sv.js +23 -0
  414. data/vendor/assets/javascripts/jquery.validate/localization/messages_th.js +25 -0
  415. data/vendor/assets/javascripts/jquery.validate/localization/messages_tr.js +25 -0
  416. data/vendor/assets/javascripts/jquery.validate/localization/messages_tw.js +24 -0
  417. data/vendor/assets/javascripts/jquery.validate/localization/messages_uk.js +25 -0
  418. data/vendor/assets/javascripts/jquery.validate/localization/messages_vi.js +25 -0
  419. data/vendor/assets/javascripts/jquery.validate/localization/messages_zh.js +25 -0
  420. data/vendor/assets/javascripts/jquery.validate/localization/messages_zhtw.js +26 -0
  421. data/vendor/assets/javascripts/jquery.validate/localization/methods_de.js +12 -0
  422. data/vendor/assets/javascripts/jquery.validate/localization/methods_nl.js +9 -0
  423. data/vendor/assets/javascripts/jquery.validate/localization/methods_pt.js +9 -0
  424. metadata +556 -0
@@ -0,0 +1,205 @@
1
+ module Spree
2
+ # This is somewhat contrary to standard REST convention since there is not
3
+ # actually a Checkout object. There's enough distinct logic specific to
4
+ # checkout which has nothing to do with updating an order that this approach
5
+ # is waranted.
6
+ class CheckoutController < Spree::StoreController
7
+ before_action :expires_now, only: [:edit]
8
+ before_action :load_order_with_lock
9
+ before_action :ensure_valid_state_lock_version, only: [:update]
10
+ before_action :set_state_if_present
11
+
12
+ before_action :ensure_order_not_completed
13
+ before_action :ensure_checkout_allowed
14
+ before_action :ensure_sufficient_stock_lines
15
+ before_action :ensure_valid_state
16
+
17
+ before_action :associate_user
18
+ before_action :check_authorization
19
+ before_action :apply_coupon_code
20
+
21
+ before_action :setup_for_current_state
22
+ before_action :add_store_credit_payments, only: [:update]
23
+
24
+ helper 'spree/orders'
25
+
26
+ rescue_from Spree::Core::GatewayError, with: :rescue_from_spree_gateway_error
27
+
28
+ # Updates the order and advances to the next state (when possible.)
29
+ def update
30
+ if @order.update_from_params(params, permitted_checkout_attributes, request.headers.env)
31
+ @order.temporary_address = !params[:save_user_address]
32
+ unless @order.next
33
+ flash[:error] = @order.errors.full_messages.join("\n")
34
+ redirect_to(checkout_state_path(@order.state)) && return
35
+ end
36
+
37
+ if @order.completed?
38
+ @current_order = nil
39
+ flash.notice = Spree.t(:order_processed_successfully)
40
+ flash['order_completed'] = true
41
+ redirect_to completion_route
42
+ else
43
+ redirect_to checkout_state_path(@order.state)
44
+ end
45
+ else
46
+ render :edit
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def unknown_state?
53
+ (params[:state] && !@order.has_checkout_step?(params[:state])) ||
54
+ (!params[:state] && !@order.has_checkout_step?(@order.state))
55
+ end
56
+
57
+ def insufficient_payment?
58
+ params[:state] == "confirm" &&
59
+ @order.payment_required? &&
60
+ @order.payments.valid.sum(:amount) != @order.total
61
+ end
62
+
63
+ def correct_state
64
+ if unknown_state?
65
+ @order.checkout_steps.first
66
+ elsif insufficient_payment?
67
+ 'payment'
68
+ else
69
+ @order.state
70
+ end
71
+ end
72
+
73
+ def ensure_valid_state
74
+ if @order.state != correct_state && !skip_state_validation?
75
+ flash.keep
76
+ @order.update_column(:state, correct_state)
77
+ redirect_to checkout_state_path(@order.state)
78
+ end
79
+ end
80
+
81
+ # Should be overriden if you have areas of your checkout that don't match
82
+ # up to a step within checkout_steps, such as a registration step
83
+ def skip_state_validation?
84
+ false
85
+ end
86
+
87
+ def load_order_with_lock
88
+ @order = current_order(lock: true)
89
+ redirect_to(spree.cart_path) && return unless @order
90
+ end
91
+
92
+ def ensure_valid_state_lock_version
93
+ if params[:order] && params[:order][:state_lock_version]
94
+ @order.with_lock do
95
+ unless @order.state_lock_version == params[:order].delete(:state_lock_version).to_i
96
+ flash[:error] = Spree.t(:order_already_updated)
97
+ redirect_to(checkout_state_path(@order.state)) && return
98
+ end
99
+ @order.increment!(:state_lock_version)
100
+ end
101
+ end
102
+ end
103
+
104
+ def set_state_if_present
105
+ if params[:state]
106
+ if @order.can_go_to_state?(params[:state]) && !skip_state_validation?
107
+ redirect_to checkout_state_path(@order.state)
108
+ end
109
+ @order.state = params[:state]
110
+ end
111
+ end
112
+
113
+ def ensure_checkout_allowed
114
+ unless @order.checkout_allowed?
115
+ redirect_to spree.cart_path
116
+ end
117
+ end
118
+
119
+ def ensure_order_not_completed
120
+ redirect_to spree.cart_path if @order.completed?
121
+ end
122
+
123
+ def ensure_sufficient_stock_lines
124
+ if @order.insufficient_stock_lines.present?
125
+ flash[:error] = Spree.t(:inventory_error_flash_for_insufficient_quantity)
126
+ redirect_to spree.cart_path
127
+ end
128
+ end
129
+
130
+ # Provides a route to redirect after order completion
131
+ def completion_route(custom_params = nil)
132
+ spree.order_path(@order, custom_params)
133
+ end
134
+
135
+ def setup_for_current_state
136
+ method_name = :"before_#{@order.state}"
137
+ send(method_name) if respond_to?(method_name, true)
138
+ end
139
+
140
+ def before_address
141
+ # if the user has a default address, a callback takes care of setting
142
+ # that; but if he doesn't, we need to build an empty one here
143
+ @order.bill_address ||= Address.build_default
144
+ @order.ship_address ||= Address.build_default if @order.checkout_steps.include?('delivery')
145
+ end
146
+
147
+ def before_delivery
148
+ return if params[:order].present?
149
+
150
+ packages = @order.shipments.map(&:to_package)
151
+ @differentiator = Spree::Stock::Differentiator.new(@order, packages)
152
+ end
153
+
154
+ def before_payment
155
+ if @order.checkout_steps.include? "delivery"
156
+ packages = @order.shipments.map(&:to_package)
157
+ @differentiator = Spree::Stock::Differentiator.new(@order, packages)
158
+ @differentiator.missing.each do |variant, quantity|
159
+ @order.contents.remove(variant, quantity)
160
+ end
161
+ end
162
+
163
+ if try_spree_current_user && try_spree_current_user.respond_to?(:payment_sources)
164
+ @payment_sources = try_spree_current_user.payment_sources
165
+ end
166
+ end
167
+
168
+ def add_store_credit_payments
169
+ if params.has_key?(:apply_store_credit)
170
+ @order.add_store_credit_payments
171
+
172
+ # Remove other payment method parameters.
173
+ params[:order].delete(:payments_attributes)
174
+ params.delete(:payment_source)
175
+
176
+ # Return to the Payments page if additional payment is needed.
177
+ if @order.payments.valid.sum(:amount) < @order.total
178
+ redirect_to checkout_state_path(@order.state) and return
179
+ end
180
+ end
181
+ end
182
+
183
+ def rescue_from_spree_gateway_error(exception)
184
+ flash.now[:error] = Spree.t(:spree_gateway_error_flash_for_checkout)
185
+ @order.errors.add(:base, exception.message)
186
+ render :edit
187
+ end
188
+
189
+ def check_authorization
190
+ authorize!(:edit, current_order, cookies.signed[:guest_token])
191
+ end
192
+
193
+ def sanitize_zip_code
194
+ order_params = params[:order]
195
+ return unless order_params
196
+ strip_zip(order_params[:bill_address_attributes])
197
+ strip_zip(order_params[:ship_address_attributes])
198
+ end
199
+
200
+ def strip_zip(address_params)
201
+ return unless address_params
202
+ address_params[:zipcode] = address_params[:zipcode].strip if address_params[:zipcode]
203
+ end
204
+ end
205
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ class ContentController < Spree::StoreController
3
+ # Don't serve local files or static assets
4
+ before_action { render_404 if params[:path] =~ /(\.|\\)/ }
5
+ after_action :fire_visited_path, only: :show
6
+
7
+ rescue_from ActionView::MissingTemplate, :with => :render_404
8
+
9
+ respond_to :html
10
+
11
+ def show
12
+ render :action => params[:path]
13
+ end
14
+
15
+ def cvv
16
+ render :layout => false
17
+ end
18
+
19
+ def fire_visited_path
20
+ Spree::PromotionHandler::Page.new(current_order, params[:path]).activate
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module Spree
2
+ class HomeController < Spree::StoreController
3
+ helper 'spree/products'
4
+ respond_to :html
5
+
6
+ def index
7
+ @searcher = build_searcher(params.merge(include_images: true))
8
+ @products = @searcher.retrieve_products
9
+ @products = @products.includes(:possible_promotions) if @products.respond_to?(:includes)
10
+ @taxonomies = Spree::Taxonomy.includes(root: :children)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,16 @@
1
+ module Spree
2
+ class LocaleController < Spree::StoreController
3
+ def set
4
+ if request.referer && request.referer.starts_with?('http://' + request.host)
5
+ session['user_return_to'] = request.referer
6
+ end
7
+ if params[:locale] && I18n.available_locales.map(&:to_s).include?(params[:locale])
8
+ session[:locale] = I18n.locale = params[:locale]
9
+ flash.notice = Spree.t(:locale_changed)
10
+ else
11
+ flash[:error] = Spree.t(:locale_not_changed)
12
+ end
13
+ redirect_back_or_default(spree.root_path)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,113 @@
1
+ module Spree
2
+ class OrdersController < Spree::StoreController
3
+ before_action :check_authorization
4
+ rescue_from ActiveRecord::RecordNotFound, :with => :render_404
5
+ helper 'spree/products', 'spree/orders'
6
+
7
+ respond_to :html
8
+
9
+ before_action :assign_order_with_lock, only: :update
10
+ skip_before_action :verify_authenticity_token, only: [:populate]
11
+
12
+ def show
13
+ @order = Order.includes(line_items: [variant: [:option_values, :images, :product]], bill_address: :state, ship_address: :state).find_by_number!(params[:id])
14
+ end
15
+
16
+ def update
17
+ if @order.contents.update_cart(order_params)
18
+ respond_with(@order) do |format|
19
+ format.html do
20
+ if params.has_key?(:checkout)
21
+ @order.next if @order.cart?
22
+ redirect_to checkout_state_path(@order.checkout_steps.first)
23
+ else
24
+ redirect_to cart_path
25
+ end
26
+ end
27
+ end
28
+ else
29
+ respond_with(@order)
30
+ end
31
+ end
32
+
33
+ # Shows the current incomplete order from the session
34
+ def edit
35
+ @order = current_order || Order.incomplete.
36
+ includes(line_items: [variant: [:images, :option_values, :product]]).
37
+ find_or_initialize_by(guest_token: cookies.signed[:guest_token])
38
+ associate_user
39
+ end
40
+
41
+ # Adds a new item to the order (creating a new order if none already exists)
42
+ def populate
43
+ order = current_order(create_order_if_necessary: true)
44
+ variant = Spree::Variant.find(params[:variant_id])
45
+ quantity = params[:quantity].to_i
46
+ options = params[:options] || {}
47
+
48
+ # 2,147,483,647 is crazy. See issue #2695.
49
+ if quantity.between?(1, 2_147_483_647)
50
+ begin
51
+ order.contents.add(variant, quantity, options)
52
+ rescue ActiveRecord::RecordInvalid => e
53
+ error = e.record.errors.full_messages.join(", ")
54
+ end
55
+ else
56
+ error = Spree.t(:please_enter_reasonable_quantity)
57
+ end
58
+
59
+ if error
60
+ flash[:error] = error
61
+ redirect_back_or_default(spree.root_path)
62
+ else
63
+ respond_with(order) do |format|
64
+ format.html { redirect_to cart_path }
65
+ end
66
+ end
67
+ end
68
+
69
+ def empty
70
+ if @order = current_order
71
+ @order.empty!
72
+ end
73
+
74
+ redirect_to spree.cart_path
75
+ end
76
+
77
+ def accurate_title
78
+ if @order && @order.completed?
79
+ Spree.t(:order_number, :number => @order.number)
80
+ else
81
+ Spree.t(:shopping_cart)
82
+ end
83
+ end
84
+
85
+ def check_authorization
86
+ order = Spree::Order.find_by_number(params[:id]) || current_order
87
+
88
+ if order
89
+ authorize! :edit, order, cookies.signed[:guest_token]
90
+ else
91
+ authorize! :create, Spree::Order
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ def order_params
98
+ if params[:order]
99
+ params[:order].permit(*permitted_order_attributes)
100
+ else
101
+ {}
102
+ end
103
+ end
104
+
105
+ def assign_order_with_lock
106
+ @order = current_order(lock: true)
107
+ unless @order
108
+ flash[:error] = Spree.t(:order_not_found)
109
+ redirect_to root_path and return
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,60 @@
1
+ module Spree
2
+ class ProductsController < Spree::StoreController
3
+ before_action :load_product, only: :show
4
+ before_action :load_taxon, only: :index
5
+
6
+ rescue_from ActiveRecord::RecordNotFound, :with => :render_404
7
+ helper 'spree/taxons'
8
+
9
+ respond_to :html
10
+
11
+ def index
12
+ @searcher = build_searcher(params.merge(include_images: true))
13
+ @products = @searcher.retrieve_products
14
+ @products = @products.includes(:possible_promotions) if @products.respond_to?(:includes)
15
+ @taxonomies = Spree::Taxonomy.includes(root: :children)
16
+ end
17
+
18
+ def show
19
+ @variants = @product.variants_including_master.
20
+ spree_base_scopes.
21
+ active(current_currency).
22
+ includes([:option_values, :images])
23
+ @product_properties = @product.product_properties.includes(:property)
24
+ @taxon = params[:taxon_id].present? ? Spree::Taxon.find(params[:taxon_id]) : @product.taxons.first
25
+ redirect_if_legacy_path
26
+ end
27
+
28
+ private
29
+
30
+ def accurate_title
31
+ if @product
32
+ @product.meta_title.blank? ? @product.name : @product.meta_title
33
+ else
34
+ super
35
+ end
36
+ end
37
+
38
+ def load_product
39
+ if try_spree_current_user.try(:has_spree_role?, "admin")
40
+ @products = Product.with_deleted
41
+ else
42
+ @products = Product.active(current_currency)
43
+ end
44
+ @product = @products.includes(:variants_including_master, variant_images: :viewable).friendly.find(params[:id])
45
+ end
46
+
47
+ def load_taxon
48
+ @taxon = Spree::Taxon.find(params[:taxon]) if params[:taxon].present?
49
+ end
50
+
51
+ def redirect_if_legacy_path
52
+ # If an old id or a numeric id was used to find the record,
53
+ # we should do a 301 redirect that uses the current friendly id.
54
+ if params[:id] != @product.friendly_id
55
+ params.merge!(id: @product.friendly_id)
56
+ return redirect_to url_for(params), status: :moved_permanently
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,44 @@
1
+ module Spree
2
+ class StoreController < Spree::BaseController
3
+ include Spree::Core::ControllerHelpers::Order
4
+
5
+ skip_before_action :set_current_order, only: :cart_link
6
+
7
+ def forbidden
8
+ render 'spree/shared/forbidden', layout: Spree::Config[:layout], status: 403
9
+ end
10
+
11
+ def unauthorized
12
+ render 'spree/shared/unauthorized', layout: Spree::Config[:layout], status: 401
13
+ end
14
+
15
+ def cart_link
16
+ render partial: 'spree/shared/link_to_cart'
17
+ fresh_when(simple_current_order)
18
+ end
19
+
20
+ protected
21
+
22
+ # This method is placed here so that the CheckoutController
23
+ # and OrdersController can both reference it (or any other controller
24
+ # which needs it)
25
+ def apply_coupon_code
26
+ if params[:order] && params[:order][:coupon_code]
27
+ @order.coupon_code = params[:order][:coupon_code]
28
+
29
+ handler = PromotionHandler::Coupon.new(@order).apply
30
+
31
+ if handler.error.present?
32
+ flash.now[:error] = handler.error
33
+ respond_with(@order) { |format| format.html { render :edit } } and return
34
+ elsif handler.success
35
+ flash[:success] = handler.success
36
+ end
37
+ end
38
+ end
39
+
40
+ def config_locale
41
+ Spree::Frontend::Config[:locale]
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,23 @@
1
+ module Spree
2
+ class TaxonsController < Spree::StoreController
3
+ rescue_from ActiveRecord::RecordNotFound, with: :render_404
4
+ helper 'spree/products'
5
+
6
+ respond_to :html
7
+
8
+ def show
9
+ @taxon = Taxon.friendly.find(params[:id])
10
+ return unless @taxon
11
+
12
+ @searcher = build_searcher(params.merge(taxon: @taxon.id, include_images: true))
13
+ @products = @searcher.retrieve_products
14
+ @taxonomies = Spree::Taxonomy.includes(root: :children)
15
+ end
16
+
17
+ private
18
+
19
+ def accurate_title
20
+ @taxon.try(:seo_title) || super
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,95 @@
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(content_tag(:span, Spree.t(:home), itemprop: "name"), spree.root_path, itemprop: "url") + separator, itemprop: "item"), itemscope: "itemscope", itemtype: "https://schema.org/ListItem", itemprop: "itemListElement")]
12
+ if taxon
13
+ crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, Spree.t(:products), itemprop: "name"), spree.products_path, itemprop: "url") + separator, itemprop: "item"), itemscope: "itemscope", itemtype: "https://schema.org/ListItem", itemprop: "itemListElement")
14
+ crumbs << taxon.ancestors.collect { |ancestor| content_tag(:li, content_tag(:span, link_to(content_tag(:span, ancestor.name, itemprop: "name"), seo_url(ancestor), itemprop: "url") + separator, itemprop: "item"), itemscope: "itemscope", itemtype: "https://schema.org/ListItem", itemprop: "itemListElement") } unless taxon.ancestors.empty?
15
+ crumbs << content_tag(:li, content_tag(:span, link_to(content_tag(:span, taxon.name, itemprop: "name") , seo_url(taxon), itemprop: "url"), itemprop: "item"), class: 'active', itemscope: "itemscope", itemtype: "https://schema.org/ListItem", itemprop: "itemListElement")
16
+ else
17
+ crumbs << content_tag(:li, content_tag(:span, Spree.t(:products), itemprop: "item"), class: 'active', itemscope: "itemscope", itemtype: "https://schema.org/ListItem", itemprop: "itemListElement")
18
+ end
19
+ crumb_list = content_tag(:ol, raw(crumbs.flatten.map{|li| li.mb_chars}.join), class: 'breadcrumb', itemscope: "itemscope", itemtype: "https://schema.org/BreadcrumbList")
20
+ content_tag(:nav, crumb_list, id: 'breadcrumbs', class: 'col-md-12')
21
+ end
22
+
23
+ def checkout_progress(numbers: false)
24
+ states = @order.checkout_steps
25
+ items = states.each_with_index.map do |state, i|
26
+ text = Spree.t("order_state.#{state}").titleize
27
+ text.prepend("#{i.succ}. ") if numbers
28
+
29
+ css_classes = []
30
+ current_index = states.index(@order.state)
31
+ state_index = states.index(state)
32
+
33
+ if state_index < current_index
34
+ css_classes << 'completed'
35
+ text = link_to text, checkout_state_path(state)
36
+ end
37
+
38
+ css_classes << 'next' if state_index == current_index + 1
39
+ css_classes << 'active' if state == @order.state
40
+ css_classes << 'first' if state_index == 0
41
+ css_classes << 'last' if state_index == states.length - 1
42
+ # No more joined classes. IE6 is not a target browser.
43
+ # Hack: Stops <a> being wrapped round previous items twice.
44
+ if state_index < current_index
45
+ content_tag('li', text, class: css_classes.join(' '))
46
+ else
47
+ content_tag('li', content_tag('a', text), class: css_classes.join(' '))
48
+ end
49
+ end
50
+ content_tag('ul', raw(items.join("\n")), class: 'progress-steps nav nav-pills nav-justified', id: "checkout-step-#{@order.state}")
51
+ end
52
+
53
+ def flash_messages(opts = {})
54
+ ignore_types = ["order_completed"].concat(Array(opts[:ignore_types]).map(&:to_s) || [])
55
+
56
+ flash.each do |msg_type, text|
57
+ unless ignore_types.include?(msg_type)
58
+ concat(content_tag :div, text, class: "alert alert-#{msg_type}")
59
+ end
60
+ end
61
+ nil
62
+ end
63
+
64
+ def link_to_cart(text = nil)
65
+ text = text ? h(text) : Spree.t('cart')
66
+ css_class = nil
67
+
68
+ if simple_current_order.nil? or simple_current_order.item_count.zero?
69
+ text = "<span class='glyphicon glyphicon-shopping-cart'></span> #{text}: (#{Spree.t('empty')})"
70
+ css_class = 'empty'
71
+ else
72
+ 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>"
73
+ css_class = 'full'
74
+ end
75
+
76
+ link_to text.html_safe, spree.cart_path, :class => "cart-info #{css_class}"
77
+ end
78
+
79
+ # helper to determine if its appropriate to show the store menu
80
+ def store_menu?
81
+ %w{thank_you}.exclude? params[:action]
82
+ end
83
+
84
+ def taxons_tree(root_taxon, current_taxon, max_level = 1)
85
+ return '' if max_level < 1 || root_taxon.leaf?
86
+ content_tag :div, class: 'list-group' do
87
+ taxons = root_taxon.children.map do |taxon|
88
+ css_class = (current_taxon && current_taxon.self_and_ancestors.include?(taxon)) ? 'list-group-item active' : 'list-group-item'
89
+ link_to(taxon.name, seo_url(taxon), class: css_class) + taxons_tree(taxon, current_taxon, max_level - 1)
90
+ end
91
+ safe_join(taxons, "\n")
92
+ end
93
+ end
94
+ end
95
+ 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,20 @@
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("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("spree_products.*, spree_products_taxons.position").
13
+ where(products_arel[:id].not_in(products.map(&:id))).limit(to_get)
14
+ break if products.size >= max
15
+ end
16
+ end
17
+ products
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ module Spree
2
+ class FrontendConfiguration < Preferences::Configuration
3
+ preference :locale, :string, default: Rails.application.config.i18n.default_locale
4
+ end
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
+ total_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
+ total_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>