lib/hippo/screen.rb in hippo-fw-0.9.5 vs lib/hippo/screen.rb in hippo-fw-0.9.6

- old
+ new

@@ -1,53 +1,79 @@ require 'yaml' require 'oj' require 'pry' +require_relative 'screen/group' +require_relative 'screen/definition' module Hippo module Screen GROUPS=Hash.new{|h,k| g=Group.new; g.identifier=k; h[k]=g } - DEFINITIONS=Hash.new + DEFINITIONS = Hash.new + EXTENSIONS = Hash.new mattr_accessor :enabled_group_ids class DefinitionList + attr_reader :ids + + include Enumerable + def initialize(extension_id) + @ids = [] @extension_id = extension_id end def define(id) + ids.push(id) definition = (DEFINITIONS[id] ||= Definition.new(id, @extension_id)) yield definition end + + def extend(id) + ids.push(id) + definition = DEFINITIONS[id] + definition.extension_id = @extension_id + yield definition if block_given? + end + + def each + ids.each { |id| yield DEFINITIONS[id] } + end + end class << self - include Enumerable def [](config) if DEFINITIONS.key?(config) DEFINITIONS[config] else nil end end + def each + DEFINITIONS.values.each { |s| yield s } + end + def for_extension(id) - yield DefinitionList.new(id) + definition = EXTENSIONS[id] ||= DefinitionList.new(id) + yield definition if block_given? + definition end def define_group(id) group = GROUPS[id] yield group end - def each + def active_ids Extensions.load_screens - DEFINITIONS.values.each{ | definition | yield definition } + for_extension(Hippo::Extensions.controlling.identifier).map(&:identifier) end def each_group Extensions.load_screens GROUPS.values.each{ | group | yield group } @@ -55,97 +81,9 @@ def config_file Hippo::Extensions.controlling.root_path.join("config", "screens.rb") end - end - - - class Group - include Concerns::AttrAccessorWithDefault - - attr_accessor_with_default :identifier - attr_accessor_with_default :title - attr_accessor_with_default :description - attr_accessor_with_default :icon - attr_accessor_with_default :order - - def to_json - Oj.dump({ - id: identifier, - title: title, - description: description, - icon: icon - }, mode: :compat) - end - end - - class Definition - include Concerns::AttrAccessorWithDefault - - attr_accessor_with_default :identifier - attr_accessor_with_default :title - attr_accessor_with_default :description - attr_accessor_with_default :icon - attr_accessor_with_default :group_id - attr_accessor_with_default :extension - attr_accessor_with_default :view_class - attr_accessor_with_default :model_class - attr_accessor_with_default :model_access, 'read' - attr_accessor_with_default :asset - - def initialize(id, extension_id) - self.identifier = id - @extension_id = extension_id - @extension = extension_id.underscore.camelize - end - - def group - GROUPS[@group_id] - end - - def has_file_matching?(pattern) - Pathname.glob(root_path.join(pattern)).any? - end - - def root_path - ext = Hippo::Extensions.for_identifier(@extension_id) - raise "Unable to find extension '#{@extension_id}' for screen group" unless ext - ext.root_path.join('client', url_prefix, identifier) - end - - def model - return nil if @model_class.blank? - ext = Hippo::Extensions.for_identifier(@extension_id) - (@extension_id.camelize + '::' + @model_class).constantize - end - - def viewable_by?(user) - model.nil? || user.can_read?(self) - end - - def asset_path - (asset && asset =~ /\//) ? asset : "#{@extension_id}/screens/#{asset || identifier}" - end - - def as_json - { - id: identifier, - title: title, - icon: icon, - model: model_class, - view: view_class, - access: model_access, - group_id: group_id, - extension: extension, - description: description, - asset: asset_path - } - end - - def to_json - Oj.dump(as_json, mode: :compat) - end end end end