Class: HakumiComponents::Progress::StepsRenderer

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
app/components/hakumi_components/progress/steps_renderer.rb

Constant Summary collapse

ProgressValue =
T.type_alias { Numeric }
StrokeGradient =
T.type_alias { T::Hash[String, String] }
StrokeColor =
T.type_alias { T.nilable(T.any(String, StrokeGradient)) }
StepStateValue =
T.type_alias { Types::HtmlPrimitive }
StepState =
T.type_alias { T::Hash[Symbol, StepStateValue] }
CIRCLE_STEP_GAP =
T.let(2, Integer)

Instance Method Summary collapse

Constructor Details

#initialize(type:, percent:, steps:, stroke_color:, circle_geometry: nil, gradient_id: nil) ⇒ StepsRenderer

Returns a new instance of StepsRenderer.



27
28
29
30
31
32
33
34
# File 'app/components/hakumi_components/progress/steps_renderer.rb', line 27

def initialize(type:, percent:, steps:, stroke_color:, circle_geometry: nil, gradient_id: nil)
  @type = T.let(type, Symbol)
  @percent = T.let(percent, ProgressValue)
  @steps = T.let(steps, T.nilable(Integer))
  @stroke_color = T.let(stroke_color, StrokeColor)
  @circle_geometry = T.let(circle_geometry, T.nilable(CircleGeometry))
  @gradient_id = T.let(gradient_id, T.nilable(String))
end

Instance Method Details

#circle_stepsObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'app/components/hakumi_components/progress/steps_renderer.rb', line 59

def circle_steps
  return [] unless circle_steps?

  geometry = @circle_geometry
  return [] if geometry.nil?

  total = step_count
  effective = geometry.effective_length
  segment_length = (effective - (CIRCLE_STEP_GAP * total)) / total.to_f
  progress_units = (@percent.to_f / 100.0) * total
  base_offset = format_float(geometry.dashoffset).to_f

  (0...total).map do |index|
    active = progress_units > index
    current = index == progress_units.floor && progress_units < total
    offset = base_offset + ((segment_length + CIRCLE_STEP_GAP) * index)
    {
      index: index,
      active: active,
      current: current,
      dasharray: geometry.dasharray(segment_length),
      dashoffset: format_float(offset),
      stroke: circle_step_stroke(active)
    }
  end
end

#circle_steps?Boolean

Returns:

  • (Boolean)


37
38
39
# File 'app/components/hakumi_components/progress/steps_renderer.rb', line 37

def circle_steps?
  (circle? || dashboard?) && steps?
end

#line_stepsObject



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/components/hakumi_components/progress/steps_renderer.rb', line 42

def line_steps
  return [] unless line? && steps?

  total = step_count
  progress_units = (@percent.to_f / 100.0) * total

  (0...total).map do |index|
    {
      active: progress_units > index,
      current: index == progress_units.floor && progress_units < total,
      width: "#{(100.0 / total).round(2)}%",
      custom_color: line_custom_color
    }
  end
end