Open Source multi-language/multi-currency/multi-store E-commerce platform for Ruby on Rails with a modern UX, PWA frontend, REST API, GraphQL, several official extensions, and 3rd party integrations.

Overview
Spree Commerce - complete open source e-commerce solution built with Ruby on Rails. PWA, Global Commerce, Headless Commerce

Spree Commerce

Gem Version Circle CI Test Coverage Slack Status

Spree is a complete open source e-commerce solution built with Ruby on Rails. It was started by Sean Schofield and is now developed by Spark Solutions. We're open to contributions.

Key Features

admin panel

  • Headless Commerce - build mobile apps or custom storefronts in any technology
  • PWA - offline shopping experiences like native mobile apps
  • Mobile-first Storefront - modern, ultra fast and responsive storefront designed for great UX as well as SEO
  • Global Commerce - multi currency and multi language support out of the box, different shipping methods / costs for different regions, advanced tax calculation
  • Multi-Store - host multiple brands / stores on one Spree instance with different branding, configuration, payment methods, shipping options, product catalogs etc
  • Responsive Admin Panel - manage and curate products, users, orders, returns, shipments & more
  • Orders - robust system for orders, shipments, returns and refunds
  • Carts - comprehensive and advanced discounts system
  • Payments - over 30 payment provider integration out of the box plus API to integrate any other gateway
  • Run everywhere - cloud, VPS, Docker, Kubernetes
  • Battle Tested - used by thousands of merchants around the globe in all categories since 2007!
  • Fully customizable - pick and choose parts you want to use and customize everything else (storefront, order processing, API, etc) to create unique solutions that your business requires
  • More features available via extensions - dozens of extensions built by community, ready for use for free!

multi store

Demo

See Spree in action: demo.spreecommerce.org

Or fire up your own demo on Heroku:

Deploy

Admin panel credentials for your own Heroku demo:

Installation

Option A - use Spree Starter with Docker

  1. Install Docker
  2. Download Spree Starter
  3. Unzip it
  4. Run bin/setup in spree_starter-main directory

Option B - add Spree to an existing Ruby on Rails application

  1. Please follow Add Spree to an existing Ruby on Rails application tutorial

Documentation

Go to Spree Guides

Extensions

Extensions provide additional features and integrations for your Spree store

Go to Extensions Directory

Contributing

Spree is an open source project and we love contributions in any form - pull requests, issues, feature ideas!

Please review the Contributing Guide

License

Spree is released under the New BSD License.

About Spark Solutions

Spark Solutions

Spark Solutions is a software development agency specialized in Ruby on Rails, Spree Commerce and Javascript development. We’ve been leading Spree open-source efforts since 2016 as its core team. We also do client work. Our project teams consist of UX and UI designers, Software Engineers, Testers and Project Managers practicing agile project delivery. We’ll integrate our team with yours to jointly architect, deliver, maintain and scale the software products you need. You drive the project with requirements and acceptance testing and we help you deliver faster using industry-standard project management and comms best practices.

We are passionate about open source software. We are available for hire.

