FEATURE: Allow plugins to exclude wizard steps (#9275)

FEATURE: Allow plugins to exclude wizard steps (#9275)

diff --git a/lib/wizard.rb b/lib/wizard.rb
index a254d89..f334081 100644
--- a/lib/wizard.rb
+++ b/lib/wizard.rb
@@ -5,6 +5,8 @@ class Wizard
   attr_reader :steps, :user
   attr_accessor :max_topics_to_require_completion
 
+  @@excluded_steps = []
+
   def initialize(user)
     @steps = []
     @user = user
@@ -17,6 +19,8 @@ class Wizard
   end
 
   def append_step(step)
+    return if @@excluded_steps.include?(step)
+
     step = create_step(step) if step.is_a?(String)
 
     yield step if block_given?
@@ -36,6 +40,10 @@ class Wizard
     end
   end
 
+  def self.exclude_step(step)
+    @@excluded_steps << step
+  end
+
   def steps_with_fields
     @steps_with_fields ||= @steps.select(&:has_fields?)
   end
diff --git a/spec/components/wizard/wizard_spec.rb b/spec/components/wizard/wizard_spec.rb
index bf5490a..0faef40 100644
--- a/spec/components/wizard/wizard_spec.rb
+++ b/spec/components/wizard/wizard_spec.rb
@@ -61,6 +61,26 @@ describe Wizard do
     end
   end
 
+  describe ".exclude_step" do
+    let(:user) { Fabricate.build(:moderator) }
+    let(:wizard) { Wizard.new(user) }
+
+    it 'excludes steps even if they are added via append_step' do
+      wizard.append_step('first') do |step|
+        step.add_field(id: 'another_element', type: 'text')
+      end
+
+      Wizard.exclude_step("random-step123")
+
+      wizard.append_step('random-step123') do |step|
+        step.add_field(id: 'another_element', type: 'text')
+      end
+      wizard.append_step('finished')
+
+      expect(wizard.steps.map(&:id)).to eq(['first', 'finished'])
+    end
+  end
+
   describe "completed?" do
     let(:user) { Fabricate.build(:moderator) }
     let(:wizard) { Wizard.new(user) }

GitHub sha: c14f6d4c

This commit appears in #9275 which was approved by eviltrout. It was merged by markvanlan.