class ViewComponent::Preview

Public Class Methods

all() click to toggle source

Returns all component preview classes.

# File lib/view_component/preview.rb, line 31
def all
  load_previews if descendants.empty?
  descendants
end
examples() click to toggle source

Returns all of the available examples for the component preview.

# File lib/view_component/preview.rb, line 48
def examples
  public_instance_methods(false).map(&:to_s).sort
end
exists?(preview) click to toggle source

Returns true if the preview exists.

# File lib/view_component/preview.rb, line 53
def exists?(preview)
  all.any? { |p| p.preview_name == preview }
end
find(preview) click to toggle source

Find a component preview by its underscored class name.

# File lib/view_component/preview.rb, line 58
def find(preview)
  all.find { |p| p.preview_name == preview }
end
layout(layout_name) click to toggle source

Setter for layout name.

# File lib/view_component/preview.rb, line 68
def layout(layout_name)
  @layout = layout_name
end
preview_example_template_path(example) click to toggle source

Returns the relative path (from preview_path) to the preview example template if the template exists

# File lib/view_component/preview.rb, line 73
def preview_example_template_path(example)
  preview_path =
    Array(preview_paths).detect do |preview_path|
      Dir["#{preview_path}/#{preview_name}_preview/#{example}.html.*"].first
    end

  if preview_path.nil?
    raise(
      PreviewTemplateError,
      "A preview template for example #{example} does not exist.\n\n" \
      "To fix this issue, create a template for the example."
    )
  end

  path = Dir["#{preview_path}/#{preview_name}_preview/#{example}.html.*"].first
  Pathname.new(path).
    relative_path_from(Pathname.new(preview_path)).
    to_s.
    sub(/\..*$/, "")
end
preview_name() click to toggle source

Returns the underscored name of the component preview without the suffix.

# File lib/view_component/preview.rb, line 63
def preview_name
  name.chomp("Preview").underscore
end
preview_source(example) click to toggle source

Returns the method body for the example from the preview file.

# File lib/view_component/preview.rb, line 95
def preview_source(example)
  source = self.instance_method(example.to_sym).source.split("\n")
  source[1...(source.size - 1)].join("\n")
end
render_args(example, params: {}) click to toggle source

Returns the arguments for rendering of the component in its layout

# File lib/view_component/preview.rb, line 37
def render_args(example, params: {})
  example_params_names = instance_method(example).parameters.map(&:last)
  provided_params = params.slice(*example_params_names).to_h.symbolize_keys
  result = provided_params.empty? ? new.public_send(example) : new.public_send(example, **provided_params)
  result ||= {}
  result[:template] = preview_example_template_path(example) if result[:template].nil?
  @layout = nil unless defined?(@layout)
  result.merge(layout: @layout)
end

Private Class Methods

load_previews() click to toggle source
# File lib/view_component/preview.rb, line 102
def load_previews
  Array(preview_paths).each do |preview_path|
    Dir["#{preview_path}/**/*_preview.rb"].sort.each { |file| require_dependency file }
  end
end
preview_paths() click to toggle source
# File lib/view_component/preview.rb, line 108
def preview_paths
  Base.preview_paths
end

Public Instance Methods

render(component, **args, &block) click to toggle source
# File lib/view_component/preview.rb, line 10
def render(component, **args, &block)
  {
    args: args,
    block: block,
    component: component,
    locals: {},
    template: "view_components/preview",
  }
end
Also aliased as: render_component
render_component(component, **args, &block)
Alias for: render
render_with_template(template: nil, locals: {}) click to toggle source
# File lib/view_component/preview.rb, line 20
def render_with_template(template: nil, locals: {})
  {
    template: template,
    locals: locals
  }
end