Class: Wizard

Inherits:
Object
  • Object
show all
Defined in:
lib/wizard.rb,
lib/wizard/step.rb,
lib/wizard/field.rb,
lib/wizard/builder.rb,
lib/wizard/step_updater.rb

Defined Under Namespace

Classes: Builder, Choice, Field, Step, StepUpdater

Constant Summary collapse

@@excluded_steps =
[]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user) ⇒ Wizard

Returns a new instance of Wizard.



9
10
11
12
13
14
# File 'lib/wizard.rb', line 9

def initialize(user)
  @steps = []
  @user = user
  @first_step = nil
  @max_topics_to_require_completion = 15
end

Instance Attribute Details

#max_topics_to_require_completionObject

Returns the value of attribute max_topics_to_require_completion.



5
6
7
# File 'lib/wizard.rb', line 5

def max_topics_to_require_completion
  @max_topics_to_require_completion
end

#stepsObject (readonly)

Returns the value of attribute steps.



4
5
6
# File 'lib/wizard.rb', line 4

def steps
  @steps
end

#userObject (readonly)

Returns the value of attribute user.



4
5
6
# File 'lib/wizard.rb', line 4

def user
  @user
end

Class Method Details

.exclude_step(step) ⇒ Object



57
58
59
# File 'lib/wizard.rb', line 57

def self.exclude_step(step)
  @@excluded_steps << step
end

.user_requires_completion?(user) ⇒ Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/wizard.rb', line 116

def self.user_requires_completion?(user)
  self.new(user).requires_completion?
end

Instance Method Details

#append_step(step, after: nil) {|step| ... } ⇒ Object

Yields:

  • (step)


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/wizard.rb', line 20

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?

  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
  if @steps.size == 1
    @first_step = step
    step.index = 0
  elsif last_step.present?
    last_step.next = step
    step.previous = last_step
    step.index = last_step.index + 1
  end
end

#completed?Boolean

Returns:

  • (Boolean)


83
84
85
# File 'lib/wizard.rb', line 83

def completed?
  completed_steps?(steps_with_fields.map(&:id))
end

#completed_steps?(steps) ⇒ Boolean

Returns:

  • (Boolean)


87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/wizard.rb', line 87

def completed_steps?(steps)
  steps = [steps].flatten.uniq

  completed =
    UserHistory
      .where(action: UserHistory.actions[:wizard_step], context: steps)
      .distinct
      .order(:context)
      .pluck(:context)

  steps.sort == completed
end

#create_step(step_name) ⇒ Object



16
17
18
# File 'lib/wizard.rb', line 16

def create_step(step_name)
  Step.new(step_name)
end

#create_updater(step_id, fields) ⇒ Object



78
79
80
81
# File 'lib/wizard.rb', line 78

def create_updater(step_id, fields)
  step = @steps.find { |s| s.id == step_id.dasherize }
  Wizard::StepUpdater.new(@user, step, fields)
end

#requires_completion?Boolean

Returns:

  • (Boolean)


100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/wizard.rb', line 100

def requires_completion?
  return false unless SiteSetting.wizard_enabled?
  return false if SiteSetting.bypass_wizard_check?

  if Topic.limit(@max_topics_to_require_completion + 1).count > @max_topics_to_require_completion
    SiteSetting.bypass_wizard_check = true
    return false
  end

  if @user&.id && User. == @user.id
    !Wizard::Builder.new(@user).build.completed?
  else
    false
  end
end

#startObject



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/wizard.rb', line 65

def start
  completed =
    UserHistory
      .where(action: UserHistory.actions[:wizard_step], context: steps_with_fields.map(&:id))
      .uniq
      .pluck(:context)

  # First uncompleted step
  steps_with_fields.each { |s| return s unless completed.include?(s.id) }

  @first_step
end

#steps_with_fieldsObject



61
62
63
# File 'lib/wizard.rb', line 61

def steps_with_fields
  @steps_with_fields ||= @steps.select(&:has_fields?)
end