Issues
  • Custom authentication

    Custom authentication

    Another month, another large pull request. Not content with ripping out pieces from the components of Spree, I decided to rip out an entire component. Particularly, the auth component.

    The reason for this was because attempting to use Spree in application that already had authentication proved troublesome. By ripping this component out and adding in hooks (Spree.user_class and Spree.current_user_method) to core for user things, we can allow for people to embed Spree into their applications and to use their application's authentication setup, rather than forcing them to use Devise.

    I am about to start working on a guide to document how you would go about doing this, and hopefully that would make it more clear how you could integrate Spree and the custom authentication from an application.

    Consider this the first draft for the custom authentication solution.

    opened by radar 91
  • SQL deadlocks when updating order

    SQL deadlocks when updating order

    Anyone else running into deadlocks with Spree sites? Here's an example I'm seeing - this happens maybe once a day or so...

    An ActiveRecord::StatementInvalid occurred in orders#update:
     Mysql2::Error: Deadlock found when trying to get lock; try restarting transaction: UPDATE `spree_adjustments` SET `amount` = -19.44 WHERE `spree_adjustments`.`id` = 1949
    

    stack trace:

     activerecord (3.2.11) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `query'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `block in execute'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract_adapter.rb:280:in `block in log'
     activesupport (3.2.11) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract_adapter.rb:275:in `log'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `execute'
     activerecord (3.2.11) lib/active_record/connection_adapters/mysql2_adapter.rb:211:in `execute'
     activerecord (3.2.11) lib/active_record/connection_adapters/mysql2_adapter.rb:238:in `exec_delete'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract/database_statements.rb:96:in `update'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract/query_cache.rb:14:in `update'
     activerecord (3.2.11) lib/active_record/relation.rb:294:in `update_all'
     activerecord (3.2.11) lib/active_record/relation.rb:278:in `update_all'
     activerecord (3.2.11) lib/active_record/querying.rb:7:in `update_all'
     spree_core (1.3.2) lib/spree/core/ext/active_record.rb:6:in `update_attributes_without_callbacks'
     spree_core (1.3.2) lib/spree/core/ext/active_record.rb:12:in `update_attribute_without_callbacks'
     spree_core (1.3.2) lib/spree/core/calculated_adjustments.rb:42:in `update_adjustment'
     spree_core (1.3.2) app/models/spree/adjustment.rb:63:in `update!'
     spree_core (1.3.2) app/models/spree/order_updater.rb:124:in `block in update_adjustments'
     activerecord (3.2.11) lib/active_record/associations/collection_proxy.rb:89:in `each'
     activerecord (3.2.11) lib/active_record/associations/collection_proxy.rb:89:in `method_missing'
     spree_core (1.3.2) app/models/spree/order_updater.rb:124:in `update_adjustments'
     spree_promo (1.3.2) app/models/spree/order_updater_decorator.rb:4:in `update_adjustments_with_promotion_limiting'
     spree_core (1.3.2) app/models/spree/order_updater.rb:24:in `update'
     spree_core (1.3.2) app/models/spree/order.rb:221:in `update!'
     spree_core (1.3.2) app/models/spree/line_item.rb:98:in `update_order'
     activesupport (3.2.11) lib/active_support/callbacks.rb:449:in `_run__929563180__save__404858987__callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `__run_callback'
     activesupport (3.2.11) lib/active_support/callbacks.rb:385:in `_run_save_callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:81:in `run_callbacks'
     activerecord (3.2.11) lib/active_record/callbacks.rb:264:in `create_or_update'
     activerecord (3.2.11) lib/active_record/persistence.rb:84:in `save'
     activerecord (3.2.11) lib/active_record/validations.rb:50:in `save'
     activerecord (3.2.11) lib/active_record/attribute_methods/dirty.rb:22:in `save'
     activerecord (3.2.11) lib/active_record/transactions.rb:259:in `block (2 levels) in save'
     activerecord (3.2.11) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
     activerecord (3.2.11) lib/active_record/transactions.rb:208:in `transaction'
     activerecord (3.2.11) lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
     activerecord (3.2.11) lib/active_record/transactions.rb:259:in `block in save'
     activerecord (3.2.11) lib/active_record/transactions.rb:270:in `rollback_active_record_state!'
     activerecord (3.2.11) lib/active_record/transactions.rb:258:in `save'
     activerecord (3.2.11) lib/active_record/autosave_association.rb:351:in `block in save_collection_association'
     activerecord (3.2.11) lib/active_record/autosave_association.rb:337:in `each'
     activerecord (3.2.11) lib/active_record/autosave_association.rb:337:in `save_collection_association'
     activerecord (3.2.11) lib/active_record/autosave_association.rb:191:in `block in add_autosave_association_callbacks'
     activerecord (3.2.11) lib/active_record/autosave_association.rb:161:in `instance_eval'
     activerecord (3.2.11) lib/active_record/autosave_association.rb:161:in `block in define_non_cyclic_method'
     activesupport (3.2.11) lib/active_support/callbacks.rb:413:in `_run__254847240__update__404858987__callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `__run_callback'
     activesupport (3.2.11) lib/active_support/callbacks.rb:385:in `_run_update_callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:81:in `run_callbacks'
     activerecord (3.2.11) lib/active_record/callbacks.rb:272:in `update'
     activerecord (3.2.11) lib/active_record/persistence.rb:348:in `create_or_update'
     activerecord (3.2.11) lib/active_record/callbacks.rb:264:in `block in create_or_update'
     activesupport (3.2.11) lib/active_support/callbacks.rb:460:in `block (2 levels) in _run__254847240__save__404858987__callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_1952'
     state_machine (1.1.2) lib/state_machine/integrations/active_record.rb:480:in `block in around_save'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:149:in `block in run_actions'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:169:in `catch_exceptions'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:147:in `run_actions'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:132:in `run_callbacks'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:211:in `run_callbacks'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:63:in `block (2 levels) in perform'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:63:in `catch'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:63:in `block in perform'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:185:in `within_transaction'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:62:in `perform'
     state_machine (1.1.2) lib/state_machine/integrations/active_record.rb:480:in `around_save'
     activesupport (3.2.11) lib/active_support/callbacks.rb:310:in `_callback_around_267'
     activesupport (3.2.11) lib/active_support/callbacks.rb:214:in `_conditional_callback_around_1952'
     activesupport (3.2.11) lib/active_support/callbacks.rb:404:in `block in _run__254847240__save__404858987__callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_1951'
     state_machine (1.1.2) lib/state_machine/integrations/active_record.rb:480:in `block in around_save'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:149:in `block in run_actions'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:169:in `catch_exceptions'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:147:in `run_actions'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:132:in `run_callbacks'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:211:in `run_callbacks'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:63:in `block (2 levels) in perform'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:63:in `catch'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:63:in `block in perform'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:185:in `within_transaction'
     state_machine (1.1.2) lib/state_machine/transition_collection.rb:62:in `perform'
     state_machine (1.1.2) lib/state_machine/integrations/active_record.rb:480:in `around_save'
     activesupport (3.2.11) lib/active_support/callbacks.rb:310:in `_callback_around_1135'
     activesupport (3.2.11) lib/active_support/callbacks.rb:214:in `_conditional_callback_around_1951'
     activesupport (3.2.11) lib/active_support/callbacks.rb:403:in `_run__254847240__save__404858987__callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `__run_callback'
     activesupport (3.2.11) lib/active_support/callbacks.rb:385:in `_run_save_callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:81:in `run_callbacks'
     activerecord (3.2.11) lib/active_record/callbacks.rb:264:in `create_or_update'
     activerecord (3.2.11) lib/active_record/persistence.rb:84:in `save'
     activerecord (3.2.11) lib/active_record/validations.rb:50:in `save'
     activerecord (3.2.11) lib/active_record/attribute_methods/dirty.rb:22:in `save'
     activerecord (3.2.11) lib/active_record/transactions.rb:259:in `block (2 levels) in save'
     activerecord (3.2.11) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
     activerecord (3.2.11) lib/active_record/transactions.rb:208:in `transaction'
     activerecord (3.2.11) lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
     activerecord (3.2.11) lib/active_record/transactions.rb:259:in `block in save'
     activerecord (3.2.11) lib/active_record/transactions.rb:270:in `rollback_active_record_state!'
     activerecord (3.2.11) lib/active_record/transactions.rb:258:in `save'
     activerecord (3.2.11) lib/active_record/persistence.rb:217:in `block in update_attributes'
     activerecord (3.2.11) lib/active_record/transactions.rb:313:in `block in with_transaction_returning_status'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
     activerecord (3.2.11) lib/active_record/transactions.rb:208:in `transaction'
     activerecord (3.2.11) lib/active_record/transactions.rb:311:in `with_transaction_returning_status'
     activerecord (3.2.11) lib/active_record/persistence.rb:215:in `update_attributes'
     spree_promo (1.3.2) app/controllers/spree/orders_controller_decorator.rb:5:in `update'
     actionpack (3.2.11) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
     actionpack (3.2.11) lib/abstract_controller/base.rb:167:in `process_action'
     actionpack (3.2.11) lib/action_controller/metal/rendering.rb:10:in `process_action'
     actionpack (3.2.11) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
     activesupport (3.2.11) lib/active_support/callbacks.rb:469:in `_run__213213310__process_action__167946110__callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `__run_callback'
     activesupport (3.2.11) lib/active_support/callbacks.rb:385:in `_run_process_action_callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:81:in `run_callbacks'
     actionpack (3.2.11) lib/abstract_controller/callbacks.rb:17:in `process_action'
     actionpack (3.2.11) lib/action_controller/metal/rescue.rb:29:in `process_action'
     actionpack (3.2.11) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action'
     activesupport (3.2.11) lib/active_support/notifications.rb:123:in `block in instrument'
     activesupport (3.2.11) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
     activesupport (3.2.11) lib/active_support/notifications.rb:123:in `instrument'
     actionpack (3.2.11) lib/action_controller/metal/instrumentation.rb:29:in `process_action'
     actionpack (3.2.11) lib/action_controller/metal/params_wrapper.rb:207:in `process_action'
     activerecord (3.2.11) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
     actionpack (3.2.11) lib/abstract_controller/base.rb:121:in `process'
     actionpack (3.2.11) lib/abstract_controller/rendering.rb:45:in `process'
     actionpack (3.2.11) lib/action_controller/metal.rb:203:in `dispatch'
     actionpack (3.2.11) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
     actionpack (3.2.11) lib/action_controller/metal.rb:246:in `block in action'
     actionpack (3.2.11) lib/action_dispatch/routing/route_set.rb:73:in `call'
     actionpack (3.2.11) lib/action_dispatch/routing/route_set.rb:73:in `dispatch'
     actionpack (3.2.11) lib/action_dispatch/routing/route_set.rb:36:in `call'
     journey (1.0.4) lib/journey/router.rb:68:in `block in call'
     journey (1.0.4) lib/journey/router.rb:56:in `each'
     journey (1.0.4) lib/journey/router.rb:56:in `call'
     actionpack (3.2.11) lib/action_dispatch/routing/route_set.rb:601:in `call'
     spree_core (1.3.2) lib/spree/core/middleware/redirect_legacy_product_url.rb:13:in `call'
     spree_core (1.3.2) lib/spree/core/middleware/seo_assist.rb:27:in `call'
     railties (3.2.11) lib/rails/engine.rb:479:in `call'
     railties (3.2.11) lib/rails/railtie/configurable.rb:30:in `method_missing'
     journey (1.0.4) lib/journey/router.rb:68:in `block in call'
     journey (1.0.4) lib/journey/router.rb:56:in `each'
     journey (1.0.4) lib/journey/router.rb:56:in `call'
     actionpack (3.2.11) lib/action_dispatch/routing/route_set.rb:601:in `call'
     exception_notification (3.0.0) lib/exception_notifier.rb:40:in `call'
     warden (1.2.1) lib/warden/manager.rb:35:in `block in call'
     warden (1.2.1) lib/warden/manager.rb:34:in `catch'
     warden (1.2.1) lib/warden/manager.rb:34:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
     rack (1.4.5) lib/rack/etag.rb:23:in `call'
     rack (1.4.5) lib/rack/conditionalget.rb:35:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/head.rb:14:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/params_parser.rb:21:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/flash.rb:242:in `call'
     rack (1.4.5) lib/rack/session/abstract/id.rb:210:in `context'
     rack (1.4.5) lib/rack/session/abstract/id.rb:205:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/cookies.rb:341:in `call'
     activerecord (3.2.11) lib/active_record/query_cache.rb:64:in `call'
     activerecord (3.2.11) lib/active_record/connection_adapters/abstract/connection_pool.rb:479:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
     activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `_run__940122328__call__404858987__callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:405:in `__run_callback'
     activesupport (3.2.11) lib/active_support/callbacks.rb:385:in `_run_call_callbacks'
     activesupport (3.2.11) lib/active_support/callbacks.rb:81:in `run_callbacks'
     actionpack (3.2.11) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/remote_ip.rb:31:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
     railties (3.2.11) lib/rails/rack/logger.rb:32:in `call_app'
     railties (3.2.11) lib/rails/rack/logger.rb:16:in `block in call'
     activesupport (3.2.11) lib/active_support/tagged_logging.rb:22:in `tagged'
     railties (3.2.11) lib/rails/rack/logger.rb:16:in `call'
     actionpack (3.2.11) lib/action_dispatch/middleware/request_id.rb:22:in `call'
     rack (1.4.5) lib/rack/methodoverride.rb:21:in `call'
     rack (1.4.5) lib/rack/runtime.rb:17:in `call'
     activesupport (3.2.11) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
     rack (1.4.5) lib/rack/lock.rb:15:in `call'
     rack-cache (1.2) lib/rack/cache/context.rb:136:in `forward'
     rack-cache (1.2) lib/rack/cache/context.rb:143:in `pass'
     rack-cache (1.2) lib/rack/cache/context.rb:155:in `invalidate'
     rack-cache (1.2) lib/rack/cache/context.rb:71:in `call!'
     rack-cache (1.2) lib/rack/cache/context.rb:51:in `call'
     railties (3.2.11) lib/rails/engine.rb:479:in `call'
     railties (3.2.11) lib/rails/application.rb:223:in `call'
     railties (3.2.11) lib/rails/railtie/configurable.rb:30:in `method_missing'
     passenger (3.0.11) lib/phusion_passenger/rack/request_handler.rb:96:in `process_request'
     passenger (3.0.11) lib/phusion_passenger/abstract_request_handler.rb:513:in `accept_and_process_next_request'
     passenger (3.0.11) lib/phusion_passenger/abstract_request_handler.rb:274:in `main_loop'
     passenger (3.0.11) lib/phusion_passenger/rack/application_spawner.rb:206:in `start_request_handler'
     passenger (3.0.11) lib/phusion_passenger/rack/application_spawner.rb:171:in `block in handle_spawn_application'
     passenger (3.0.11) lib/phusion_passenger/utils.rb:479:in `safe_fork'
     passenger (3.0.11) lib/phusion_passenger/rack/application_spawner.rb:166:in `handle_spawn_application'
     passenger (3.0.11) lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
     passenger (3.0.11) lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
     passenger (3.0.11) lib/phusion_passenger/abstract_server.rb:180:in `start'
     passenger (3.0.11) lib/phusion_passenger/rack/application_spawner.rb:129:in `start'
     passenger (3.0.11) lib/phusion_passenger/spawn_manager.rb:253:in `block (2 levels) in spawn_rack_application'
     passenger (3.0.11) lib/phusion_passenger/abstract_server_collection.rb:132:in `lookup_or_add'
     passenger (3.0.11) lib/phusion_passenger/spawn_manager.rb:246:in `block in spawn_rack_application'
     passenger (3.0.11) lib/phusion_passenger/abstract_server_collection.rb:82:in `block in synchronize'
     <internal:prelude>:10:in `synchronize'
     passenger (3.0.11) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
     passenger (3.0.11) lib/phusion_passenger/spawn_manager.rb:244:in `spawn_rack_application'
     passenger (3.0.11) lib/phusion_passenger/spawn_manager.rb:137:in `spawn_application'
     passenger (3.0.11) lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application'
     passenger (3.0.11) lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
     passenger (3.0.11) lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
     passenger (3.0.11) helper-scripts/passenger-spawn-server:99:in `<main>'
    
    opened by greinacker 80
  • Add cart to admin order edit

    Add cart to admin order edit

    Hi guys, this addresses #5132. Please leave any feedback and let's get this work merged. Thanks!

    opened by lexxrex 53
  • Can not override scss variables

    Can not override scss variables

    I place a copy of the variables file into app/assets/stylesheets/store directory so I can change a variable. It does not override the default file.

    Also, I don't even understand why the file is called _variables.scss. Wouldn't _variables.css.scss be a more appropriate name?

    opened by keilmillerjr 47
  • Issue with product paging - total number match but some product missing while others duplicate in different page

    Issue with product paging - total number match but some product missing while others duplicate in different page

    This is same issue of https://github.com/spree/spree/issues/2851 in 2.0.0. Ryan made a fix for issue 2851 and it seems worked. However other changes for 2.0.0 broke Ryan's fix.

    Please see the link for issue detail. In short, some products can appear multitimes in different pages while total product number is correct (some other products don't show in any page).

    Ryan's change was to change "SELECT DISTINCT(spree_products.id)" in the following to "SELECT DISTINCT ON spree_products.id"

    SELECT DISTINCT(spree_products.id), spree_products.*
    FROM "spree_products" INNER JOIN "spree_products_taxons" ON "spree_products_taxons"."product_id" = "spree_products"."id" 
        INNER JOIN "spree_taxons" ON "spree_taxons"."id" = "spree_products_taxons"."taxon_id"
    WHERE "spree_products"."deleted_at" IS NULL
        AND "spree_taxons"."id" IN (34)
        AND ("spree_products".available_on <= '2013-04-06 07:31:55.034422')
    LIMIT 12 OFFSET 24
    

    In 2.0.0, some other change made the query to be:

    SELECT DISTINCT "spree_products".id FROM "spree_products" INNER JOIN "spree_variants" ON "spree_variants"."product_id" = "spree_pro
    ducts"."id" AND "spree_variants"."is_master" = 't' INNER JOIN "spree_prices" ON "spree_prices"."variant_id" = "spree_variants"."id" INNER JOIN "spree_products_t
    axons" ON "spree_products_taxons"."product_id" = "spree_products"."id" INNER JOIN "spree_taxons" ON "spree_taxons"."id" = "spree_products_taxons"."taxon_id" WHE
    RE "spree_taxons"."id" IN (34) AND "spree_prices"."currency" = 'USD' AND ("spree_products".deleted_at IS NULL or "spree_products".deleted_at >= '2013-05-21 08:3
    9:20.239128') AND ("spree_products".available_on <= '2013-05-21 08:39:20.240128') AND (spree_prices.amount IS NOT NULL) LIMIT 12 OFFSET 24
    

    and

    SELECT DISTINCT ON (spree_products.id) spree_products.* FROM "spree_products" INNER JOIN "spree_variants" ON "spree
    _variants"."product_id" = "spree_products"."id" AND "spree_variants"."is_master" = 't' INNER JOIN "spree_prices" ON "spree_prices"."variant_id" = "spree_variant
    s"."id" INNER JOIN "spree_products_taxons" ON "spree_products_taxons"."product_id" = "spree_products"."id" INNER JOIN "spree_taxons" ON "spree_taxons"."id" = "s
    pree_products_taxons"."taxon_id" WHERE "spree_taxons"."id" IN (34) AND "spree_prices"."currency" = 'USD' AND ("spree_products".deleted_at IS NULL or "spree_prod
    ucts".deleted_at >= '2013-05-21 08:39:20.239128') AND ("spree_products".available_on <= '2013-05-21 08:39:20.240128') AND (spree_prices.amount IS NOT NULL)
    
    opened by colokoala 46
  • Creating an Order in the admin destroys shipments I specify

    Creating an Order in the admin destroys shipments I specify

    Tested on 2-2-stable and 2-3-stable.

    Create an order Add a line item coming from stock location 2 (1 is the default) Fill in the user's address. Go back to the order info page. Now you will see that the shipment is coming from stock location 1, not 2 as you specified.

    This is because moving to the deliver state on the order triggers the create_proposed_shipments method which destroys the shipments we already created and then recreates them with the default stock location.

    To fix this we can force the filling in of address information first. Thoughts?

    opened by lexxrex 43
  • taxonomy tree doesn't save taxon position

    taxonomy tree doesn't save taxon position

    1. Go to http://localhost:3000/en/shop/admin/taxonomies/1/edit
    2. Drag-drop child up or down position
    3. Ajax request is sent
    4. After refresh childs will be sorted in the same position as before

    Spree 2.0.3 Rails 3.2.13

    opened by NARKOZ 41
  • Stack level too deep while running spree migrations with ruby-1.9.3-p125

    Stack level too deep while running spree migrations with ruby-1.9.3-p125

    I have a working Rails 3.1.3 App.

    I installed the gem from http://rubygems.org via:

    gem install spree

    I used the spree 1.0.0 command line tool to install spree in my existing and working app:

    spree install

    1. It breaks because of missing production db (GH #1182)
    2. Running rake db:migrate by hand ends in following error:
    DEPRECATION WARNING: class_inheritable_attribute is deprecated, please use class_attribute method instead. Notice their behavior are slightly different, so refer to class_attribute documentation first. (called from <top (required)> at /Users/tvd/code/rails/cbl/config/application.rb:13)
    DEPRECATION WARNING: class_inheritable_attribute is deprecated, please use class_attribute method instead. Notice their behavior are slightly different, so refer to class_attribute documentation first. (called from <top (required)> at /Users/tvd/code/rails/cbl/config/application.rb:13)
    DEPRECATION WARNING: class_inheritable_attribute is deprecated, please use class_attribute method instead. Notice their behavior are slightly different, so refer to class_attribute documentation first. (called from <top (required)> at /Users/tvd/code/rails/cbl/config/application.rb:13)
    DEPRECATION WARNING: class_inheritable_attribute is deprecated, please use class_attribute method instead. Notice their behavior are slightly different, so refer to class_attribute documentation first. (called from <top (required)> at /Users/tvd/code/rails/cbl/config/application.rb:13)
    DEPRECATION WARNING: ref is deprecated and will be removed from Rails 3.2. (called from <top (required)> at /Users/tvd/code/rails/cbl/config/application.rb:13)
    DEPRECATION WARNING: new is deprecated and will be removed from Rails 3.2. (called from <top (required)> at /Users/tvd/code/rails/cbl/config/application.rb:13)
    ** Invoke db:migrate (first_time)
    ** Invoke environment (first_time)
    ** Execute environment
    rake aborted!
    stack level too deep
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:162
    Tasks: TOP => db:migrate => environment
    

    Removing gem 'spree' from my Gemfile not only removes all these crazy deprecation notices but let me run the migrations. Sadly only until this point:

    uninitialized constant AddCountOnHandToVariantsAndProducts::Variant
    /Users/tvd/.rvm/gems/[email protected]/gems/aws-s3-0.6.2/lib/aws/s3/extensions.rb:206:in `const_missing_from_s3_library'
    /Users/tvd/code/rails/cbl/db/migrate/20090923100315_add_count_on_hand_to_variants_and_products.rb:7:in `up'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:356:in `up'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:394:in `block (2 levels) in migrate'
    /Users/tvd/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/benchmark.rb:280:in `measure'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:394:in `block in migrate'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:185:in `with_connection'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:375:in `migrate'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:507:in `migrate'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:687:in `block (2 levels) in migrate'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:744:in `call'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:744:in `ddl_transaction'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:686:in `block in migrate'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:671:in `each'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:671:in `migrate'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:549:in `up'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/migration.rb:530:in `migrate'
    /Users/tvd/.rvm/gems/[email protected]/gems/activerecord-3.1.3/lib/active_record/railties/databases.rake:161:in `block (2 levels) in <top (required)>'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `block in execute'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
    /Users/tvd/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task'
    /Users/tvd/.rvm/gems/ruby-1.9.3[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block (2 levels) in top_level'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `block in top_level'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `block in run'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run'
    /Users/tvd/.rvm/gems/[email protected]/gems/rake-0.9.2.2/bin/rake:33:in `<top (required)>'
    /Users/tvd/.rvm/gems/[email protected]/bin/rake:19:in `load'
    /Users/tvd/.rvm/gems/[email protected]/bin/rake:19:in `<main>'
    Tasks: TOP => db:migrate
    
    opened by tvdeyen 41
  • precompile default spree store doesnt work (scss.css)

    precompile default spree store doesnt work (scss.css)

    Hi

    I tried to install spree with the command line tool in a clean rails 3.1.4 app (with therubyracer). everithing works well exept the assets:precompile at the end of installation.

    **************************************************
    Spree has been installed successfully. You're all ready to go!
    
    Enjoy!
    precompiling  assets
    /usr/local/rvm/rubies/ruby-1.9.3-p125/bin/ruby /usr/local/rvm/gems/ruby-1.9.3-p125/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
    [DEPRECATION WARNING] Nested I18n namespace lookup under "activerecord.attributes.spree/order" is no longer supported
    rake aborted!
    stack level too deep
      (in /usr/local/rvm/gems/ruby-1.9.3-p125/gems/spree_core-1.0.3/app/assets/stylesheets/store/screen.css.scss)
    
    Tasks: TOP => assets:precompile:primary
    (See full trace by running task with --trace)
    rake aborted!
    Command failed with status (1): [/usr/local/rvm/rubies/ruby-1.9.3-p125/bin/...]
    
    Tasks: TOP => assets:precompile
    (See full trace by running task with --trace)
    
    [email protected]:/var/www/railsapp# bundle show spree
    /usr/local/rvm/gems/ruby-1.9.3-p125/gems/spree-1.0.3
    [email protected]:/var/www/railsapp# bundle show rails
    /usr/local/rvm/gems/ruby-1.9.3-p125/gems/rails-3.1.4
    [email protected]:/var/www/railsapp# bundle show ruby
    

    Edit:

    Same problem in a "normal" spree installation (through Gemfile)

    Thanks

    Matthias

    opened by wandtasie 41
  • Make sure that the images aren't CMYK.

    Make sure that the images aren't CMYK.

    Make sure that images that are uploaded are in the RGB colorspace.

    opened by bishopandco 41
  • I18n - sometimes the singular translation is missing

    I18n - sometimes the singular translation is missing

    https://github.com/spree/spree/blob/1f33360591d75df38085e43356103376da5ba331/backend/app/helpers/spree/admin/base_helper.rb#L225

    Is not so correct to use this method in all admin's index views and for every language. For example in italian language the "order" word must be tranlated in "ordine" and the "orders" word in "ordini".

    For example in all admin's index views is present this

    Spree.t(:no_resource_found, resource: plural_resource_name(SpreeResourceName))
    

    that produces exclusively plural words. I’ve used a workaround with an helprer decorator with this code:

    Spree::Admin::BaseHelper.module_eval do   
       def plural_resource_name(resource_class, count = 2.1)    
         resource_class.model_name.human(count: count)   
      end 
    end
    
    opened by lorenzopagano 0
  • MetaData support for Products, Orders and other resources

    MetaData support for Products, Orders and other resources

    Is your feature request related to a problem? Please describe.

    Removes the need to add custom attributes to database models, add the ability to store any kind of project-related data in the standard DB schema

    Eg.

    product.metadata[:my_custom_tracking_info] = "UID1234"
    

    Describe the solution you'd like

    Use https://api.rubyonrails.org/classes/ActiveRecord/Store.html

    New Feature :tada: 
    opened by damianlegawiec 0
  • ArgumentError (wrong number of arguments (given 1, expected 0)) on .display_total caused by display_money.rb concern

    ArgumentError (wrong number of arguments (given 1, expected 0)) on .display_total caused by display_money.rb concern

    Context I have recently updated from Spree 4.2.5 to Spree 4.3.0.rc3.

    Expected Behavior Load admin orders page successfully.

    Actual Behavior I am unable to load the admin orders page on login, due to the following error: ActionView::Template::Error (wrong number of arguments (given 1, expected 0)):

    I have tracked this down to the following line: <td><%= order.display_total.to_html %></td>

    Indeed, this appears to be a wider issue related to the money_methods method in the Spree::DisplayMoney concern, as calling: Spree::Order.last.display_total in the rails console raises the following: ArgumentError (wrong number of arguments (given 1, expected 0))

    Possible Fix The issue appears to have been introduced in #11208 , as reverting back to the Spree::DisplayMoney concern in Spree 4.2.5 resolves the issue.

    Your Environment Spree 4.3.0.rc3 Ruby 2.6.7 Rails 6.0.3

    Thanks again team!

    opened by mdavo6 1
  • PG::NotNullViolation: ERROR:  column

    PG::NotNullViolation: ERROR: column "created_at" contains null values running migrations

    Context Upgrading from Spree 4.2.5 to Spree 4.3.0.rc3 following recommended approach. Running migrations after installation using bin/rails db:migrate

    Expected Behavior Successfully run migrations

    Actual Behavior 'PG::NotNullViolation: ERROR: column "created_at" contains null values' error

    Possible Fix Update line 9 of the CreateSpreeProductsStores migration, to add a default time. For example, change add_timestamps :spree_products_stores to add_timestamps :spree_products_stores, default: Time.current

    This resolved the issue for me, and migrations were able to run successfully.

    Steps to Reproduce As noted above, upgrade from Spree 4.2.5 to Spree 4.3.0.rc3 following recommended approach: https://dev-docs.spreecommerce.org/upgrades/upgrades/fout-dot-two-to-four-dot-three

    Your Environment Spree 4.3.0.rc3 Ruby 2.6.7 Rails 6.0.3

    Thanks for the great work guys!

    opened by mdavo6 1
  • Improve styles of footer logo

    Improve styles of footer logo

    Existing styles can potentially display a stretched logo and there are no validations or notices to the user to provide specific ratio for the logo. IMHO there also shouldn't be a restriction anyway. Proposing the css changes in this commit to allow the original logo to be displayed, while maintaining a max-width as to not overpower other elements in the default view template.

    opened by Tashows 1
  • Extract API v1 into `spree_api_v1` gem

    Extract API v1 into `spree_api_v1` gem

    As we're moving the Admin Panel to Platform API, we're abandoning any feature development of the API v1 which will be completely superseded by Platform API.

    Our plan is to extract API v1 into its separate gem spree_api_v1, so anyone still using that API will be able to do so.

    opened by damianlegawiec 0
Releases(v4.3.0)
  • v4.3.0(Sep 14, 2021)

    Major new features

    Modular API-first architecture

    Spree new architecture

    We've completely decoupled Storefront (spree_frontend), Admin Panel (spree_backend) and extracted transactional Emails into their own gem (spree_emails). Thanks to this you can:

    1. Easily replace Storefront and Admin Panel with your own
    2. Use the version of Storefront and Admin you like, so you can update the Spree Core and API without the need to upgrade these two
    3. Easily replace standard transactional emails with Klaviyo, Mailchimp, and other 3rd parties

    We're also making Spree less dependent on the Rails framework while supporting Rails 5.2, 6.0, and 6.1 on Ruby 2 and 3.

    Next.js Commerce integration

    Screenshots of Spree Commerce and NextJS Commerce

    Next.js Commerce is an all-in-one React starter kit for high-performance eCommerce sites. With the new API-first architecture it was very easy to connect Spree APIs via Spree SDK to the new blazing fast react storefront.

    BTW we have more storefront integrations news lined up in the coming weeks!

    Pages & Navigation CMS

    This release gives Spree users a powerful content management system that goes beyond creating basic text pages.

    Spree Content Management System allows you to create:

    Home Pages

    • Create many home pages per store.
    • Each home page is unique by language.
    • Add multiple sections to each home page.

    Standard Pages

    • Standard pages consist of WYSIWYG text editor content.
    • Each standard page has a slug that is unique to the store.
    • Each page is assigned a language.

    Feature pages

    • Feature pages use page sections.
    • Each feature page has a slug that is unique to the store.
    • Feature pages are assigned a language.

    Menus Users can create navigation menus for their Spree stores.

    Each menu is unique by language and location within the store and has the following features:

    • Menus contain many menu items. Each menu item can link to a product, taxon, URLs, home page, or CMS page.
    • Menu items can be nested inside other menu items creating nested links.
    • Menus can have container items used to organize links within the menu.
    • Menu items can have images allowing you to create promotions within the main menu.

    Platform API Developer Preview

    A new set of fast and modern APIs for application to application integrations based on oAuth 2.0 authentication and permissions. This API completely replaces API v1 which will be extracted from Spree core in 5.0. Platform API is built on the same foundations and technology as Storefront API which means JSON API format, Swagger (Open API) documentation, and oAuth 2.0 authentication.

    Spree new architecture

    Platform API is the biggest and most robust API for Spree with the biggest number of API endpoints to cover all features available in Admin Panel plus more.

    Advanced Product Filters

    We've greatly expanded the product filters feature. Now you can:

    • Filter by Properties - you can set which Properties should be filterable and the ones you choose will be visible and supported in the Storefront and API
    • Filter by Option Types - you can set which Option Types should be filterable and the ones you choose will be visible and supported in the Storefront and API
    • Storefront API will also return available filters for products in the Product API endpoint

    This way you can create new custom filters in the Admin UI from Option Types or Properties and the system will do the rest work for you.

    Installation

    Follow Getting Started guide

    Upgrade

    Follow 4.2 to 4.3 upgrade guide

    Noteworthy changes

    Please review each of the noteworthy changes to ensure your customizations or extensions are not affected. If you are affected by a change and have any suggestions, please submit a PR to help the next person!

    API

    • Added caching to API v2 serialized increasing API responsiveness 3-5 times Damian Legawiec

      This also includes new confirmation option Spree::Api::Config[:api_v2_cache_ttl] for the cache expiration TTL. Default value is 3600 (1 hour). Cache also auto-expires when cachd record is updated, more on this topic: https://github.com/jsonapi-serializer/jsonapi-serializer#caching

    • Added universal collection caching for Platform/Storefront API responses #11245

    • Increased API v2 per page limit to 500 #11257

    • Multi-Store Storefront Products API returns Products from the current Store Damian Legawiec

    • Multi-Store Storefront Account Orders API returns Orders from the current Store Damian Legawiec

    • Multi-Store Storefront Order Status API returns Order from the current Store Damian Legawiec

    • Multi-Store Return only Store resources in Storefront API, Platform API, and Storefront UI #11126 (damianlegawiec)

    • Fix API V2 Platform products by price sorting #11276 (szymoniwacz)

    • Platform API Classifications endpoints #11195 (damianlegawiec)

    • Platform API - Products endpoints #11194 (damianlegawiec)

    • Added API endpoint for changing cart currency #11331 (rafalcymerys)

    • Storefront API Products endpoint returns filter options with products #11318 (rafalcymerys)

    • Storefront API Adresses endpoint - display addresses from countries supported in the current store #11271 (v10110)

    • Add public preferences to payment methods in Storefront API Checkout endpoints #11301 (damianlegawiec)

    • Storefront Countries API returns all countries on a single page #11289 (damianlegawiec)

    • Fix API V2 Platform products by price sorting #11276 (szymoniwacz)

    • Storefront API / Platform API - allow to dynamically specify image dimensions/quality in API URLs to get the transformed image #11264 (damianlegawiec)

    Core

    • Multi-Store Order#available_payment_methods by default will return only Payment Methods available in Order's Store Damian Legawiec

      Passing store argument to that method will result in deprecation warning

    • Multi-Store Deprecated Store.current in favour of Stores::FindCurrent Damian Legawiec

      Also, this finder class can be replaced by custom one by setting

      Spree::Dependencies.current_store_finder = YourCustomStoreFinder
      

      in config/initializers/spree.rb (please check documentation)

    • Multi-Store Product, Promotion and PaymentMethod models require at least one Store associated Damian Legawiec

    • Multi-Store Promotion is now associated to multiple Store records via StorePromotion model Damian Legawiec

      You can disable this behaviour by setting:

      Spree::Config[:disable_store_presence_validation] = true
      

      in your config/initializers/spree.rb file

    • Multi-Store Store Credit model is now associated with Store Szymon Iwacz

    • Taxon model now requires Taxonomy presence and that Taxonymy needs to match Taxon's Parent (if present) Damian Legawiec

    • Transactional emails were extracted into a separate gem called spree_emails Damian Legawiec

    • Replaced twitter_cldr gem with much smaller validates_zipcode Damian Kaczmarczyk

    • Removed premailer-rails gem dependency Damian Legawiec

    • Removed rails dependency - only require Rails gems that we really use Damian Legawiec

    • Removed responders dependency Damian Legawiec

    • Removed sprockets dependency Damian Legawiec

    • Moved spree.js file to frontend/backend Damian Legawiec

    • Moved polyfill.min.js and fetch.umd.js files to frontend Damian Legawiec

    • Moved cleave.js file to frontend/backend Damian Legawiec

    • Moved jquery.payment.js file to frontend Damian Legawiec

    • Migrate User Roles code from Spree Auth Devise to Spree Core #11108 (damianlegawiec)

    • Change integer id columns into bigint #11182 (szymoniwacz)

    Admin Panel

    • Full Multi Store support with Store switcher #11099 (Vegann & MatthewKennedy)
    • Change the taxon autocomplete to use Platform API. #11244 (MatthewKennedy)
    • Use RTE for product description. #11181 (MatthewKennedy)
    • Automatically set Store and Currency when creating resources in Admin UI #11096 (damianlegawiec)
    • Added admin panel stock menu for stock locations and transfers #11134 (aplegatt)

    Storefront

    • Upgraded Sprockets to v4 and added support for ES6, Source Maps and Manifest.js Damian Legawiec
    • Multi-Store Only Store Orders are returned Damian Legawiec
    • Multi-Store Only Store Products are returned Damian Legawiec
    • Added clearing all filters on PLP / Taxon page Lukasz Adamczyk
    • Added filtering Products on PLP by a custom price range Lukasz Adamczyk
    • Display only these Product Filters that have Products attached Lukasz Adamczyk
    • Allow user to sort products by name on PLP #11091 (Vegann)

    Full Changelog

    CHANGELOG.md

    Source code(tar.gz)
    Source code(zip)
  • v4.3.0.rc2(Aug 23, 2021)

    Source code(tar.gz)
    Source code(zip)
  • v4.3.0.rc1(Aug 11, 2021)

    Major/New Features

    Modular API-first architecture

    Monolith is gone replaced with a truly headless modular design!

    We've completely decoupled Storefront (spree_frontend), Admin Panel (spree_backend) and extracted transactional Emails into their own gem (spree_emails). Thanks to this you can:

    1. Easily replace Storefront and Admin Panel with your own
    2. Use the version of Storefront and Admin you like, so you can update the Spree Core and API without the need to upgrade these two
    3. Easily replace standard transactional emails with Klaviyo, Mailchimp and other 3rd parties

    We're also making Spree less dependent on the Rails framework, while supporting Rails 5.2, 6.0 and 6.1 on Ruby 2 and 3.

    Pages & Navigation CMS

    This release gives Spree users a powerful content management system that goes beyond creating basic text pages.

    Spree Content Management System allows you to create:

    Home Pages

    • Create many home pages per store.
    • Each home page is unique by language.
    • Add multiple sections to each home page.

    Standard Pages

    • Standard pages consist of WYSIWYG text editor content.
    • Each standard page has a slug that is unique to the store.
    • Each page is assigned a language.

    Feature pages

    • Feature pages use page sections.
    • Each feature page has a slug that is unique to the store.
    • Feature pages are assigned a language.

    Menus Users can create navigation menus for their Spree stores.

    Each menu is unique by language and location within the store and has the following features:

    • Menus contain many menu items. Each menu item can link to a product, taxon, URLs, home page or CMS page.
    • Menu items can be nested inside other menu items creating nested links.
    • Menus can have container items used to organize links within the menu.
    • Menu items can have images allowing you to create promotions within the main menu.

    Platform API Developer Preview

    A new set of fast and modern APIs for application to application integrations based on oAuth 2.0 authentication and permissions. This API completely replaces API v1 which will be extracted from Spree core in 5.0. Platform API is built on the same foundations and technology as Storefront API that means JSON API format, Swagger (Open API) documentation and oAuth 2.0 authentication.

    Platform API is the biggest and most robust API for Spree with the biggest number of API endpoints to cover all features available in Admin Panel plus more. All API v1 usage in Admin Panel was also replaced with Platform API.

    Advanced Product Filters

    We've greatly expanded product filters feature. Now you can:

    1. Filter by Properties - you can set which Properties should be filterable and the ones you choose will be visible and supported in the Storefront and API
    2. Filter by Option Types - you can set which Oprion Types should be filterable and the ones you choose will be visible and supported in the Storefront and API
    3. Filters on Storefront, both Properties and Option Types will be automatically shown only when Products in selected Taxon have these Option Types/Properties attached, same goes for values, we're only displaying values from Products in the given Taxon

    This way you can create new custom filters in the Admin UI from Option Types or Properties and the system will do the rest work for you.

    Installation

    1. Install Docker
    2. Download Spree Starter
    3. Unzip it
    4. Run bin/setup in spree_starter-main directory

    Upgrade

    Follow 4.2 to 4.3 upgrade guide

    Noteworthy changes

    Please review each of the noteworthy changes to ensure your customizations or extensions are not affected. If you are affected by a change and have any suggestions, please submit a PR to help the next person!

    Storefront

    API

    • Added caching to API v2 serialized increasing API responsiveness 3-5 times Damian Legawiec

      This also includes new confirmation option Spree::Api::Config[:api_v2_cache_ttl] for the cache expiration TTL. Defualt value is 3600 (1 hour). Cache also auto-expires when cachd record is updated, more on this topic: https://github.com/jsonapi-serializer/jsonapi-serializer#caching

    • Multi-Store Storefront Products API returns Products from the current Store Damian Legawiec

    • Multi-Store Storefront Account Orders API returns Orders from the current Store Damian Legawiec

    • Multi-Store Storefront Order Status API returns Order from the current Store Damian Legawiec

    Core

    • Multi-Store Order#available_payment_methods by default will return only Payment Methods available in Order's Store Damian Legawiec

      Passing store argument to that method will result in deprecation warning

    • Multi-Store Deprecated Store.current in favour of Stores::FindCurrent Damian Legawiec

      Also, this finder class can be replaced by custom one by setting

      Spree::Dependencies.current_store_finder = YourCustomStoreFinder
      

      in config/initializers/spree.rb (please check documentation)

    • Multi-Store Product, Promotion and PaymentMethod models require at least one Store associated Damian Legawiec

    • Multi-Store Promotion is now associated to multiple Store records via StorePromotion model Damian Legawiec

      You can disable this behaviour by setting:

      Spree::Config[:disable_store_presence_validation] = true
      

      in your config/initializers/spree.rb file

    • Multi-Store Store Credit model is now associated with Store Szymon Iwacz

    • Taxon model now requires Taxonomy presence and that Taxonymy needs to match Taxon's Parent (if present) Damian Legawiec

    • Transactional emails were extracted into a separate gem called spree_emails Damian Legawiec

    • Replaced twitter_cldr gem with much smaller validates_zipcode Damian Kaczmarczyk

    • Removed premailer-rails gem dependency Damian Legawiec

    • Removed rails dependency - only require Rails gems that we really use Damian Legawiec

    • Removed responders dependency Damian Legawiec

    • Removed sprockets dependency Damian Legawiec

    • Moved spree.js file to frontend/backend Damian Legawiec

    • Moved polyfill.min.js and fetch.umd.js files to frontend Damian Legawiec

    • Moved cleave.js file to frontend/backend Damian Legawiec

    • Moved jquery.payment.js file to frontend Damian Legawiec

    Full Changelog

    You can view the full changes using Github Compare.

    Source code(tar.gz)
    Source code(zip)
  • v4.2.5(May 31, 2021)

    Spree 4.2 now runs on Rails 5.2, 6.0, and 6.1 🚀

    Core

    • Added more flexibility for Product validation https://github.com/spree/spree/commit/ab117b0b024017ab7ed99a05dcc819215f2c925f
    • Relax dependencies to allow for more flexibility with Gemfiles https://github.com/spree/spree/commit/853bc790d43a2df705d01f7ddfd13f1cc8919ac3

    Storefront

    • Fixed JS undefined errors when the application does not use the updated 4.2 views https://github.com/spree/spree/commit/a7096f66d1a7e1a943007b0e99271775210767fc
    • Add spree current user to the base cache key https://github.com/spree/spree/commit/cb543445ef1db50bb1ffe052cc4224d060d4c30e
    • Fixed localizedPathFor function for API addresses https://github.com/spree/spree/commit/432a890871d38498486ab3c0ea50b8bd490b1d31

    API

    • Fixed filtering Products by multiple options https://github.com/spree/spree/commit/9534cd0aed3609d0bebd736794e8446af8d8fece
    Source code(tar.gz)
    Source code(zip)
  • v4.1.14(May 31, 2021)

    • Spree 4.1 now runs on both Rails 5.2 and 6.0 :rocket:
    • Fixed compatibility with Doorkeeper 5.5+ https://github.com/spree/spree/commit/da19a8fab8595cff267ae523dc43d51d1aa2b66b
    Source code(tar.gz)
    Source code(zip)
  • v4.0.8(May 31, 2021)

    • Spree 4.0 now runs on both Rails 5.2 and 6.0 :rocket:
    • Fixed compatibility with Doorkeeper 5.5+ https://github.com/spree/spree/commit/da19a8fab8595cff267ae523dc43d51d1aa2b66b
    Source code(tar.gz)
    Source code(zip)
  • v4.2.3.1(May 5, 2021)

  • v4.1.13.1(May 5, 2021)

  • v4.0.7.1(May 5, 2021)

  • v3.7.14.1(May 5, 2021)

  • v4.2.3(May 5, 2021)

    This patch release contains bug fixes backported from the master branch. We'd like to thank all the contributors who made this happen 👍

    API

    • Fixed: do not return (soft) deleted Addresses in Storefront API Account Address endpoint https://github.com/spree/spree/commit/cb10e881db2d5f4fe67b57a20ecac92e66f64b22
    • Fixed scope for admin users in Storefront API Account Credit Cards https://github.com/spree/spree/commit/dd3d234d30de911b5987343d8f020d3d6f9b5ad6

    Full changelog: https://github.com/spree/spree/compare/v4.2.2...v4.2.3

    Source code(tar.gz)
    Source code(zip)
  • v4.2.2(Apr 26, 2021)

    This patch release contains bug fixes backported from the master branch. We'd like to thank all the contributors who made this happen 👍

    Storefront

    • Fixed Spree.localizedPathFor method https://github.com/spree/spree/commit/7df40f5bc9cd8b369b8da8b3e173514f4d871025
    • Made product modal reusable https://github.com/spree/spree/commit/30e081daf2ae13409076ecec666059c449f7a75c
    • Added support for different cache keys for signed/not-signed/admin users when viewing Storefront cached pages https://github.com/spree/spree/commit/f7fffbf56bc114941cdf0496240ac56d6eb80f7c

    API

    • Added missing destroy address API v2 endpoint https://github.com/spree/spree/commit/24152ef5806b0184c8a5d8af8e5e47b26ec3df03
    • Fix jsonapi_serializer compatibility with version > 2.2 https://github.com/spree/spree/commit/cd681ed99583e01d9f912a7bef05e01436922899

    Admin Panel

    • Fixed Added missing "'" in the link in store_form https://github.com/spree/spree/commit/622a2454d1251a92d5775f479353b636bc45f30f

    Full changelog: https://github.com/spree/spree/compare/v4.2.1...v4.2.2

    Source code(tar.gz)
    Source code(zip)
  • v4.2.1(Mar 5, 2021)

    This patch release contains bug fixes backported from the master branch. We'd like to thank all the contributors who made this happen 👍

    Storefront

    • Fixed turbolinks caching issues with currency change https://github.com/spree/spree/pull/10812
    • Include currency symbol in currency dropdown https://github.com/spree/spree/commit/952373d63546d34e4a4d9d2e4f14780139ece127
    • Use Spree.localizedPathFor for couponc code apply/remove in CouponManager https://github.com/spree/spree/commit/a59bf8fc895ccd350dfed51c40ef120a8523f7b9

    API

    • Fixed #10816 https://github.com/spree/spree/commit/eb4fab8dcdf8a90a73707f5bcbd2813cab6e6e76

    Admin Panel

    • Fixed taxon promotion rule form https://github.com/spree/spree/commit/e5058237770ba182a34c8c643abd62000e5b0ea7

    Full changelog: https://github.com/spree/spree/compare/v4.2.0...v4.2.1

    Source code(tar.gz)
    Source code(zip)
  • v4.0.7(Mar 5, 2021)

    This patch release contains bug fixes backported from the master branch. We'd like to thank all the contributors who made this happen 👍

    Fixes

    • Ruby 2.7 support
    Source code(tar.gz)
    Source code(zip)
  • v3.7.14(Mar 4, 2021)

    This patch release contains bug fixes backported from the master branch. We'd like to thank all the contributors who made this happen 👍

    Fixes

    • Ruby 2.7 support
    • fixed removing items when removing promotions that added those items https://github.com/spree/spree/commit/cd9566581c14edadf515a6bd52d457b30460494f

    Full list of changes: https://github.com/spree/spree/compare/v3.7.13...v3.7.14

    Source code(tar.gz)
    Source code(zip)
  • v4.2.0(Feb 25, 2021)

    Spree 4.2 is a collaborative work of 34 outstanding individuals from around the globe who contributed over 1500 commits since Spree 4.1.

    This release was intended to make Spree accessible to everyone in every country using every major language. Besides new features, this release includes hundreds of bug fixes and improvements.

    Major/New Features

    Ruby 3.0 and Rails 6.1 support

    Spree 4.2 can be run on Ruby 2.5, 2.6, 2.7, and recently released 3.0. Spree 4.2 supports both Rails 6.0 and 6.1 out of the box, so you don't need to upgrade to Rails 6.1 straight away, you can first move to Spree 4.2 and later perform the Rails upgrade, minimizing the risk of any issues. Please see Rails 6.1 announcement to check out the new amazing features that are packed in that release.

    New responsive Admin Panel UI

    Spree responsive Admin Panel

    Thanks to the awesome work of Matthew Kennedy supported by the Spark team, we were able to deliver a brand new and modern Admin UI which works great on mobile and tablet devices.

    This was done in a gradual enhancement process of the current codebase, so all of the existing Extensions and customizations will still work as it is fully backward compatible.

    The next releases will bring more Admin UI improvements such as a new Reporting dashboard.

    Built-in Multi-Currency and Multi-Language

    We've pulled the best parts of Spree Multi-Currency gem of Spree I18n into Spree itself and improved upon it combined with new multi Store support.

    • each Store can have a default currency and a list of other supported currencies - this will affect products shown in each Store (only Products with prices in those currencies)

    • each Store can have a default locale (language) and a list of other supported locales

    • each Product can have different prices in each currency for different Variants

    • you can have multiple Stores with different default locales/currencies or a single Store with multiple locales/languages which you can switch between in the Storefront UI

    • API v1 and v2 also support this by simply passing ?locale=fr and/or ?currency=EUR in the URL

    • Locale and Currency settings will be also respected in all Spree extensions

    • Additional language packs are available via Spree I18n gem

    Improved MultiStore support

    Spree Multi-Currency and Multi-Language

    Besides currency and language, we've greatly improved the Multi-Store support in Spree.

    There are new additional settings and features for Store management available in the Admin UI:

    • Logo - you can now upload logos through the Admin Panel for each Store :) (Spark Solutions)

    • Mailer Logo - same as above, but it will be displayed in the email notifications (Spark Solutions)

    • Checkout Zone - which Zone record is used for Checkout; this limits the Checkout for selected Countries or States (Spark Solutions)

    • Default Country - which country should be pre-selected on Checkout Address (Spark Solutions)

    • Order Notification Email for Store Owners (Derek Johnson)

    • Checkout Payment Methods - which Payment Methods should be available in each Store. Each payment method can now be assigned to multiple stores instead of one (Spark Solutions and Matthew Kennedy)

    • Store Contact info that appears in the Storefront footer can now be set in the UI Spark Solutions

    New modern mobile first Email templates

    Spree responsive transactional emails

    Thanks to the El Passion team we now have brand new and mobile-first email templates for notifications such as Order Confirmation, Shipment notification and so on. All emails were rebuilt with Postmark Email Templates to meet current needs and standards.

    To improve developer happiness our friends at El Passion prepared email previews for all email types to make it more convenient to work with emails in a development environment.

    As part of these improvements, more of the email layouts can be managed via Admin UI, this includes:

    • setting a different logo for each Store
    • setting the locale (language) of a Store will be reflected in emails which will be translated automatically, based on Spree I18n
    • setting the Store name will automatically change the copy in emails
    • all URLs in emails will point to the selected Store; this is also supported by Spree Auth Devise emails as well

    WCAG 2.1 AA compatible Storefront

    We've invested a lot of time to make the default Storefront accessible for everyone. We've enhanced Storefront to be compatible with all Web Content Accessibility Guidelines version 2.1.

    Installation

    1. Install Docker
    2. Download Spree Starter
    3. Unzip it
    4. Run bin/setup in spree_starter-main directory

    Upgrade

    Follow 4.1 to 4.2 upgrade guide

    Noteworthy changes

    Please review each of the noteworthy changes to ensure your customizations or extensions are not affected. If you are affected by a change and have any suggestions, please submit a PR to help the next person!

    Storefront

    API

    • Added API v2 Stores endpoints Prabin Poudel

    • Added concat_taxons filter to API v2 Products endpoint Florian Bergmann

    • Moved from fast_jsonapi to jsonapi-serializer Spark Solutions

    • Fixed N+1 queries on /api/v2/storefront/taxons Yann Petitjean

    • API v1 controllers now inherit from ActionController::API rather than ActionController::Base

    Admin Panel

    Core

    Full Changelog

    You can view the full changes using Github Compare.

    Source code(tar.gz)
    Source code(zip)
  • v4.2.0.rc5(Feb 4, 2021)

  • v4.2.0.rc4(Jan 20, 2021)

  • v4.2.0.rc3(Jan 18, 2021)

  • v4.2.0.rc2(Nov 10, 2020)

  • v4.1.12(Nov 10, 2020)

  • v3.7.13(Nov 10, 2020)

  • v3.7.12(Nov 4, 2020)

    This patch release contains bug fixes backported from the master branch. We'd like to thank all the contributors who made this happen 👍

    API v2

    • align API v2 internal methods to match Spree 4.x https://github.com/spree/spree/commit/bd1dfbfb5f73ca6ec374caeafa40f2d703440550
    Source code(tar.gz)
    Source code(zip)
  • v4.2.0.rc1(Oct 15, 2020)

  • v4.1.11(Oct 15, 2020)

    This security release is recommended for all Spree 4.11 installations

    API

    • ⚠️ SECURITY ensures that doorkeeper_token is valid when authenticating requests in API v2 calls https://github.com/spree/spree/commit/e43643abfe51f54bd9208dd02298b366e9b9a847
    • Added pre_tax_total and display_pre_tax_total in Cart API v2
    • Added pre_tax_item_amount and display_pre_tax_item_amount in Cart API v2 https://github.com/spree/spree/commit/995f3d0df86b6b911bca041fbbe9e6aaa390c17f
    • Added display_pre_tax_amount for LineItem in Cart API v2
    • API v2 always include shipping rates as shipment relationship in Checkout Shipping Rates endpoint

    Core

    • Added Order#pre_tax_total and Order#display_pre_tax_total https://github.com/spree/spree/commit/1de0f4e073705a8140ad24e103e2b449663a8dcd
    • Optimize Order#pre_tax_item_amount and add Order#display_pre_tax_item_amount https://github.com/spree/spree/commit/14121fec7f140de3777df859061327639816a5d3
    Source code(tar.gz)
    Source code(zip)
  • v4.0.4(Oct 15, 2020)

    ⚠️ This security release is recommended for all Spree 4.0 installations ⚠️

    Fixes security issue ensuring that doorkeeper_token is valid when authenticating requests in API v2 calls

    Source code(tar.gz)
    Source code(zip)
  • v3.7.11(Oct 15, 2020)

    ⚠️ This security release is recommended for all Spree 3.7 installations ⚠️

    Fixes security issue ensuring that doorkeeper_token is valid when authenticating requests in API v2 calls

    Source code(tar.gz)
    Source code(zip)
  • v4.1.10(Sep 23, 2020)

    This patch release contains bug fixes backported from the master branch. We'd like to thank all the contributors who made this happen 👍

    API

    • API v2 - added Address Book API endpoints https://github.com/spree/spree/pull/10485
    • API v2 - added Store API endpoint https://github.com/spree/spree/pull/10453
    • API v2 - fixed - set order state to delivery if selected shipping rate is changed https://github.com/spree/spree/pull/10480
    Source code(tar.gz)
    Source code(zip)
  • v4.2.0.beta(Sep 2, 2020)

Owner
Spree Commerce
Open-source eCommerce platform for @rails with a modern UX, optional PWA frontend, REST API and GraphQL. Developed by @spark-solutions. See also @spree-contrib
Spree Commerce
Squash’s front-end and API host.

Squash: A squarish bug spray An open-source project from Square Squash is a collection of tools that help engineers find and kill bugs in their code b

null 968 Sep 9, 2021
Sharetribe Go is a source available marketplace software, also available as a hosted, no-code SaaS product. For a headless, API-first marketplace solution, check out Sharetribe Flex: https://www.sharetribe.com/flex.

Sharetribe Sharetribe develops advanced marketplace software for every business life cycle stage. Sharetribe Go gives you the complete feature set to

Sharetribe 2.2k Sep 24, 2021
Open source back-end server for web, mobile and IoT. The backend for busy developers. (self-hosted or hosted)

A scalable, multitenant backend for the cloud. Para is a scalable, multitenant backend server/framework for object persistence and retrieval. It helps

Erudika 408 Sep 20, 2021
The Rails application that powers OpenStreetMap

"The Rails Port" This is The Rails Port, the Ruby on Rails application that powers the OpenStreetMap website and API. The software is also known as "o

OpenStreetMap on GitHub 1.4k Sep 20, 2021
A platform for community discussion. Free, open, simple.

Discourse is the 100% open source discussion platform built for the next decade of the Internet. Use it as a: mailing list discussion forum long-form

Discourse 34.1k Sep 24, 2021
An agile project planning tool

Fulcrum Fulcrum is an application to provide a user story based backlog management system for agile development teams. See the project page for more d

null 1.5k Sep 19, 2021
visualCaptcha's Main Repo. This is a collection of all the different versions/repos of visualCaptcha.

visualCaptcha Please note visualCaptcha is no longer actively developed. It still works and should continue to, but it won't be improved by the initia

null 405 Sep 2, 2021
Popcorn Time is a multi-platform, free software BitTorrent client that includes an integrated media player ( Windows / Mac / Linux ) A Butter-Project Fork

Popcorn Time A multi-platform, free software BitTorrent client that includes an integrated media player. Visit the project's website at popcorntime.ap

Popcorn Software 6.3k Sep 15, 2021
Self hosted identity verification layer with GraphQL.

graph-vl Self hosted identity verification layer with GraphQL. Introduction graph-vl is the verification layer of verifid developed with GraphQL. It's

VerifID 20 Jul 21, 2021
NO LONGER MAINTAINED - Project management and time tracking should be easy. SprintApp is simple to setup, simple to use, and elegant - making you look like a hero in your organization.

SprintApp DEPRECATED This project has not seen any community contributions for a year now, and I have not had time for the project, or the need, for a

Matthew Millsaps-Brewer 304 Aug 12, 2021
Open source API management platform

About Fusio is an open source API management platform which helps to build and manage REST APIs. Fusio provides all tools to quickly build an API from

Apioo 997 Sep 15, 2021
Predictive AI layer for existing databases.

Website | Docs | API Docs | Community forum MindsDB is an open-source AI layer for existing databases that allows you to effortlessly develop, train a

MindsDB Inc 3.9k Sep 17, 2021
A Hassle-Free Way to Self-Host Google Fonts. Get eot, ttf, svg, woff and woff2 files + CSS snippets

google-webfonts-helper A Hassle-Free Way to Self-Host Google Fonts This service might be handy if you want to directly download all .eot, .woff, .woff

Mario Ranftl 8.5k Sep 23, 2021
Linux Application Launcher

Master: Dev: Application Launcher for Linux ?? Ulauncher is a fast application launcher for Linux. It's is written in Python, using GTK+. App Search F

Ulauncher 2.2k Sep 14, 2021
Professional network for software engineers

A community for developers to unlock & share new skills. Contributing & Getting Started IMPORTANT: Please see our /master/CONTRIBUTING.md for instruct

coderwall.com 863 Sep 21, 2021
Self-hosted VirusTotal / MetaDefender wannabe with API, demo UI and Scanners running in Docker.

MalwareMultiScan Self-hosted VirusTotal / OPSWAT MetaDefender wannabe API for scanning URLs and files by multiple antivirus solutions. IMPORTANT: vers

Volodymyr Smirnov 237 Sep 14, 2021
Create agents that monitor and act on your behalf. Your agents are standing by!

What is Huginn? Huginn is a system for building agents that perform automated tasks for you online. They can read the web, watch for events, and take

Huginn 32.3k Sep 25, 2021
Source code for Gramps Genealogical program

The Gramps Project ( https://gramps-project.org ) We strive to produce a genealogy program that is both intuitive for hobbyists and feature-complete f

Gramps Project 1.3k Sep 13, 2021