Sha256: 3b559a9c9d6821089746af7c8844cd11108bfa2550e4124b96c63ca77aa102cc

Contents?: true

Size: 1.64 KB

Versions: 2

Compression:

Stored size: 1.64 KB

Contents

class BlockService
  def self.block_names(path:)
    form_views(path: path).map do |view|
      view_name(view)
    end
  end

  def self.form_view(name, path:)
    view_by_name(name, form_view_paths(path))
  end

  def self.frontend_view(name, path:)
    view_by_name(name, frontend_view_paths(path))
  end

  def self.frontend_views(path:)
    views(frontend_view_paths(path))
  end

  def self.form_views(path:)
    views(form_view_paths(path))
  end

  def self.view_name(view)
    filename = File.basename(view.split('.')[0])

    # Removes leading _ if exists
    filename.sub(/^_/, '')
  end

  private

  # Looks for a block view by its name.
  #
  # It will first search in a specified path and will fallback to the default path
  # An exception will be raised if the view is nowhere to be found
  def self.view_by_name(name, paths)
    views = views(paths)
    view = views.find { |view| view.include?("/_#{name}.html.erb") }

    unless view
      prefixes = paths.map { |path| path.split('app/views/').last }
      raise ActionView::MissingTemplate.new(paths, name, prefixes, true, "headmin") unless view
    end

    view
  end

  def self.form_view_paths(path)
    [app_view_path(path), app_view_path('admin/blocks')].uniq
  end

  def self.frontend_view_paths(path)
    [app_view_path(path), app_view_path('website/blocks')].uniq
  end

  def self.app_view_path(path)
    base_path = 'app/views'
    [base_path, path].join('/')
  end

  def self.views(paths)
    paths.map { |path| views_in_path(path) }.flatten
  end

  def self.views_in_path(path)
    files = Dir.glob("#{path}/*")
    files.map do |file|
      file.split('app/views/').last
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
headmin-0.3.2 app/services/block_service.rb
headmin-0.3.1 app/services/block_service.rb