module OrbitApp module Module module WidgetUtility Version = "0.2" module ClassMethods @@widgets = {} def add(name,default_widget,customize_widget) @@widgets[name] = {:default_widget=>default_widget,:customize_widget=>customize_widget} Hash[@@widgets.sort] end def all return @@widgets end end extend ClassMethods def self.included( other ) other.extend( ClassMethods ) end class WidgetSet attr_reader :widgets,:categories_query,:tags_query def initialize(name,key,&block) @widgets = [] @default_widget = nil @categories_query = '' @tags_query = '' block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? OrbitApp::Module::WidgetUtility.add(key,@default_widget,@widgets) end %w{categories_query tags_query}.each do |field| define_method(field){|var| instance_variable_set( "@" + field, var)} end # def data_count(var) # @data_count = var # end def find_by_path(path) @widgets.each do |widget| return widget if widget.name == path end end def get_categories eval(@categories_query) rescue nil end def get_tags eval(@tags_query) rescue nil end def default_widget_setting @default_widget end def default_widget(&block) @default_widget = DefaultWidget.new(&block) # OrbitApp::Module::FrontendUtility.add() end def customize_widget(name,&block) @widgets << Widget.new(name,&block) end # def customize_widget(name,label,options ={}) # @widgets << Widget.new(name,label,options) # end # def customize_widget_options_fields_i18n(settings) # @customize_widget_options_fields_i18n = settings # end def to_module_app_format hash = {} @widgets.collect{|t| hash[t.name] = t.to_hash} hash["default_widget"]= DefaultWidget.get_interface_args unless @default_widget.blank? hash end def get_fields get_default_widget.get_fields end def get_link_methods get_default_widget.get_link_methods end def get_default_widget return @default_widget end end class DefaultWidget include DefaultWidgetTagHelper STYLE = ["typeA","typeB_style2","typeB_style3","typeB_style4","typeC"] def initialize(&block) @query = nil @image = nil @sorting_query = 'desc(:created_at)' @more_link = {} @fields = [] @enabled_styles = STYLE block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? end def sorting(query) @sorting_query = query end def enable(args) @enabled_styles = args end def link_to_more(*args) @more_link[:label_i18n] = (args[1] ? args[1][:title_i18n] : 'default_widget.default_link_to_more' ) @more_link[:path_method] = args[0] end def self.get_interface_args {:name=>"default_widget",:field=>@fields,:style=>@enabled_styles,:i18n=>'default_widget.default_widget'} end def to_module_app_format {"query"=>@query,"image"=>@image,"more_link"=>@more_link,"enabled_styles"=>@enabled_styles,:sorting_query=>@sorting_query} rescue nil end def link_field(field_name,setting) @fields << [field_name,setting,:link] end def field(field_name) @fields << [field_name,nil,:field] end def get_fields @fields end def get_link_methods return flatten_hashes(@fields.select{|t| t[2]==:link}.map{|t| Hash[t[0].to_sym,t[1]] }) end def query(var) @query = var end def image(var) @image = var end def flatten_hashes(ary) Hash[*ary.map(&:to_a).flatten] end end class Widget attr_reader :name,:default_template,:fields def initialize(name,&block) @name = name @options = {} block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? # @fields = options[:fields] # @label = label # @style= options[:style] end def widget_i18n(str) # "gallery.widget.widget1" @widget_i18n = str end def style(ary)# [] @style = ary end def get_options @options end def options(opt_name,*options) # "vertical", option = options[0] @options[opt_name] = {:label_i18n=>option[:i18n] , :opts=>option[:options_item]} # options => :i18n => "gallery.widget_option.vertical",:options_item=>[1, 2] # :i18n =>"gallery.album",:options_item => {"query"=>"GalleryAlbum.all", "value"=>:id, "label"=>:name} end def to_hash {:name => @name,:fields=>@fields,:style=>@style,:i18n=>@widget_i18n} end protected end# of widget end # of WidgetRegisition end # of Module end # of OrbitApp