Sha256: 124d265860d86b0fd921eb2183af0c62f252a43cb366cb9658c486d632cf6067

Contents?: true

Size: 1.46 KB

Versions: 4

Compression:

Stored size: 1.46 KB

Contents

# frozen_string_literal: true

module Eac
  module MenusHelper
    class DataBuilder
      def initialize(view)
        @view = view
      end

      def build(entries)
        build_entries(entries, 0)
      end

      private

      def build_entries(entries, level)
        raise 'Argument "entries" is not a hash' unless entries.is_a?(Hash)

        r = entries.map { |k, v| build_entry(k, v, level) }.select { |e| e }
        r.empty? ? nil : r
      end

      def build_entry(key, value, level)
        if value.is_a?(Hash)
          build_group(key, value, level)
        else
          build_item(key, value, level)
        end
      end

      def build_group(label, menu_entries, level)
        e = build_entries(menu_entries, level + 1)
        return nil unless e

        { type: :group, label: label, children: e, level: level }
      end

      def build_item(label, value, level)
        path, options = menu_item_options(value)
        return nil unless can_access_path?(path, options[:link_method])

        { type: :item, label: label, path: path, options: options, level: level }
      end

      def menu_item_options(item_value)
        if item_value.is_a?(Array)
          [item_value[0], item_value[1] || {}]
        else
          [item_value, {}]
        end
      end

      def can_access_path?(path, method)
        if @view.respond_to?(:'can_by_path?')
          @view.can_by_path?(path, method)
        else
          true
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
eac_rails_utils-0.10.1 lib/eac/menus_helper/data_builder.rb
eac_rails_utils-0.10.0 lib/eac/menus_helper/data_builder.rb
eac_rails_utils-0.9.1 lib/eac/menus_helper/data_builder.rb
eac_rails_utils-0.9.0 lib/eac/menus_helper/data_builder.rb