class Lookbook::AppController
def self.controller_path
def self.controller_path "lookbook" end
def build_nav
def build_nav @nav = Collection.new previews.reject { |p| p.hidden? }.each do |preview| current = @nav if preview.hierarchy_depth == 1 current.add(preview) else preview.lookbook_parent_collections.each.with_index(1) do |name, i| target = current.get_or_create(name) if preview.hierarchy_depth == i + 1 target.add(preview) else current = target end end end end @nav end
def drawer_panels
def drawer_panels { source: { label: "Source", template: "lookbook/panels/source", hotkey: "s", show: true, disabled: false, copy: true }, notes: { label: "Notes", template: "lookbook/panels/notes", hotkey: "n", show: true, disabled: @examples.filter { |e| e[:notes].present? }.none? }, params: { label: "Params", template: "lookbook/panels/params", hotkey: "p", show: enabled?(:params), disabled: @example.type == :group || @example.params.none? } } end
def enabled?(feature)
def enabled?(feature) Lookbook::Features.enabled?(feature) end
def example_data(example)
def example_data(example) render_args = @preview.render_args(example.name, params: preview_controller.params.permit!) has_template = render_args[:template] != "view_components/preview" { label: example.label, notes: example.notes, html: preview_controller.render_example_to_string(@preview, example.name), source: has_template ? example.template_source(render_args[:template]) : example.method_source, source_lang: has_template ? example.template_lang(render_args[:template]) : example.source_lang, params: enabled?(:params) ? example.params : [] } end
def examples_data
def examples_data @examples_data ||= (@example.type == :group ? @example.examples : [@example]).map do |example| example_data(example) end end
def find_example
def find_example @example = if @preview if params[:path] == @preview.lookbook_path redirect_to show_path "#{params[:path]}/#{@preview.lookbook_examples.first.name}" else @example_name = File.basename(params[:path]) @preview.lookbook_example(@example_name) end end end
def find_preview
def find_preview candidates = [] params[:path].to_s.scan(%r{/|$}) { candidates << $` } match = candidates.reverse.detect { |candidate| Lookbook::Preview.exists?(candidate) } @preview = match ? Lookbook::Preview.find(match) : nil end
def preview
def preview if @example set_params render html: render_examples(examples_data) else render "not_found" end end
def preview_controller
def preview_controller return @preview_controller if @preview_controller.present? controller_class = Lookbook.config.preview_controller.constantize controller_class.class_eval { include Lookbook::PreviewController } controller = controller_class.new controller.request = request controller.response = response @preview_controller ||= controller end
def preview_panels
def preview_panels { preview: { label: "Preview", template: "lookbook/panels/preview", srcdoc: Lookbook.config.preview_srcdoc ? render_examples(examples_data).gsub("\"", """) : nil, hotkey: "v", show: true, disabled: false, copy: false }, output: { label: "HTML", template: "lookbook/panels/output", hotkey: "o", show: true, disabled: false, copy: true } } end
def previews
def previews Lookbook::Preview.all.sort_by(&:label) end
def render_examples(examples)
def render_examples(examples) preview_controller.render_in_layout_to_string("layouts/lookbook/preview", {examples: examples}, @preview.lookbook_layout) end
def set_params
def set_params if enabled?(:params) # cast known params to type @example.params.each do |param| if preview_controller.params.key?(param[:name]) preview_controller.params[param[:name]] = Lookbook::Params.cast(preview_controller.params[param[:name]], param[:type]) end end end # set display params preview_controller.params.merge!({ lookbook: { display: @example.display_params } }) end
def show
def show if @example begin set_params @examples = examples_data @drawer_panels = drawer_panels.filter { |name, panel| panel[:show] } @preview_panels = preview_panels.filter { |name, panel| panel[:show] } rescue *EXCEPTIONS render "error" end else render "not_found" end end