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_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