diff --git a/app/assets/javascripts/wizard/components/wizard-step.js b/app/assets/javascripts/wizard/components/wizard-step.js index 7884a270059..dd36c588914 100644 --- a/app/assets/javascripts/wizard/components/wizard-step.js +++ b/app/assets/javascripts/wizard/components/wizard-step.js @@ -61,6 +61,11 @@ export default Component.extend({ return getUrl(`/images/wizard/${src}`); }, + @discourseComputed("step.id") + bannerAndDescriptionClass(id) { + return `wizard-banner-and-description wizard-banner-and-description-${id}`; + }, + @observes("step.id") _stepChanged() { this.set("saving", false); diff --git a/app/assets/javascripts/wizard/templates/components/wizard-step.hbs b/app/assets/javascripts/wizard/templates/components/wizard-step.hbs index 4f0686acf75..67f9b50e5f0 100644 --- a/app/assets/javascripts/wizard/templates/components/wizard-step.hbs +++ b/app/assets/javascripts/wizard/templates/components/wizard-step.hbs @@ -3,13 +3,15 @@

{{step.title}}

{{/if}} - {{#if bannerImage}} - - {{/if}} +
+ {{#if bannerImage}} + + {{/if}} - {{#if step.description}} -

{{html-safe step.description}}

- {{/if}} + {{#if step.description}} +

{{html-safe step.description}}

+ {{/if}} +
{{#wizard-step-form step=step}} {{#each step.fields as |field|}} diff --git a/lib/wizard.rb b/lib/wizard.rb index f3340814440..c58d652e48b 100644 --- a/lib/wizard.rb +++ b/lib/wizard.rb @@ -18,15 +18,30 @@ class Wizard Step.new(step_name) end - def append_step(step) + def append_step(step, after: nil) return if @@excluded_steps.include?(step) step = create_step(step) if step.is_a?(String) - yield step if block_given? - last_step = @steps.last + if after + before_step = @steps.detect { |s| s.id == after } + if before_step + step.previous = before_step + step.index = before_step.index + 1 + if before_step.next + step.next = before_step.next + before_step.next.previous = step + end + before_step.next = step + @steps.insert(before_step.index + 1, step) + step.index += 1 while (step = step.next) + return + end + end + + last_step = @steps.last @steps << step # If it's the first step diff --git a/spec/components/wizard/wizard_spec.rb b/spec/components/wizard/wizard_spec.rb index 0faef408294..74fddb113d8 100644 --- a/spec/components/wizard/wizard_spec.rb +++ b/spec/components/wizard/wizard_spec.rb @@ -81,6 +81,56 @@ describe Wizard do end end + describe "#append_step with after specified" do + let(:user) { Fabricate.build(:moderator) } + let(:wizard) { Wizard.new(user) } + + it 'inserts steps after the proper step' do + wizard.append_step('first') do |step| + step.add_field(id: 'another_element', type: 'text') + end + wizard.append_step('second') do |step| + step.add_field(id: 'another_element', type: 'text') + end + wizard.append_step('actually-second', after: 'first') do |step| + step.add_field(id: 'another_element', type: 'text') + end + + expect(wizard.steps.sort_by(&:index).map(&:id)).to eq(["first", "actually-second", "second"]) + expect(wizard.steps.map(&:index).sort).to eq([0, 1, 2]) + end + + it 'inserts steps at the end if the after value does not match an existing step' do + wizard.append_step('first') do |step| + step.add_field(id: 'another_element', type: 'text') + end + wizard.append_step('second') do |step| + step.add_field(id: 'another_element', type: 'text') + end + wizard.append_step('should_be_last', after: 'abcdefghi') do |step| + step.add_field(id: 'another_element', type: 'text') + end + + expect(wizard.steps.sort_by(&:index).map(&:id)).to eq(["first", "second", "should_be_last"]) + expect(wizard.steps.map(&:index).sort).to eq([0, 1, 2]) + end + + it 'inserts steps at the end' do + wizard.append_step('first') do |step| + step.add_field(id: 'another_element', type: 'text') + end + wizard.append_step('second') do |step| + step.add_field(id: 'another_element', type: 'text') + end + wizard.append_step('last', after: 'second') do |step| + step.add_field(id: 'another_element', type: 'text') + end + + expect(wizard.steps.sort_by(&:index).map(&:id)).to eq(["first", "second", "last"]) + expect(wizard.steps.map(&:index).sort).to eq([0, 1, 2]) + end + end + describe "completed?" do let(:user) { Fabricate.build(:moderator) } let(:wizard) { Wizard.new(user) }