Class: Spree::Checkout::Registry
- Inherits:
-
Object
- Object
- Spree::Checkout::Registry
- Defined in:
- app/models/spree/checkout/registry.rb
Overview
Global registry for custom checkout steps and requirements.
Provides a composable extension point so developers can add, remove, or reorder checkout steps and attach extra requirements to existing steps —all without subclassing or monkey-patching.
Registered steps and requirements are evaluated by Requirements at serialization time to produce the requirements array on the Cart API.
Class Method Summary collapse
-
.add_requirement(step:, field:, message:, satisfied:, **options) ⇒ Array<Requirement>
Add an extra requirement to an existing checkout step.
-
.ordered_steps ⇒ Array<Step>
Returns steps sorted by
before/afterconstraints relative to the checkout flow. -
.register_step(name:, satisfied:, requirements:, **options) ⇒ Array<Step>
Register a new custom checkout step.
-
.remove_requirement(step:, field:) ⇒ Array<Requirement>
Remove a previously registered requirement by step and field.
-
.remove_step(name) ⇒ Array<Step>
Remove a previously registered step by name.
-
.requirements ⇒ Array<Requirement>
All registered requirements.
-
.reset! ⇒ void
Clear all registered steps and requirements.
-
.steps ⇒ Array<Step>
All registered steps.
Class Method Details
.add_requirement(step:, field:, message:, satisfied:, **options) ⇒ Array<Requirement>
Add an extra requirement to an existing checkout step.
51 52 53 |
# File 'app/models/spree/checkout/registry.rb', line 51 def add_requirement(step:, field:, message:, satisfied:, **) requirements << Requirement.new(step: step, field: field, message: , satisfied: satisfied, **) end |
.ordered_steps ⇒ Array<Step>
Returns steps sorted by before/after constraints relative to the checkout flow.
The sort order is derived from Order.checkout_step_names so it stays in sync with any customizations to the checkout state machine. Steps with before:/after: anchors are ordered by the anchor’s position; steps without constraints are appended at the end.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'app/models/spree/checkout/registry.rb', line 80 def ordered_steps return steps if steps.empty? step_order = Spree::Order.checkout_step_names.map(&:to_s) positioned, unpositioned = steps.partition { |s| s.before || s.after } sorted = positioned.sort_by do |s| anchor = s.before || s.after idx = step_order.index(anchor) # before: inserts just before the anchor, after: just after idx ? (s.before ? idx - 0.5 : idx + 0.5) : Float::INFINITY end sorted + unpositioned end |
.register_step(name:, satisfied:, requirements:, **options) ⇒ Array<Step>
Register a new custom checkout step.
39 40 41 |
# File 'app/models/spree/checkout/registry.rb', line 39 def register_step(name:, satisfied:, requirements:, **) steps << Step.new(name: name, satisfied: satisfied, requirements: requirements, **) end |
.remove_requirement(step:, field:) ⇒ Array<Requirement>
Remove a previously registered requirement by step and field.
68 69 70 |
# File 'app/models/spree/checkout/registry.rb', line 68 def remove_requirement(step:, field:) requirements.reject! { |r| r.step == step.to_s && r.field == field.to_s } end |
.remove_step(name) ⇒ Array<Step>
Remove a previously registered step by name.
59 60 61 |
# File 'app/models/spree/checkout/registry.rb', line 59 def remove_step(name) steps.reject! { |s| s.name == name.to_s } end |
.requirements ⇒ Array<Requirement>
Returns all registered requirements.
100 |
# File 'app/models/spree/checkout/registry.rb', line 100 def requirements = (@requirements ||= []) |
.reset! ⇒ void
This method returns an undefined value.
Clear all registered steps and requirements. Intended for testing.
105 106 107 108 |
# File 'app/models/spree/checkout/registry.rb', line 105 def reset! @steps = [] @requirements = [] end |
.steps ⇒ Array<Step>
Returns all registered steps.
97 |
# File 'app/models/spree/checkout/registry.rb', line 97 def steps = (@steps ||= []) |