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.
- checksums.yaml +7 -0
- data/Gemfile +6 -0
- data/LICENSE +26 -0
- data/README.md +50 -0
- data/Rakefile +15 -0
- data/app/assets/images/credit_cards/amex_cid.gif +0 -0
- data/app/assets/images/credit_cards/credit_card.gif +0 -0
- data/app/assets/images/credit_cards/discover_cid.gif +0 -0
- data/app/assets/images/credit_cards/icons/american_express.png +0 -0
- data/app/assets/images/credit_cards/icons/cirrus.png +0 -0
- data/app/assets/images/credit_cards/icons/delta.png +0 -0
- data/app/assets/images/credit_cards/icons/diners_club.png +0 -0
- data/app/assets/images/credit_cards/icons/directdebit.png +0 -0
- data/app/assets/images/credit_cards/icons/discover.png +0 -0
- data/app/assets/images/credit_cards/icons/egold.png +0 -0
- data/app/assets/images/credit_cards/icons/maestro.png +0 -0
- data/app/assets/images/credit_cards/icons/master.png +0 -0
- data/app/assets/images/credit_cards/icons/paypal.png +0 -0
- data/app/assets/images/credit_cards/icons/solo.png +0 -0
- data/app/assets/images/credit_cards/icons/switch.png +0 -0
- data/app/assets/images/credit_cards/icons/visa.png +0 -0
- data/app/assets/images/credit_cards/icons/visaelectron.png +0 -0
- data/app/assets/images/credit_cards/icons/westernunion.png +0 -0
- data/app/assets/images/credit_cards/icons/wirecard.png +0 -0
- data/app/assets/images/credit_cards/icons/worldpay.png +0 -0
- data/app/assets/images/credit_cards/master_cid.jpg +0 -0
- data/app/assets/images/credit_cards/visa_cid.gif +0 -0
- data/app/assets/images/favicon.ico +0 -0
- data/app/assets/images/flags/ad.png +0 -0
- data/app/assets/images/flags/ae.png +0 -0
- data/app/assets/images/flags/af.png +0 -0
- data/app/assets/images/flags/ag.png +0 -0
- data/app/assets/images/flags/ai.png +0 -0
- data/app/assets/images/flags/al.png +0 -0
- data/app/assets/images/flags/am.png +0 -0
- data/app/assets/images/flags/an.png +0 -0
- data/app/assets/images/flags/ao.png +0 -0
- data/app/assets/images/flags/ar.png +0 -0
- data/app/assets/images/flags/as.png +0 -0
- data/app/assets/images/flags/at.png +0 -0
- data/app/assets/images/flags/au.png +0 -0
- data/app/assets/images/flags/aw.png +0 -0
- data/app/assets/images/flags/ax.png +0 -0
- data/app/assets/images/flags/az.png +0 -0
- data/app/assets/images/flags/ba.png +0 -0
- data/app/assets/images/flags/bb.png +0 -0
- data/app/assets/images/flags/bd.png +0 -0
- data/app/assets/images/flags/be.png +0 -0
- data/app/assets/images/flags/bf.png +0 -0
- data/app/assets/images/flags/bg.png +0 -0
- data/app/assets/images/flags/bh.png +0 -0
- data/app/assets/images/flags/bi.png +0 -0
- data/app/assets/images/flags/bj.png +0 -0
- data/app/assets/images/flags/bm.png +0 -0
- data/app/assets/images/flags/bn.png +0 -0
- data/app/assets/images/flags/bo.png +0 -0
- data/app/assets/images/flags/br.png +0 -0
- data/app/assets/images/flags/bs.png +0 -0
- data/app/assets/images/flags/bt.png +0 -0
- data/app/assets/images/flags/bv.png +0 -0
- data/app/assets/images/flags/bw.png +0 -0
- data/app/assets/images/flags/by.png +0 -0
- data/app/assets/images/flags/bz.png +0 -0
- data/app/assets/images/flags/ca.png +0 -0
- data/app/assets/images/flags/catalonia.png +0 -0
- data/app/assets/images/flags/cc.png +0 -0
- data/app/assets/images/flags/cd.png +0 -0
- data/app/assets/images/flags/cf.png +0 -0
- data/app/assets/images/flags/cg.png +0 -0
- data/app/assets/images/flags/ch.png +0 -0
- data/app/assets/images/flags/ci.png +0 -0
- data/app/assets/images/flags/ck.png +0 -0
- data/app/assets/images/flags/cl.png +0 -0
- data/app/assets/images/flags/cm.png +0 -0
- data/app/assets/images/flags/cn.png +0 -0
- data/app/assets/images/flags/co.png +0 -0
- data/app/assets/images/flags/cr.png +0 -0
- data/app/assets/images/flags/cs.png +0 -0
- data/app/assets/images/flags/cu.png +0 -0
- data/app/assets/images/flags/cv.png +0 -0
- data/app/assets/images/flags/cx.png +0 -0
- data/app/assets/images/flags/cy.png +0 -0
- data/app/assets/images/flags/cz.png +0 -0
- data/app/assets/images/flags/de.png +0 -0
- data/app/assets/images/flags/dj.png +0 -0
- data/app/assets/images/flags/dk.png +0 -0
- data/app/assets/images/flags/dm.png +0 -0
- data/app/assets/images/flags/do.png +0 -0
- data/app/assets/images/flags/dz.png +0 -0
- data/app/assets/images/flags/ec.png +0 -0
- data/app/assets/images/flags/ee.png +0 -0
- data/app/assets/images/flags/eg.png +0 -0
- data/app/assets/images/flags/eh.png +0 -0
- data/app/assets/images/flags/england.png +0 -0
- data/app/assets/images/flags/er.png +0 -0
- data/app/assets/images/flags/es.png +0 -0
- data/app/assets/images/flags/et.png +0 -0
- data/app/assets/images/flags/europeanunion.png +0 -0
- data/app/assets/images/flags/fam.png +0 -0
- data/app/assets/images/flags/fi.png +0 -0
- data/app/assets/images/flags/fj.png +0 -0
- data/app/assets/images/flags/fk.png +0 -0
- data/app/assets/images/flags/fm.png +0 -0
- data/app/assets/images/flags/fo.png +0 -0
- data/app/assets/images/flags/fr.png +0 -0
- data/app/assets/images/flags/ga.png +0 -0
- data/app/assets/images/flags/gb.png +0 -0
- data/app/assets/images/flags/gd.png +0 -0
- data/app/assets/images/flags/ge.png +0 -0
- data/app/assets/images/flags/gf.png +0 -0
- data/app/assets/images/flags/gh.png +0 -0
- data/app/assets/images/flags/gi.png +0 -0
- data/app/assets/images/flags/gl.png +0 -0
- data/app/assets/images/flags/gm.png +0 -0
- data/app/assets/images/flags/gn.png +0 -0
- data/app/assets/images/flags/gp.png +0 -0
- data/app/assets/images/flags/gq.png +0 -0
- data/app/assets/images/flags/gr.png +0 -0
- data/app/assets/images/flags/gs.png +0 -0
- data/app/assets/images/flags/gt.png +0 -0
- data/app/assets/images/flags/gu.png +0 -0
- data/app/assets/images/flags/gw.png +0 -0
- data/app/assets/images/flags/gy.png +0 -0
- data/app/assets/images/flags/hk.png +0 -0
- data/app/assets/images/flags/hm.png +0 -0
- data/app/assets/images/flags/hn.png +0 -0
- data/app/assets/images/flags/hr.png +0 -0
- data/app/assets/images/flags/ht.png +0 -0
- data/app/assets/images/flags/hu.png +0 -0
- data/app/assets/images/flags/id.png +0 -0
- data/app/assets/images/flags/ie.png +0 -0
- data/app/assets/images/flags/il.png +0 -0
- data/app/assets/images/flags/in.png +0 -0
- data/app/assets/images/flags/io.png +0 -0
- data/app/assets/images/flags/iq.png +0 -0
- data/app/assets/images/flags/ir.png +0 -0
- data/app/assets/images/flags/is.png +0 -0
- data/app/assets/images/flags/it.png +0 -0
- data/app/assets/images/flags/ja.png +0 -0
- data/app/assets/images/flags/jm.png +0 -0
- data/app/assets/images/flags/jo.png +0 -0
- data/app/assets/images/flags/ke.png +0 -0
- data/app/assets/images/flags/kg.png +0 -0
- data/app/assets/images/flags/kh.png +0 -0
- data/app/assets/images/flags/ki.png +0 -0
- data/app/assets/images/flags/km.png +0 -0
- data/app/assets/images/flags/kn.png +0 -0
- data/app/assets/images/flags/kp.png +0 -0
- data/app/assets/images/flags/kr.png +0 -0
- data/app/assets/images/flags/kw.png +0 -0
- data/app/assets/images/flags/ky.png +0 -0
- data/app/assets/images/flags/kz.png +0 -0
- data/app/assets/images/flags/la.png +0 -0
- data/app/assets/images/flags/lb.png +0 -0
- data/app/assets/images/flags/lc.png +0 -0
- data/app/assets/images/flags/li.png +0 -0
- data/app/assets/images/flags/lk.png +0 -0
- data/app/assets/images/flags/lr.png +0 -0
- data/app/assets/images/flags/ls.png +0 -0
- data/app/assets/images/flags/lt.png +0 -0
- data/app/assets/images/flags/lu.png +0 -0
- data/app/assets/images/flags/lv.png +0 -0
- data/app/assets/images/flags/ly.png +0 -0
- data/app/assets/images/flags/ma.png +0 -0
- data/app/assets/images/flags/mc.png +0 -0
- data/app/assets/images/flags/md.png +0 -0
- data/app/assets/images/flags/me.png +0 -0
- data/app/assets/images/flags/mg.png +0 -0
- data/app/assets/images/flags/mh.png +0 -0
- data/app/assets/images/flags/mk.png +0 -0
- data/app/assets/images/flags/ml.png +0 -0
- data/app/assets/images/flags/mm.png +0 -0
- data/app/assets/images/flags/mn.png +0 -0
- data/app/assets/images/flags/mo.png +0 -0
- data/app/assets/images/flags/mp.png +0 -0
- data/app/assets/images/flags/mq.png +0 -0
- data/app/assets/images/flags/mr.png +0 -0
- data/app/assets/images/flags/ms.png +0 -0
- data/app/assets/images/flags/mt.png +0 -0
- data/app/assets/images/flags/mu.png +0 -0
- data/app/assets/images/flags/mv.png +0 -0
- data/app/assets/images/flags/mw.png +0 -0
- data/app/assets/images/flags/mx.png +0 -0
- data/app/assets/images/flags/my.png +0 -0
- data/app/assets/images/flags/mz.png +0 -0
- data/app/assets/images/flags/na.png +0 -0
- data/app/assets/images/flags/nc.png +0 -0
- data/app/assets/images/flags/ne.png +0 -0
- data/app/assets/images/flags/nf.png +0 -0
- data/app/assets/images/flags/ng.png +0 -0
- data/app/assets/images/flags/ni.png +0 -0
- data/app/assets/images/flags/nl.png +0 -0
- data/app/assets/images/flags/no.png +0 -0
- data/app/assets/images/flags/np.png +0 -0
- data/app/assets/images/flags/nr.png +0 -0
- data/app/assets/images/flags/nu.png +0 -0
- data/app/assets/images/flags/nz.png +0 -0
- data/app/assets/images/flags/om.png +0 -0
- data/app/assets/images/flags/pa.png +0 -0
- data/app/assets/images/flags/pe.png +0 -0
- data/app/assets/images/flags/pf.png +0 -0
- data/app/assets/images/flags/pg.png +0 -0
- data/app/assets/images/flags/ph.png +0 -0
- data/app/assets/images/flags/pk.png +0 -0
- data/app/assets/images/flags/pl.png +0 -0
- data/app/assets/images/flags/pm.png +0 -0
- data/app/assets/images/flags/pn.png +0 -0
- data/app/assets/images/flags/pr.png +0 -0
- data/app/assets/images/flags/ps.png +0 -0
- data/app/assets/images/flags/pt.png +0 -0
- data/app/assets/images/flags/pw.png +0 -0
- data/app/assets/images/flags/py.png +0 -0
- data/app/assets/images/flags/qa.png +0 -0
- data/app/assets/images/flags/re.png +0 -0
- data/app/assets/images/flags/ro.png +0 -0
- data/app/assets/images/flags/rs.png +0 -0
- data/app/assets/images/flags/ru.png +0 -0
- data/app/assets/images/flags/rw.png +0 -0
- data/app/assets/images/flags/sa.png +0 -0
- data/app/assets/images/flags/sb.png +0 -0
- data/app/assets/images/flags/sc.png +0 -0
- data/app/assets/images/flags/scotland.png +0 -0
- data/app/assets/images/flags/sd.png +0 -0
- data/app/assets/images/flags/se.png +0 -0
- data/app/assets/images/flags/sg.png +0 -0
- data/app/assets/images/flags/sh.png +0 -0
- data/app/assets/images/flags/si.png +0 -0
- data/app/assets/images/flags/sj.png +0 -0
- data/app/assets/images/flags/sk.png +0 -0
- data/app/assets/images/flags/sl.png +0 -0
- data/app/assets/images/flags/sm.png +0 -0
- data/app/assets/images/flags/sn.png +0 -0
- data/app/assets/images/flags/so.png +0 -0
- data/app/assets/images/flags/sr.png +0 -0
- data/app/assets/images/flags/st.png +0 -0
- data/app/assets/images/flags/sv.png +0 -0
- data/app/assets/images/flags/sy.png +0 -0
- data/app/assets/images/flags/sz.png +0 -0
- data/app/assets/images/flags/tc.png +0 -0
- data/app/assets/images/flags/td.png +0 -0
- data/app/assets/images/flags/tf.png +0 -0
- data/app/assets/images/flags/tg.png +0 -0
- data/app/assets/images/flags/th.png +0 -0
- data/app/assets/images/flags/tj.png +0 -0
- data/app/assets/images/flags/tk.png +0 -0
- data/app/assets/images/flags/tl.png +0 -0
- data/app/assets/images/flags/tm.png +0 -0
- data/app/assets/images/flags/tn.png +0 -0
- data/app/assets/images/flags/to.png +0 -0
- data/app/assets/images/flags/tr.png +0 -0
- data/app/assets/images/flags/tt.png +0 -0
- data/app/assets/images/flags/tv.png +0 -0
- data/app/assets/images/flags/tw.png +0 -0
- data/app/assets/images/flags/tz.png +0 -0
- data/app/assets/images/flags/ua.png +0 -0
- data/app/assets/images/flags/ug.png +0 -0
- data/app/assets/images/flags/um.png +0 -0
- data/app/assets/images/flags/us.png +0 -0
- data/app/assets/images/flags/uy.png +0 -0
- data/app/assets/images/flags/uz.png +0 -0
- data/app/assets/images/flags/va.png +0 -0
- data/app/assets/images/flags/vc.png +0 -0
- data/app/assets/images/flags/ve.png +0 -0
- data/app/assets/images/flags/vg.png +0 -0
- data/app/assets/images/flags/vi.png +0 -0
- data/app/assets/images/flags/vn.png +0 -0
- data/app/assets/images/flags/vu.png +0 -0
- data/app/assets/images/flags/wales.png +0 -0
- data/app/assets/images/flags/wf.png +0 -0
- data/app/assets/images/flags/ws.png +0 -0
- data/app/assets/images/flags/ye.png +0 -0
- data/app/assets/images/flags/yt.png +0 -0
- data/app/assets/images/flags/za.png +0 -0
- data/app/assets/images/flags/zm.png +0 -0
- data/app/assets/images/flags/zw.png +0 -0
- data/app/assets/images/logo/spree_50.png +0 -0
- data/app/assets/images/spree_header.jpg +0 -0
- data/app/assets/javascripts/spree/frontend/cart.js.coffee +15 -0
- data/app/assets/javascripts/spree/frontend/checkout/address.js.coffee +83 -0
- data/app/assets/javascripts/spree/frontend/checkout/payment.js.coffee +81 -0
- data/app/assets/javascripts/spree/frontend/checkout.js.coffee +16 -0
- data/app/assets/javascripts/spree/frontend/product.js.coffee +54 -0
- data/app/assets/javascripts/spree/frontend.js +9 -0
- data/app/assets/stylesheets/spree/frontend/_variables.scss +4 -0
- data/app/assets/stylesheets/spree/frontend/frontend_bootstrap.css.scss +102 -0
- data/app/assets/stylesheets/spree/frontend.css +5 -0
- data/app/controllers/spree/checkout_controller.rb +205 -0
- data/app/controllers/spree/content_controller.rb +23 -0
- data/app/controllers/spree/home_controller.rb +13 -0
- data/app/controllers/spree/locale_controller.rb +16 -0
- data/app/controllers/spree/orders_controller.rb +113 -0
- data/app/controllers/spree/products_controller.rb +60 -0
- data/app/controllers/spree/store_controller.rb +44 -0
- data/app/controllers/spree/taxons_controller.rb +23 -0
- data/app/helpers/spree/frontend_helper.rb +95 -0
- data/app/helpers/spree/orders_helper.rb +16 -0
- data/app/helpers/spree/store_helper.rb +10 -0
- data/app/helpers/spree/taxons_helper.rb +20 -0
- data/app/models/spree/frontend_configuration.rb +5 -0
- data/app/views/kaminari/twitter-bootstrap-3/_first_page.html.erb +13 -0
- data/app/views/kaminari/twitter-bootstrap-3/_gap.html.erb +8 -0
- data/app/views/kaminari/twitter-bootstrap-3/_last_page.html.erb +13 -0
- data/app/views/kaminari/twitter-bootstrap-3/_next_page.html.erb +13 -0
- data/app/views/kaminari/twitter-bootstrap-3/_page.html.erb +12 -0
- data/app/views/kaminari/twitter-bootstrap-3/_paginator.html.erb +25 -0
- data/app/views/kaminari/twitter-bootstrap-3/_prev_page.html.erb +13 -0
- data/app/views/spree/address/_form.html.erb +89 -0
- data/app/views/spree/checkout/_address.html.erb +44 -0
- data/app/views/spree/checkout/_confirm.html.erb +13 -0
- data/app/views/spree/checkout/_delivery.html.erb +101 -0
- data/app/views/spree/checkout/_payment.html.erb +71 -0
- data/app/views/spree/checkout/_summary.html.erb +72 -0
- data/app/views/spree/checkout/edit.html.erb +49 -0
- data/app/views/spree/checkout/payment/_check.html.erb +0 -0
- data/app/views/spree/checkout/payment/_gateway.html.erb +42 -0
- data/app/views/spree/checkout/payment/_storecredit.html.erb +16 -0
- data/app/views/spree/content/cvv.html.erb +13 -0
- data/app/views/spree/content/test.html.erb +1 -0
- data/app/views/spree/home/index.html.erb +12 -0
- data/app/views/spree/layouts/spree_application.html.erb +29 -0
- data/app/views/spree/orders/_adjustment_row.html.erb +8 -0
- data/app/views/spree/orders/_adjustments.html.erb +29 -0
- data/app/views/spree/orders/_form.html.erb +28 -0
- data/app/views/spree/orders/_line_item.html.erb +37 -0
- data/app/views/spree/orders/edit.html.erb +43 -0
- data/app/views/spree/orders/show.html.erb +28 -0
- data/app/views/spree/payments/_payment.html.erb +18 -0
- data/app/views/spree/products/_cart_form.html.erb +76 -0
- data/app/views/spree/products/_image.html.erb +5 -0
- data/app/views/spree/products/_promotions.html.erb +20 -0
- data/app/views/spree/products/_properties.html.erb +15 -0
- data/app/views/spree/products/_taxons.html.erb +8 -0
- data/app/views/spree/products/_thumbnails.html.erb +19 -0
- data/app/views/spree/products/index.html.erb +27 -0
- data/app/views/spree/products/show.html.erb +48 -0
- data/app/views/spree/shared/_address.html.erb +38 -0
- data/app/views/spree/shared/_error_messages.html.erb +12 -0
- data/app/views/spree/shared/_filters.html.erb +28 -0
- data/app/views/spree/shared/_google_add_items.js.erb +11 -0
- data/app/views/spree/shared/_google_analytics.js.erb +18 -0
- data/app/views/spree/shared/_google_checkout.js.erb +10 -0
- data/app/views/spree/shared/_google_purchase.js.erb +13 -0
- data/app/views/spree/shared/_head.html.erb +14 -0
- data/app/views/spree/shared/_header.html.erb +15 -0
- data/app/views/spree/shared/_link_to_cart.html.erb +1 -0
- data/app/views/spree/shared/_login.html.erb +19 -0
- data/app/views/spree/shared/_login_bar.html.erb +6 -0
- data/app/views/spree/shared/_main_nav_bar.html.erb +16 -0
- data/app/views/spree/shared/_nav_bar.html.erb +7 -0
- data/app/views/spree/shared/_order_details.html.erb +136 -0
- data/app/views/spree/shared/_products.html.erb +48 -0
- data/app/views/spree/shared/_search.html.erb +16 -0
- data/app/views/spree/shared/_shipment_tracking.html.erb +10 -0
- data/app/views/spree/shared/_sidebar.html.erb +3 -0
- data/app/views/spree/shared/_taxonomies.html.erb +12 -0
- data/app/views/spree/shared/forbidden.html.erb +0 -0
- data/app/views/spree/shared/unauthorized.html.erb +0 -0
- data/app/views/spree/store/cart_link.html.erb +1 -0
- data/app/views/spree/taxons/_taxon.html.erb +4 -0
- data/app/views/spree/taxons/show.html.erb +20 -0
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/canonical_rails.rb +15 -0
- data/config/initializers/spree.rb +2 -0
- data/config/routes.rb +32 -0
- data/lib/spree/frontend/engine.rb +19 -0
- data/lib/spree/frontend/middleware/seo_assist.rb +51 -0
- data/lib/spree/frontend.rb +11 -0
- data/lib/spree_frontend.rb +1 -0
- data/lib/tasks/rake_util.rb +19 -0
- data/lib/tasks/taxon.rake +14 -0
- data/script/rails +9 -0
- data/spec/fixtures/thinking-cat.jpg +0 -0
- data/spree_frontend.gemspec +28 -0
- data/vendor/assets/javascripts/jquery.validate/additional-methods.min.js +12 -0
- data/vendor/assets/javascripts/jquery.validate/jquery.validate.min.js +12 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ar.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_bg.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ca.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_cs.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_da.js +22 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_de.js +22 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_el.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_es.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_et.js +23 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_eu.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_fa.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_fi.js +23 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_fr.js +47 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ge.js +23 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_he.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_hr.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_hu.js +24 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_it.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ja.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ka.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_kk.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ko.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_lt.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_lv.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ms.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_nl.js +35 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_no.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_pl.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ptbr.js +24 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ptpt.js +24 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ro.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ru.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_se.js +23 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_si.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sk.js +22 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sl.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sr.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sv.js +23 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_th.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_tr.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_tw.js +24 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_uk.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_vi.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_zh.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_zhtw.js +26 -0
- data/vendor/assets/javascripts/jquery.validate/localization/methods_de.js +12 -0
- data/vendor/assets/javascripts/jquery.validate/localization/methods_nl.js +9 -0
- data/vendor/assets/javascripts/jquery.validate/localization/methods_pt.js +9 -0
- 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=" ")
|
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,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>
|