solidus_starter_frontend 0.1.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 (301) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +57 -0
  3. data/.erb-lint.yml +22 -0
  4. data/.eslintrc +5 -0
  5. data/.gem_release.yml +5 -0
  6. data/.github/pull_request_template.md +28 -0
  7. data/.github/stale.yml +17 -0
  8. data/.gitignore +17 -0
  9. data/.hound.yml +16 -0
  10. data/.rspec +2 -0
  11. data/.rubocop.yml +19 -0
  12. data/.rubocop_todo.yml +229 -0
  13. data/.scss-lint.yml +4 -0
  14. data/Gemfile +34 -0
  15. data/LICENSE +26 -0
  16. data/README.md +69 -0
  17. data/Rakefile +6 -0
  18. data/app/assets/config/solidus_starter_frontend_manifest.js +2 -0
  19. data/app/assets/javascripts/spree/frontend.js +6 -0
  20. data/app/assets/javascripts/spree/frontend/cart.js +26 -0
  21. data/app/assets/javascripts/spree/frontend/checkout.js +34 -0
  22. data/app/assets/javascripts/spree/frontend/checkout/address.js +124 -0
  23. data/app/assets/javascripts/spree/frontend/checkout/payment.js +44 -0
  24. data/app/assets/javascripts/spree/frontend/locale_selector.js +9 -0
  25. data/app/assets/javascripts/spree/frontend/product.js +21 -0
  26. data/app/assets/javascripts/spree/frontend/solidus_starter_frontend.js +9 -0
  27. data/app/assets/javascripts/spree/frontend/utils.js.erb +18 -0
  28. data/app/assets/stylesheets/spree/frontend.css +8 -0
  29. data/app/assets/stylesheets/spree/frontend/base/_base.scss +29 -0
  30. data/app/assets/stylesheets/spree/frontend/base/_reset.scss +179 -0
  31. data/app/assets/stylesheets/spree/frontend/base/_responsive.scss +21 -0
  32. data/app/assets/stylesheets/spree/frontend/components/account/_account_order.scss +23 -0
  33. data/app/assets/stylesheets/spree/frontend/components/account/_account_summary.scss +17 -0
  34. data/app/assets/stylesheets/spree/frontend/components/auth/_auth_container.scss +11 -0
  35. data/app/assets/stylesheets/spree/frontend/components/auth/_auth_form.scss +5 -0
  36. data/app/assets/stylesheets/spree/frontend/components/brand/_logo.scss +4 -0
  37. data/app/assets/stylesheets/spree/frontend/components/buttons/_button_inline.scss +8 -0
  38. data/app/assets/stylesheets/spree/frontend/components/buttons/_button_primary.scss +26 -0
  39. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_adjustments.scss +6 -0
  40. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_amount_row.scss +11 -0
  41. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_empty.scss +10 -0
  42. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_footer.scss +20 -0
  43. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_header.scss +12 -0
  44. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_item.scss +86 -0
  45. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_link.scss +22 -0
  46. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_page.scss +15 -0
  47. data/app/assets/stylesheets/spree/frontend/components/cart/_cart_secondary_actions.scss +19 -0
  48. data/app/assets/stylesheets/spree/frontend/components/cart/_coupon_code.scss +8 -0
  49. data/app/assets/stylesheets/spree/frontend/components/cart/_item_info.scss +19 -0
  50. data/app/assets/stylesheets/spree/frontend/components/checkout/_checkout.scss +27 -0
  51. data/app/assets/stylesheets/spree/frontend/components/checkout/_checkout_header.scss +19 -0
  52. data/app/assets/stylesheets/spree/frontend/components/checkout/_checkout_summary.scss +31 -0
  53. data/app/assets/stylesheets/spree/frontend/components/checkout/_existing_cards.scss +27 -0
  54. data/app/assets/stylesheets/spree/frontend/components/checkout/_payment_method_controls.scss +5 -0
  55. data/app/assets/stylesheets/spree/frontend/components/checkout/_payment_method_selector.scss +14 -0
  56. data/app/assets/stylesheets/spree/frontend/components/checkout/_progress_steps.scss +38 -0
  57. data/app/assets/stylesheets/spree/frontend/components/checkout/_proposed_shipment.scss +18 -0
  58. data/app/assets/stylesheets/spree/frontend/components/checkout/_shipment_items.scss +50 -0
  59. data/app/assets/stylesheets/spree/frontend/components/checkout/_shipping_methods.scss +9 -0
  60. data/app/assets/stylesheets/spree/frontend/components/checkout/payments/_gateway_payment_method.scss +11 -0
  61. data/app/assets/stylesheets/spree/frontend/components/checkout/steps/_address_step.scss +20 -0
  62. data/app/assets/stylesheets/spree/frontend/components/checkout/steps/_confirm_step.scss +13 -0
  63. data/app/assets/stylesheets/spree/frontend/components/checkout/steps/_delivery_step.scss +13 -0
  64. data/app/assets/stylesheets/spree/frontend/components/checkout/steps/_payment_step.scss +13 -0
  65. data/app/assets/stylesheets/spree/frontend/components/forms/_address_inputs.scss +13 -0
  66. data/app/assets/stylesheets/spree/frontend/components/forms/inputs/_checkbox_input.scss +3 -0
  67. data/app/assets/stylesheets/spree/frontend/components/forms/inputs/_radio_input.scss +3 -0
  68. data/app/assets/stylesheets/spree/frontend/components/forms/inputs/_select_input.scss +27 -0
  69. data/app/assets/stylesheets/spree/frontend/components/forms/inputs/_text.scss +32 -0
  70. data/app/assets/stylesheets/spree/frontend/components/forms/inputs/_textarea_input.scss +25 -0
  71. data/app/assets/stylesheets/spree/frontend/components/general/_flash.scss +20 -0
  72. data/app/assets/stylesheets/spree/frontend/components/layout/_aside.scss +4 -0
  73. data/app/assets/stylesheets/spree/frontend/components/layout/_breadcrumbs.scss +16 -0
  74. data/app/assets/stylesheets/spree/frontend/components/layout/_category_navigation.scss +3 -0
  75. data/app/assets/stylesheets/spree/frontend/components/layout/_footer.scss +8 -0
  76. data/app/assets/stylesheets/spree/frontend/components/layout/_header.scss +12 -0
  77. data/app/assets/stylesheets/spree/frontend/components/layout/_horizontal_input_group.scss +7 -0
  78. data/app/assets/stylesheets/spree/frontend/components/layout/_top_bar.scss +44 -0
  79. data/app/assets/stylesheets/spree/frontend/components/navigation/_auth_link.scss +11 -0
  80. data/app/assets/stylesheets/spree/frontend/components/navigation/_categories.scss +29 -0
  81. data/app/assets/stylesheets/spree/frontend/components/navigation/_locale_selector.scss +21 -0
  82. data/app/assets/stylesheets/spree/frontend/components/navigation/_taxonomies.scss +7 -0
  83. data/app/assets/stylesheets/spree/frontend/components/navigation/_taxonomy.scss +28 -0
  84. data/app/assets/stylesheets/spree/frontend/components/orders/_address_overview.scss +27 -0
  85. data/app/assets/stylesheets/spree/frontend/components/orders/_coupon_codes.scss +4 -0
  86. data/app/assets/stylesheets/spree/frontend/components/orders/_line_items.scss +20 -0
  87. data/app/assets/stylesheets/spree/frontend/components/orders/_order_details.scss +18 -0
  88. data/app/assets/stylesheets/spree/frontend/components/orders/_order_item.scss +85 -0
  89. data/app/assets/stylesheets/spree/frontend/components/orders/_order_page.scss +41 -0
  90. data/app/assets/stylesheets/spree/frontend/components/orders/_order_shipments.scss +27 -0
  91. data/app/assets/stylesheets/spree/frontend/components/orders/_payment_info.scss +29 -0
  92. data/app/assets/stylesheets/spree/frontend/components/presentation/_hero.scss +18 -0
  93. data/app/assets/stylesheets/spree/frontend/components/products/_product_card.scss +35 -0
  94. data/app/assets/stylesheets/spree/frontend/components/products/_product_image.scss +7 -0
  95. data/app/assets/stylesheets/spree/frontend/components/products/_product_info.scss +14 -0
  96. data/app/assets/stylesheets/spree/frontend/components/products/_product_page.scss +31 -0
  97. data/app/assets/stylesheets/spree/frontend/components/products/_product_properties.scss +23 -0
  98. data/app/assets/stylesheets/spree/frontend/components/products/_product_submit.scss +9 -0
  99. data/app/assets/stylesheets/spree/frontend/components/products/_product_taxons.scss +27 -0
  100. data/app/assets/stylesheets/spree/frontend/components/products/_product_thumbnails.scss +7 -0
  101. data/app/assets/stylesheets/spree/frontend/components/products/_product_variants.scss +20 -0
  102. data/app/assets/stylesheets/spree/frontend/components/products/_products.scss +13 -0
  103. data/app/assets/stylesheets/spree/frontend/components/products/_products_by_taxon.scss +6 -0
  104. data/app/assets/stylesheets/spree/frontend/components/products/_products_grid.scss +18 -0
  105. data/app/assets/stylesheets/spree/frontend/components/search/_filter.scss +32 -0
  106. data/app/assets/stylesheets/spree/frontend/components/search/_search_bar.scss +34 -0
  107. data/app/assets/stylesheets/spree/frontend/components/typography/_hero_title.scss +6 -0
  108. data/app/assets/stylesheets/spree/frontend/components/typography/_subtitle.scss +7 -0
  109. data/app/assets/stylesheets/spree/frontend/placeholders/main.scss +5 -0
  110. data/app/assets/stylesheets/spree/frontend/screen.scss +89 -0
  111. data/app/assets/stylesheets/spree/frontend/solidus_starter_frontend.css +7 -0
  112. data/app/assets/stylesheets/spree/frontend/variables/_colors.scss +20 -0
  113. data/app/controllers/concerns/solidus_starter_frontend/auth_views.rb +16 -0
  114. data/app/controllers/concerns/solidus_starter_frontend/taxonomies.rb +16 -0
  115. data/app/controllers/spree/checkout_controller.rb +249 -0
  116. data/app/controllers/spree/coupon_codes_controller.rb +35 -0
  117. data/app/controllers/spree/home_controller.rb +13 -0
  118. data/app/controllers/spree/locale_controller.rb +20 -0
  119. data/app/controllers/spree/orders_controller.rb +126 -0
  120. data/app/controllers/spree/products_controller.rb +51 -0
  121. data/app/controllers/spree/store_controller.rb +31 -0
  122. data/app/controllers/spree/taxons_controller.rb +30 -0
  123. data/app/helpers/spree/orders_helper.rb +18 -0
  124. data/app/helpers/spree/taxon_filters_helper.rb +13 -0
  125. data/app/views/spree/address/_form_hidden.html.erb +12 -0
  126. data/app/views/spree/checkout/_terms_and_conditions.en.html.erb +1 -0
  127. data/app/views/spree/checkout/edit.html.erb +16 -0
  128. data/app/views/spree/checkout/existing_payment/_gateway.html.erb +9 -0
  129. data/app/views/spree/checkout/payment/_check.html.erb +0 -0
  130. data/app/views/spree/checkout/payment/_gateway.html.erb +43 -0
  131. data/app/views/spree/components/auth/_change_form.html.erb +40 -0
  132. data/app/views/spree/components/auth/_forgot_form.html.erb +28 -0
  133. data/app/views/spree/components/auth/_guest_form.html.erb +31 -0
  134. data/app/views/spree/components/auth/_login_form.html.erb +42 -0
  135. data/app/views/spree/components/auth/_signup_form.html.erb +48 -0
  136. data/app/views/spree/components/brand/_logo.html.erb +3 -0
  137. data/app/views/spree/components/buttons/_button_inline.html.erb +23 -0
  138. data/app/views/spree/components/buttons/_button_primary.html.erb +29 -0
  139. data/app/views/spree/components/cart/_cart_adjustment.html.erb +15 -0
  140. data/app/views/spree/components/cart/_cart_adjustments.html.erb +47 -0
  141. data/app/views/spree/components/cart/_cart_amount_row.html.erb +12 -0
  142. data/app/views/spree/components/cart/_cart_empty.html.erb +9 -0
  143. data/app/views/spree/components/cart/_cart_footer.html.erb +15 -0
  144. data/app/views/spree/components/cart/_cart_header.html.erb +17 -0
  145. data/app/views/spree/components/cart/_cart_item.html.erb +52 -0
  146. data/app/views/spree/components/cart/_cart_items.html.erb +23 -0
  147. data/app/views/spree/components/cart/_cart_link.html.erb +9 -0
  148. data/app/views/spree/components/cart/_cart_secondary_actions.html.erb +17 -0
  149. data/app/views/spree/components/cart/_item_info.html.erb +26 -0
  150. data/app/views/spree/components/checkout/_checkout_header.html.erb +8 -0
  151. data/app/views/spree/components/checkout/_checkout_step.html.erb +21 -0
  152. data/app/views/spree/components/checkout/_checkout_summary.html.erb +70 -0
  153. data/app/views/spree/components/checkout/_existing_cards.html.erb +39 -0
  154. data/app/views/spree/components/checkout/_payment_method_controls.html.erb +10 -0
  155. data/app/views/spree/components/checkout/_payment_method_selector.html.erb +14 -0
  156. data/app/views/spree/components/checkout/_proposed_shipment.erb +18 -0
  157. data/app/views/spree/components/checkout/_shipment_items.html.erb +22 -0
  158. data/app/views/spree/components/checkout/_shipping_methods.html.erb +20 -0
  159. data/app/views/spree/components/checkout/_unshippable_items.html.erb +7 -0
  160. data/app/views/spree/components/checkout/steps/_address_step.html.erb +60 -0
  161. data/app/views/spree/components/checkout/steps/_confirm_step.html.erb +31 -0
  162. data/app/views/spree/components/checkout/steps/_delivery_step.html.erb +31 -0
  163. data/app/views/spree/components/checkout/steps/_payment_step.html.erb +25 -0
  164. data/app/views/spree/components/forms/_address_inputs.html.erb +152 -0
  165. data/app/views/spree/components/forms/inputs/_checkbox_input.html.erb +29 -0
  166. data/app/views/spree/components/forms/inputs/_collection_select.html.erb +42 -0
  167. data/app/views/spree/components/forms/inputs/_radio_input.html.erb +29 -0
  168. data/app/views/spree/components/forms/inputs/_select_input.html.erb +31 -0
  169. data/app/views/spree/components/forms/inputs/_text.html.erb +54 -0
  170. data/app/views/spree/components/forms/inputs/_textarea_input.html.erb +42 -0
  171. data/app/views/spree/components/layout/_category_navigation.html.erb +3 -0
  172. data/app/views/spree/components/layout/_footer.html.erb +7 -0
  173. data/app/views/spree/components/layout/_header.html.erb +8 -0
  174. data/app/views/spree/components/layout/_top_bar.html.erb +8 -0
  175. data/app/views/spree/components/navigation/_auth_link.html.erb +1 -0
  176. data/app/views/spree/components/navigation/_breadcrumbs.html.erb +47 -0
  177. data/app/views/spree/components/navigation/_categories.html.erb +12 -0
  178. data/app/views/spree/components/navigation/_locale_selector.html.erb +25 -0
  179. data/app/views/spree/components/navigation/_taxonomies.html.erb +17 -0
  180. data/app/views/spree/components/navigation/_taxons.html.erb +17 -0
  181. data/app/views/spree/components/navigation/_taxons_tree.html.erb +29 -0
  182. data/app/views/spree/components/orders/_address_overview.html.erb +40 -0
  183. data/app/views/spree/components/orders/_coupon_code.html.erb +22 -0
  184. data/app/views/spree/components/orders/_line_items.html.erb +55 -0
  185. data/app/views/spree/components/orders/_order_details.html.erb +35 -0
  186. data/app/views/spree/components/orders/_order_item.html.erb +33 -0
  187. data/app/views/spree/components/orders/_order_items.html.erb +5 -0
  188. data/app/views/spree/components/orders/_order_shipments.html.erb +25 -0
  189. data/app/views/spree/components/orders/_payment_info.html.erb +31 -0
  190. data/app/views/spree/components/presentation/_hero.html.erb +14 -0
  191. data/app/views/spree/components/products/_product-card.html.erb +36 -0
  192. data/app/views/spree/components/products/_product_availability.html.erb +19 -0
  193. data/app/views/spree/components/products/_product_form.html.erb +21 -0
  194. data/app/views/spree/components/products/_product_image.html.erb +6 -0
  195. data/app/views/spree/components/products/_product_info.html.erb +9 -0
  196. data/app/views/spree/components/products/_product_promotions.html.erb +25 -0
  197. data/app/views/spree/components/products/_product_properties.html.erb +19 -0
  198. data/app/views/spree/components/products/_product_submit.html.erb +39 -0
  199. data/app/views/spree/components/products/_product_taxons.html.erb +15 -0
  200. data/app/views/spree/components/products/_product_thumbnails.html.erb +19 -0
  201. data/app/views/spree/components/products/_product_variants.html.erb +36 -0
  202. data/app/views/spree/components/products/_products-grid.html.erb +13 -0
  203. data/app/views/spree/components/products/_products.html.erb +28 -0
  204. data/app/views/spree/components/products/_products_by_taxon.html.erb +7 -0
  205. data/app/views/spree/components/products/_variants_list.html.erb +12 -0
  206. data/app/views/spree/components/search/_filter.html.erb +42 -0
  207. data/app/views/spree/components/search/_filters.html.erb +20 -0
  208. data/app/views/spree/components/search/_form.html.erb +12 -0
  209. data/app/views/spree/components/search/_products_search.html.erb +36 -0
  210. data/app/views/spree/components/search/_search_bar.html.erb +36 -0
  211. data/app/views/spree/components/typography/_hero_title.html.erb +11 -0
  212. data/app/views/spree/components/typography/_subtitle.html.erb +11 -0
  213. data/app/views/spree/home/index.html.erb +7 -0
  214. data/app/views/spree/layouts/spree_application.html.erb +27 -0
  215. data/app/views/spree/orders/edit.html.erb +21 -0
  216. data/app/views/spree/orders/show.html.erb +29 -0
  217. data/app/views/spree/products/index.html.erb +22 -0
  218. data/app/views/spree/products/show.html.erb +18 -0
  219. data/app/views/spree/shared/_image.html.erb +12 -0
  220. data/app/views/spree/shared/_link_to_cart.html.erb +1 -0
  221. data/app/views/spree/shared/_login_bar_items.html.erb +1 -0
  222. data/app/views/spree/shared/_shipment_tracking.html.erb +11 -0
  223. data/app/views/spree/shared/unauthorized.html.erb +0 -0
  224. data/app/views/spree/taxons/show.html.erb +17 -0
  225. data/bin/console +17 -0
  226. data/bin/r +13 -0
  227. data/bin/rails +7 -0
  228. data/bin/rake +7 -0
  229. data/bin/rspec +29 -0
  230. data/bin/sandbox +84 -0
  231. data/bin/sandbox_rails +18 -0
  232. data/bin/setup +8 -0
  233. data/bin/solidus_compare +155 -0
  234. data/config/initializers/assets.rb +1 -0
  235. data/config/initializers/canonical_rails.rb +16 -0
  236. data/config/locales/en.yml +5 -0
  237. data/config/routes.rb +33 -0
  238. data/config/solidus_compare.yml +33 -0
  239. data/docs/development.md +28 -0
  240. data/exe/solidus_starter_frontend +9 -0
  241. data/lib/generators/solidus_starter_frontend/install/install_generator.rb +15 -0
  242. data/lib/generators/solidus_starter_frontend/solidus_starter_frontend_generator.rb +30 -0
  243. data/lib/generators/solidus_starter_frontend/views/override_generator.rb +50 -0
  244. data/lib/solidus_starter_frontend.rb +12 -0
  245. data/lib/solidus_starter_frontend/config.rb +7 -0
  246. data/lib/solidus_starter_frontend/engine.rb +34 -0
  247. data/lib/solidus_starter_frontend/factories.rb +4 -0
  248. data/lib/solidus_starter_frontend/solidus_support_extensions.rb +9 -0
  249. data/lib/solidus_starter_frontend/version.rb +5 -0
  250. data/lib/solidus_starter_frontend_configuration.rb +8 -0
  251. data/lib/views/auth/spree/checkout/registration.html.erb +7 -0
  252. data/lib/views/auth/spree/components/navigation/_auth_link.html.erb +5 -0
  253. data/lib/views/auth/spree/user_passwords/edit.html.erb +7 -0
  254. data/lib/views/auth/spree/user_passwords/new.html.erb +5 -0
  255. data/lib/views/auth/spree/user_registrations/new.html.erb +7 -0
  256. data/lib/views/auth/spree/user_sessions/guest.html.erb +5 -0
  257. data/lib/views/auth/spree/user_sessions/new.html.erb +7 -0
  258. data/lib/views/auth/spree/users/edit.html.erb +45 -0
  259. data/lib/views/auth/spree/users/show.html.erb +55 -0
  260. data/solidus_starter_frontend.gemspec +43 -0
  261. data/spec/controllers/controller_helpers_spec.rb +29 -0
  262. data/spec/controllers/locale_controller_spec.rb +57 -0
  263. data/spec/controllers/spree/checkout_controller_spec.rb +563 -0
  264. data/spec/controllers/spree/checkout_controller_with_views_spec.rb +37 -0
  265. data/spec/controllers/spree/current_order_tracking_spec.rb +33 -0
  266. data/spec/controllers/spree/home_controller_spec.rb +29 -0
  267. data/spec/controllers/spree/orders_controller_ability_spec.rb +90 -0
  268. data/spec/controllers/spree/orders_controller_spec.rb +241 -0
  269. data/spec/controllers/spree/orders_controller_transitions_spec.rb +33 -0
  270. data/spec/controllers/spree/products_controller_spec.rb +38 -0
  271. data/spec/controllers/spree/taxons_controller_spec.rb +14 -0
  272. data/spec/fixtures/thinking-cat.jpg +0 -0
  273. data/spec/generators/solidus/views/override_generator_spec.rb +50 -0
  274. data/spec/helpers/base_helper_spec.rb +13 -0
  275. data/spec/helpers/order_helper_spec.rb +14 -0
  276. data/spec/helpers/taxon_filters_helper_spec.rb +12 -0
  277. data/spec/spec_helper.rb +64 -0
  278. data/spec/support/shared_contexts/checkout_setup.rb +12 -0
  279. data/spec/support/shared_contexts/custom_products.rb +28 -0
  280. data/spec/support/shared_contexts/locales.rb +16 -0
  281. data/spec/system/address_spec.rb +87 -0
  282. data/spec/system/automatic_promotion_adjustments_spec.rb +49 -0
  283. data/spec/system/caching/products_spec.rb +48 -0
  284. data/spec/system/caching/taxons_spec.rb +35 -0
  285. data/spec/system/cart_spec.rb +81 -0
  286. data/spec/system/checkout_confirm_insufficient_stock_spec.rb +71 -0
  287. data/spec/system/checkout_spec.rb +699 -0
  288. data/spec/system/checkout_unshippable_spec.rb +37 -0
  289. data/spec/system/coupon_code_spec.rb +267 -0
  290. data/spec/system/currency_spec.rb +20 -0
  291. data/spec/system/first_order_promotion_spec.rb +59 -0
  292. data/spec/system/free_shipping_promotions_spec.rb +60 -0
  293. data/spec/system/locale_spec.rb +26 -0
  294. data/spec/system/order_spec.rb +57 -0
  295. data/spec/system/products_spec.rb +302 -0
  296. data/spec/system/promotion_code_invalidation_spec.rb +54 -0
  297. data/spec/system/quantity_promotions_spec.rb +130 -0
  298. data/spec/system/taxons_spec.rb +158 -0
  299. data/spec/system/template_rendering_spec.rb +20 -0
  300. data/spec/views/spree/checkout/_summary_spec.rb +11 -0
  301. metadata +542 -0
