class Lookbook::Navigation
def flat
def flat { flat: true, depth: 0, items: previews.map do |preview| nav_item_for_preview(preview, expand_name: true) end } end
def nav_item_for_preview(preview, expand_name: false)
def nav_item_for_preview(preview, expand_name: false) { name: preview.preview_name.tr("/", "."), label: expand_name ? "#{preview.pretty_path}/#{preview.label}" : preview.label, type: :preview, examples: preview.get_visible_examples.map do |example| example_path = "#{preview.preview_name}/#{example.name}" { name: example.name, label: example.label, path: example_path } end } end
def nested
def nested nav = {flat: false, depth: 0, items: []} previews.each do |preview| current = nav depth = preview.path_parts.size path = "" preview.path_parts.each_with_index do |segment, i| target = current[:items].find { |item| item[:name] == segment } if target.nil? path = "#{path.present? ? path + "." : ""}#{segment}" target = { depth: i + 1, nested: true, name: path, label: segment.titleize, type: :group, items: [] } current[:items].append(target) end if depth == i + 1 target[:items].push(nav_item_for_preview(preview)) else current = target end end end nav end
def previews
def previews valid_previews = ViewComponent::Preview.all.filter { |preview| preview.get_visible_examples.any? && !preview.hidden? } valid_previews.sort_by(&:normalized_name) end