data/Gemfile ADDED
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
5
+
6
+ branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
7
+ gem 'solidus_core', github: 'solidusio/solidus', branch: branch
8
+ gem 'solidus_api', github: 'solidusio/solidus', branch: branch
9
+ gem 'solidus_backend', github: 'solidusio/solidus', branch: branch
10
+ gem 'solidus_sample', github: 'solidusio/solidus', branch: branch
11
+ gem 'solidus_i18n', github: 'solidusio/solidus_i18n', branch: branch
12
+
13
+ # Needed to help Bundler figure out how to resolve dependencies,
14
+ # otherwise it takes forever to resolve them.
15
+ # See https://github.com/bundler/bundler/issues/6677
16
+ gem 'rails', '>0.a'
17
+
18
+ case ENV['DB']
19
+ when 'mysql'
20
+ gem 'mysql2'
21
+ when 'postgresql'
22
+ gem 'pg'
23
+ else
24
+ gem 'sqlite3'
25
+ end
26
+
27
+ gemspec
28
+
29
+ # Use a local Gemfile to include development dependencies that might not be
30
+ # relevant for the project or for other contributors, e.g. pry-byebug.
31
+ #
32
+ # We use `send` instead of calling `eval_gemfile` to work around an issue with
33
+ # how Dependabot parses projects: https://github.com/dependabot/dependabot-core/issues/1658.
34
+ send(:eval_gemfile, 'Gemfile-local') if File.exist? 'Gemfile-local'
data/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2020 Nebulab SRL
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification,
5
+ are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation
11
+ and/or other materials provided with the distribution.
12
+ * Neither the name Solidus nor the names of its contributors may be used to
13
+ endorse or promote products derived from this software without specific
14
+ prior written permission.
15
+
16
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,69 @@
1
+ # solidus_starter_frontend
2
+
3
+ `solidus_starter_frontend` is a new starter store for [Solidus][solidus]. This
4
+ extension aims to deliver a modern, minimal, semantic and easy to extend
5
+ frontend codebase for a more efficient bootstrapping experience.
6
+
7
+ **WARNING: this is an experimental extension and still in a very early stage of
8
+ development.**
9
+
10
+ ## Objectives
11
+
12
+ We aim to deliver:
13
+
14
+ - a minimal, semantic and accessible HTML skeleton
15
+ - a reusable component based architecture
16
+ - simple SASS styling strictly based on BEM
17
+ - the elimination of jQuery as a dependency by rewriting frontend functionality
18
+ in vanilla JavaScript
19
+
20
+ All of this while keeping and improving on the functionality of the current
21
+ [Solidus][solidus] starter store.
22
+
23
+ ## Installation
24
+
25
+ By default, the `solidus` gem also includes the standard frontend via
26
+ the `solidus_frontend` gem. To make this extension work, you need to
27
+ exclude it and manually include all the other Solidus componenents.
28
+
29
+ You need to replace:
30
+
31
+ ```ruby
32
+ gem 'solidus'
33
+ ```
34
+
35
+ with:
36
+
37
+ ```ruby
38
+ gem 'solidus_core'
39
+ gem 'solidus_api'
40
+ gem 'solidus_backend'
41
+ gem 'solidus_sample'
42
+ ```
43
+
44
+ Install our binary in the system: `gem install solidus_starter_frontend`
45
+
46
+ Execute our generator that will copy our component files in your project:
47
+ `solidus_starter_frontend`. Now you can start to customize your local views.
48
+
49
+ If Solidus was already installed with solidus_frontend you will have to change
50
+ all `Spree::Frontend::Config` in `SolidusStarterFrontend::Config`.
51
+
52
+ ## Development
53
+
54
+ For information about contributing to this project please refer to this
55
+ [document](docs/development.md).
56
+
57
+ ## About
58
+
59
+ [![Nebulab][nebulab-logo]][nebulab]
60
+
61
+ `solidus_starter_frontend` is funded and maintained by the [Nebulab][nebulab] team.
62
+
63
+ We firmly believe in the power of open-source. [Contact us][contact-us] if you
64
+ like our work and you need help with your project design or development.
65
+
66
+ [solidus]: http://solidus.io/
67
+ [nebulab]: http://nebulab.it/
68
+ [nebulab-logo]: http://nebulab.it/assets/images/public/logo.svg
69
+ [contact-us]: http://nebulab.it/contact-us/
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'solidus_dev_support/rake_tasks'
4
+ SolidusDevSupport::RakeTasks.install
5
+
6
+ task default: 'extension:specs'
@@ -0,0 +1,2 @@
1
+ //= link spree/frontend/all.js
2
+ //= link spree/frontend/all.css
@@ -0,0 +1,6 @@
1
+ /* Solidus Dummy app generator creates a vendor manifest in vendor/assets/javascripts/frontend/all
2
+ that requires this file: spree/frontend.
3
+ Inside solidus_starter_frontend we don't need anything from spree/frontend,
4
+ but the file must be there for the dummy application that expects it.
5
+ This approach is in order to don't have to make changes in the solidus_core
6
+ dummy app generator in the process of developing this extension. */
@@ -0,0 +1,26 @@
1
+ window.addEventListener('DOMContentLoaded', () => {
2
+ const cartForm = document.getElementById('update-cart');
3
+
4
+ if (cartForm) {
5
+ const deleteButtons = cartForm.querySelectorAll('input.delete');
6
+
7
+ deleteButtons.forEach(deleteButton => {
8
+ deleteButton.addEventListener('click', () => {
9
+ const lineItem = deleteButton.parentNode.parentNode;
10
+ lineItem.querySelector('.cart-item__quantity input').setAttribute('value', 0);
11
+ });
12
+ });
13
+
14
+ cartForm.addEventListener('submit', () => {
15
+ document.getElementById('update-button').setAttribute('disabled', true);
16
+ });
17
+ }
18
+ });
19
+
20
+ Solidus.fetch_cart = (cartLinkUrl) => {
21
+ fetch(cartLinkUrl || Solidus.pathFor('cart_link'))
22
+ .then(response => response.text())
23
+ .then(html => {
24
+ document.getElementById('link-to-cart').innerHTML = html;
25
+ });
26
+ };
@@ -0,0 +1,34 @@
1
+ //= require_self
2
+ //= require spree/frontend/checkout/address
3
+ //= require spree/frontend/checkout/payment
4
+
5
+ Solidus.disableSaveOnClick = () => {
6
+ const form = document.querySelector('form.edit_order');
7
+ form.addEventListener('submit', () => {
8
+ const elements = form.querySelectorAll('[type="submit"], [type="image"]');
9
+ elements.forEach(element => {
10
+ element.setAttribute('disabled', true);
11
+ element.classList.remove('primary');
12
+ element.classList.add('disabled');
13
+ });
14
+ });
15
+ };
16
+
17
+ window.addEventListener('DOMContentLoaded', () => {
18
+ const termsCheckbox = document.getElementById('accept_terms_and_conditions');
19
+
20
+ if (termsCheckbox) {
21
+ termsCheckbox.addEventListener('change', () => {
22
+ const submitButton = termsCheckbox.closest('form')
23
+ .querySelector('[type="submit"]');
24
+
25
+ if (termsCheckbox.checked) {
26
+ submitButton.removeAttribute('disabled');
27
+ submitButton.classList.remove('disabled');
28
+ } else {
29
+ submitButton.setAttribute('disabled', true);
30
+ submitButton.classList.add('disabled');
31
+ }
32
+ });
33
+ }
34
+ });
@@ -0,0 +1,124 @@
1
+ window.addEventListener('DOMContentLoaded', () => {
2
+ if (document.getElementById('checkout_form_address')) {
3
+ // Hidden by default to support browsers with javascript disabled
4
+ document.querySelectorAll('.js-address-fields')
5
+ .forEach(field => field.style.display = 'block');
6
+
7
+ const statesCache = {};
8
+
9
+ function updateState(stateContainer, countryId) {
10
+ if (statesCache[countryId]) {
11
+ fillStates(stateContainer, countryId);
12
+ return;
13
+ }
14
+
15
+ fetch(`${Solidus.routes.states_search}?country_id=${countryId}`)
16
+ .then(response => response.json())
17
+ .then(data => {
18
+ statesCache[countryId] = {
19
+ states: data.states,
20
+ states_required: data.states_required
21
+ };
22
+ fillStates(stateContainer, countryId);
23
+ });
24
+ };
25
+
26
+ function fillStates(stateContainer, countryId) {
27
+ const stateData = statesCache[countryId];
28
+
29
+ if (!stateData) {
30
+ return;
31
+ }
32
+
33
+ const statesRequired = stateData.states_required;
34
+ const states = stateData.states;
35
+
36
+ const stateSelect = stateContainer.querySelector('select');
37
+ const stateInput = stateContainer.querySelector('input');
38
+
39
+ if (states.length > 0) {
40
+ const selected = parseInt(stateSelect.value);
41
+ stateSelect.innerHTML = '';
42
+ const statesWithBlank = [{ name: '', id: ''}].concat(states);
43
+ statesWithBlank.forEach(state => {
44
+ const selectOption = document.createElement('option');
45
+ selectOption.value = state.id;
46
+ selectOption.innerHTML = state.name;
47
+ if (selected === state.id) {
48
+ selectOption.setAttribute('selected', true);
49
+ }
50
+ stateSelect.appendChild(selectOption);
51
+ })
52
+ stateSelect.style.display = 'block';
53
+ stateSelect.removeAttribute('disabled');
54
+ stateInput.style.display = 'none';
55
+ stateInput.setAttribute('disabled', true);
56
+ stateContainer.style.display = 'block';
57
+ if (statesRequired) {
58
+ stateSelect.classList.add('required');
59
+ stateContainer.classList.add('field-required');
60
+ } else {
61
+ stateSelect.classList.remove('required');
62
+ stateContainer.classList.remove('field-required');
63
+ }
64
+ stateInput.classList.remove('required');
65
+ } else {
66
+ stateSelect.style.display = 'none';
67
+ stateSelect.setAttribute('disabled', true);
68
+ stateInput.style.display = 'block';
69
+ if (statesRequired) {
70
+ stateContainer.classList.add('field-required');
71
+ stateInput.classList.add('required');
72
+ } else {
73
+ stateInput.value = '';
74
+ stateContainer.classList.remove('field-required');
75
+ stateInput.classList.remove('required');
76
+ }
77
+ stateContainer.style.display = !!statesRequired ? 'block' : 'none';
78
+ if (!statesRequired) {
79
+ stateInput.setAttribute('disabled', true);
80
+ } else {
81
+ stateInput.removeAttribute('disabled');
82
+ }
83
+ stateSelect.classList.remove('required');
84
+ }
85
+ };
86
+
87
+ document.querySelectorAll('.js-trigger-state-change').forEach(element => {
88
+ element.addEventListener('change', () => {
89
+ const stateContainer = document.querySelector(element.dataset.stateContainer);
90
+ if (stateContainer) {
91
+ const countryId = element.value;
92
+ updateState(stateContainer, countryId);
93
+ }
94
+ });
95
+ });
96
+
97
+ document.querySelectorAll('.js-trigger-state-change:not([hidden])').forEach(element => {
98
+ element.dispatchEvent(new Event('change'));
99
+ });
100
+
101
+ const orderUseBilling = document.getElementById('order_use_billing');
102
+ orderUseBilling.addEventListener('change', function() {
103
+ update_shipping_form_state(orderUseBilling);
104
+ });
105
+
106
+ function update_shipping_form_state(order_use_billing) {
107
+ const addressInputs = document.querySelectorAll('#shipping .address-inputs');
108
+ const inputs = document.querySelectorAll('#shipping .address-inputs input');
109
+ const selects = document.querySelectorAll('#shipping .address-inputs select');
110
+ if (order_use_billing.checked) {
111
+ addressInputs.forEach(addressInput => addressInput.style.display = 'none');
112
+ inputs.forEach(input => input.setAttribute('disabled', true));
113
+ selects.forEach(sel => sel.setAttribute('disabled', true));
114
+ } else {
115
+ addressInputs.forEach(addressInput => addressInput.style.display = 'block');
116
+ inputs.forEach(input => input.removeAttribute('disabled'));
117
+ selects.forEach(sel => sel.removeAttribute('disabled'));
118
+ document.querySelector('#shipping .js-trigger-state-change').dispatchEvent(new Event('change'));
119
+ }
120
+ };
121
+
122
+ update_shipping_form_state(orderUseBilling);
123
+ }
124
+ });
@@ -0,0 +1,44 @@
1
+ window.addEventListener('DOMContentLoaded', () => {
2
+ const form = document.querySelector('#checkout_form_payment');
3
+ const existingCards = document.querySelector('#existing_cards');
4
+
5
+ if (form) {
6
+ if (existingCards) {
7
+ const paymentMethodControls = document.querySelector('.payment-method-controls');
8
+ const useExistingCardYes = document.querySelector('#use_existing_card_yes');
9
+ const useExistingCardNo = document.querySelector('#use_existing_card_no');
10
+ const existingCcRadios = document.querySelectorAll('.existing-cc-radio');
11
+
12
+ paymentMethodControls.style.display = 'none';
13
+
14
+ useExistingCardYes.addEventListener('click', () => {
15
+ paymentMethodControls.style.display = 'none';
16
+ existingCcRadios.forEach(radio => radio.removeAttribute('disabled'));
17
+ });
18
+
19
+ useExistingCardNo.addEventListener('click', () => {
20
+ paymentMethodControls.style.display = 'block';
21
+ existingCcRadios.forEach(radio => radio.setAttribute('disabled', true));
22
+ });
23
+ }
24
+
25
+ const selectors = document
26
+ .querySelectorAll('input[type="radio"][name="order[payments_attributes][][payment_method_id]"]');
27
+
28
+ selectors.forEach(selector => {
29
+ selector.addEventListener('click', () => {
30
+ const controls = document.querySelectorAll('.payment-method-controls li');
31
+ controls.forEach(control => control.style.display = 'none');
32
+
33
+ if (selector.checked) {
34
+ const selectedControl = document.querySelector(`#payment_method_${selector.value}`);
35
+ selectedControl.style.display = 'block';
36
+ }
37
+ });
38
+ });
39
+
40
+ // Activate already checked payment method if form is re-rendered
41
+ // i.e. if user enters invalid data
42
+ document.querySelector('input[type="radio"]:checked').click();
43
+ }
44
+ });
@@ -0,0 +1,9 @@
1
+ window.addEventListener('DOMContentLoaded', () => {
2
+ const localeSelector = document.querySelector('.locale-selector select');
3
+
4
+ if(localeSelector) {
5
+ localeSelector.addEventListener('change', (event) => {
6
+ event.target.form.submit();
7
+ });
8
+ }
9
+ });
@@ -0,0 +1,21 @@
1
+ window.addEventListener('DOMContentLoaded', () => {
2
+ function updateVariantPrice(variant) {
3
+ const variantPrice = variant.dataset.price;
4
+ if (variantPrice) {
5
+ document.querySelector('.price.selling').innerHTML = variantPrice;
6
+ }
7
+ };
8
+
9
+ const radios = document.querySelectorAll('#product-variants input[type="radio"]');
10
+
11
+ if (radios.length > 0) {
12
+ const selectedRadio = document
13
+ .querySelector('#product-variants input[type="radio"][checked="checked"]');
14
+
15
+ updateVariantPrice(selectedRadio);
16
+ }
17
+
18
+ radios.forEach(radio => {
19
+ radio.addEventListener('click', () => updateVariantPrice(radio));
20
+ });
21
+ });
@@ -0,0 +1,9 @@
1
+ // Placeholder manifest file.
2
+ // the installer will append this file to the app vendored assets here: vendor/assets/javascripts/spree/frontend/all.js'
3
+
4
+ //= require spree
5
+ //= require spree/frontend/utils
6
+ //= require spree/frontend/checkout
7
+ //= require spree/frontend/product
8
+ //= require spree/frontend/cart
9
+ //= require spree/frontend/locale_selector
@@ -0,0 +1,18 @@
1
+ window.Solidus = {};
2
+
3
+ Solidus.mountedAt = () => {
4
+ return '<%= Rails.application.routes.url_helpers.spree_path(trailing_slash: true) %>';
5
+ };
6
+
7
+ Solidus.pathFor = (path) => {
8
+ const hostname = window.location.hostname;
9
+ const protocol = window.location.protocol;
10
+ const port = window.location.port;
11
+ const locationOrigin = protocol + '//' + hostname + (port ? ':' + port : '');
12
+ return locationOrigin + Solidus.mountedAt() + path;
13
+ };
14
+
15
+ Solidus.routes = {
16
+ states_search: Solidus.pathFor('api/states'),
17
+ apply_coupon_code: (order_id) => Solidus.pathFor('api/orders/' + order_id + '/coupon_codes')
18
+ };