diff --git a/app/controllers/admin/page_parts_controller.rb b/app/controllers/admin/page_parts_controller.rb index f78c6ae3..f4672800 100644 --- a/app/controllers/admin/page_parts_controller.rb +++ b/app/controllers/admin/page_parts_controller.rb @@ -31,9 +31,9 @@ class Admin::PagePartsController < ApplicationController @widget_path = @part.widget_path ? @part.widget_path : @module_app.widgets.keys[0] - if @module_app.widgets.any?{|b| b.class == Array} - @widget_style = @module_app.widgets[@widget_path] if !@widget_path.blank? && !@module_app.widgets.blank? - end + # if @module_app.widgets.any?{|b| b.class == Array} + # @widget_style = @module_app.widgets[@widget_path] if !@widget_path.blank? && !@module_app.widgets.blank? + # end case @module_app.key when 'announcement' @@ -119,7 +119,6 @@ class Admin::PagePartsController < ApplicationController def reload_widget_styles @module_app = ModuleApp.find(params[:module_app_id]) - @widget_style = @module_app.widgets[params[:id]] respond_to do |format| diff --git a/app/models/item.rb b/app/models/item.rb index ae086c7d..243a098a 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -4,7 +4,8 @@ class Item include Mongoid::Timestamps include Mongoid::Tree include Mongoid::Tree::Ordering - + LIST = YAML.load(File.read('config/list.yml')) + field :name field :path field :is_published, :type => Boolean, :default => false @@ -15,7 +16,7 @@ class Item validates_format_of :name, :with => /^[0-9a-zA-Z\-_]+$/ - validates :name, :exclusion => { :in => LIST[:forbidden_item_names] } + # validates :name, :exclusion => { :in => LIST[:forbidden_item_names] } validates_uniqueness_of :name, :scope => :parent_id validates_presence_of :name validates_associated :parent, :children diff --git a/app/models/module_app.rb b/app/models/module_app.rb index 669d82aa..22fb4814 100644 --- a/app/models/module_app.rb +++ b/app/models/module_app.rb @@ -5,30 +5,45 @@ class ModuleApp field :key field :title - field :version - field :organization - field :author - field :intro - field :update_info - field :create_date - field :enable_frontend, type: Boolean, :default => true - - field :app_pages ,type: Array - # field :widgets ,type: Array - field :widgets ,type: Hash - field :widget_fields ,type: Array - + has_many :managers,as: :managing_app ,:class_name => "AppManager" ,:dependent => :destroy#,:foreign_key => "managing_app_id",:inverse_of => :managing_app has_many :sub_managers,as: :sub_managing_app ,:class_name => "AppManager", :dependent => :destroy#,:foreign_key => "sub_managing_app_id",:inverse_of => :sub_managing_app - has_many :tags + # has_many :tags has_many :page_parts has_many :pages has_one :app_auth,dependent: :delete - + before_save :set_key - + + def get_registration + OrbitApp::Module::Registration.find_by_key(key) + end + + # %w{label_i18n }.each do |field| + # define_method(field){|var| get_registration.send("get_#{m}") } + # end + + def label_i18n + reg = get_registration + reg.nil? ? 'Init is not defined completely' : get_registration.get_label_i18n + end + + # def method_missing(m, *args, &block) + # # get_registration.send("get_#{m}") + # end + + def using_default_widget? + !get_registration.get_default_widget.blank? + end + + def get_widget_for_select + widgets = get_registration.get_widgets + ary = widgets.collect{|k,v| [I18n.t(v["label"]),k]} + ary << [I18n.t('widget.default_widget'),'default_widget']if using_default_widget? + end + def is_manager?(user) managing_users.include?(user) end @@ -79,6 +94,10 @@ class ModuleApp end end + def label + I18n.t(label_i18n) + end + protected def set_key diff --git a/app/views/admin/page_parts/_module_widget.html.erb b/app/views/admin/page_parts/_module_widget.html.erb index 44358601..e6a6e2a0 100644 --- a/app/views/admin/page_parts/_module_widget.html.erb +++ b/app/views/admin/page_parts/_module_widget.html.erb @@ -10,12 +10,12 @@ - <%= f.select :module_app, options_from_collection_for_select(@module_apps, :id, :title, :selected => @module_app.id), {}, {:rel => admin_page_parts_path} %> + <%= f.select :module_app, options_from_collection_for_select(@module_apps, :id, :label, :selected => @module_app.id), {}, {:rel => admin_page_parts_path} %> <%#= f.select :widget_path, @module_app.widgets.collect{|widget| [widget.humanize, widget]}, :selected => @part.widget_path %> - <%= f.select :widget_path, @module_app.widgets.collect{|k,v| [k.humanize, k]}, {}, { :selected => @part.widget_path, :rel => admin_page_parts_path } %> + <%= f.select :widget_path, @module_app.get_widget_for_select, {}, { :selected => @part.widget_path, :rel => admin_page_parts_path } %> @@ -34,18 +34,10 @@ - <%= render 'widget_fields' %> - - <%#= f.label :widget_field %> - <%# @module_app.widget_fields.each_with_index do |widget_field, i| %> - <%#= i+1 %> - <%#= select_tag "page_part[widget_field][]", options_for_select(@module_app.widget_fields.collect{|widget_field| [widget_field.humanize, widget_field]}, (@part.widget_field ? @part.widget_field[i] : nil) ), :include_blank => true %>
- <%# end %> - - <%#= select_tag "page_part[widget_field][]", options_for_select(@module_app.widget_fields.collect{|widget_field| [widget_field.humanize, widget_field]}, @part.widget_field.collect{|widget_field| widget_field}), {:multiple => :multiple, :size => 6} %>
+
<%= f.label :widget_data_count %> <%= f.text_field :widget_data_count %> diff --git a/app/views/admin/page_parts/reload_widgets.js.erb b/app/views/admin/page_parts/reload_widgets.js.erb index c66c44e9..3b7082fc 100644 --- a/app/views/admin/page_parts/reload_widgets.js.erb +++ b/app/views/admin/page_parts/reload_widgets.js.erb @@ -1,4 +1,4 @@ -$('#widget_list select').html("<%= j options_for_select(@module_app.widgets.collect{|k,v| k}) %>"); +$('#widget_list select').html("<%= j options_for_select(@module_app.get_widget_for_select) %>"); $('#widget_style_list').html("<%= escape_javascript(select 'page_part', 'widget_style', @module_app.widgets[@widget_path]) if !@widget_path.blank? %>"); $('#widget_field').html("<%= j render 'widget_fields' %>"); $('#widget_category').html("<%= j render 'widget_categories' %>"); diff --git a/config/list.yml b/config/list.yml index bae7a90d..a3b48cfc 100644 --- a/config/list.yml +++ b/config/list.yml @@ -70,3 +70,10 @@ widget_field_type: - tag - viewcount - poster + +default_widget_style: + - style1 + - style2 + - style3 + - style4 + - style5 \ No newline at end of file diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 1573323b..1971ab2a 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -864,7 +864,14 @@ zh_tw: one: "有 1 個錯誤發生使得「%{model}」無法被儲存。" other: "有 %{count} 個錯誤發生使得「%{model}」無法被儲存。" body: "以下欄位發生問題:" - + widget: + default_widget: 系統預設Widget + _default_widget: + style1: 表格列表 + style2: 單行列佐圖(同邊) + style3: 多行列佐圖(同邊) + style4: 多行列佐圖(異邊) + style5: 單行列佐單圖(同邊) # : <<<<<<< HEAD mongoid: models: diff --git a/lib/orbit_app.rb b/lib/orbit_app.rb index f218c1e4..5b20f7a5 100644 --- a/lib/orbit_app.rb +++ b/lib/orbit_app.rb @@ -4,6 +4,8 @@ require "orbit_app/helper/renderer" require "orbit_app/helper/side_bar_renderer" require "orbit_app/helper/context_link_renderer" require "orbit_app/module/side_bar" +require "orbit_app/module/widget" +require "orbit_app/module/front_end" require "orbit_app/plugin/summary" require "orbit_app/plugin/registration" require "orbit_app/module/summary" diff --git a/lib/orbit_app/module/front_end.rb b/lib/orbit_app/module/front_end.rb new file mode 100644 index 00000000..65f79f8e --- /dev/null +++ b/lib/orbit_app/module/front_end.rb @@ -0,0 +1,56 @@ +module OrbitApp + module Module + module FrontendUtility + Version = "0.1" + + module ClassMethods + @@frontend_pages = [] + + def add(var) + @@frontend_pages << var + end + + def all + return @@frontend_pages + end + + end + + extend ClassMethods + def self.included( other ) + other.extend( ClassMethods ) + end + + class AppPageSet + def initialize(&block) + @frontend_pages = [] + block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? + end + + def app_page(name,options ={}) + @frontend_pages << AppPage.new(name,options) + end + + def to_module_app_format + @frontend_pages.collect{|t| t.name} + end + + end + + class AppPage + attr_reader :name + + def initialize(name,options ={}) + @name = name + end + + def finalize! + + end + + protected + + end# of AppPage + end # of FrontendUtility + end # of Module +end # of OrbitApp diff --git a/lib/orbit_app/module/registration.rb b/lib/orbit_app/module/registration.rb index 9a40eda3..c7967663 100644 --- a/lib/orbit_app/module/registration.rb +++ b/lib/orbit_app/module/registration.rb @@ -12,7 +12,7 @@ module OrbitApp def find_by_key(key) @@registrations.each{|t| - return t if t.name == key + return t if t.key == key } return nil end @@ -28,20 +28,69 @@ module OrbitApp end class DataSheet - attr_reader :name - attr_reader :base_path + attr_reader :name,:key,:base_path,:module_label def initialize(name, &block) @name = name + @key = name.underscore.singularize @side_bar = nil + @front_end_app_pages = nil block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? + setup_module_app + end + + def setup_module_app + module_app = ModuleApp.first(conditions: {:key=>@key,:title=>name}) + module_app = ModuleApp.new(:key=>@key,:title=>name) if module_app.nil? + + begin + module_app.save(:validate=>false) + rescue + retry + end + + end + + def get_label_i18n + @module_label + end + + def get_default_widget + if @widget_set.nil? # Init not defining widget + return {} + elsif @widget_set.get_default_widget.nil? # Init had defining widget,but say nothing about default_widget + return {} + else + @widget_set.get_default_widget.to_module_app_format + end + end + + def get_enable_frontend + (@front_end_app_pages.nil? ? false : true) + end + + def get_app_pages + @front_end_app_pages.nil? ? [] : @front_end_app_pages.to_module_app_format + end + + def get_widgets + @widget_set.nil? ? {} : @widget_set.to_module_app_format + end + + def get_categories + eval(@widget_set.categories_query) rescue nil + end + + def get_tags + eval(@widget_set.tags_query) rescue nil + end + + def front_end(&block) + @front_end_app_pages = FrontendUtility::AppPageSet.new(&block) end def side_bar(&block) - @side_bar = SideBarRegisition::SideBar.new(&block) - @side_bar.module_app_key = @name - @side_bar.finalize! - OrbitApp::Module::SideBarRegisition.add(@side_bar) + @side_bar = SideBarRegisition::SideBar.new(@name,@key,&block) end def personal_plugin(params) @@ -49,10 +98,20 @@ module OrbitApp Plugin::Registration.new_from_module_app(@name,@base_path,params) end - def base_url(var) - @base_path = var + def widgets(&block) + # @widgets = WidgetRegisition::WidgetSet.new(&block) + @widget_set = WidgetUtility::WidgetSet.new(&block) + + # @widgets = widget_set.widgets + # @default_widget = widget_set.default_widget end - end + + %w{module_label category base_url version organization author intro update_info}.each do |field| + define_method(field){|var| instance_variable_set( "@" + field, var)} + end + + end # of class DataSheet + end end end \ No newline at end of file diff --git a/lib/orbit_app/module/side_bar.rb b/lib/orbit_app/module/side_bar.rb index a1ca3e63..d82cac84 100644 --- a/lib/orbit_app/module/side_bar.rb +++ b/lib/orbit_app/module/side_bar.rb @@ -37,8 +37,7 @@ module OrbitApp # def is_manager? # binding.pry # end - def initialize( &block) - name = '' + def initialize(name = '',key,&block) @head_label = name @context_links = [] @available_for = [] @@ -48,18 +47,16 @@ module OrbitApp @head_link = "" @app_base_path = '' block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? + # setup_module_app(module_app_key) + @module_app_key = key + finalize! + SideBarRegisition.add(self) end - def module_app_key=(var) - @module_app_title = var - @module_app = ModuleApp.where(:title=>var).desc(:create_date).first - @module_app_key = @module_app.key - end - - def head_label_i18n(var,optoins =nil) + def head_label_i18n(var,options ={}) @head_label = var - @icon_class = optoins[:icon_class] + @icon_class = options[:icon_class] end def available_for(var) @@ -85,17 +82,23 @@ module OrbitApp def finalize! set_controllers_scope - set_default_active_app_auth + # set_default_active_app_auth @context_links.each do |t| - t.set_module_app = @module_app + # t.set_module_app = @module_app t.finalize! end end protected - def set_default_active_app_auth - @active_for_app_auth = @module_app.title - end + # def setup_module_app(var) + # @module_app_title = var + # @module_app = ModuleApp.where(:key=>var).desc(:create_date).first + # @module_app_key = @module_app.key + # end + + # def set_default_active_app_auth + # @active_for_app_auth = @module_app.title + # end def set_controllers_scope var = @active_for_controllers @@ -131,10 +134,10 @@ module OrbitApp @active_for_action[controller] == action end - def set_module_app=(var) - @module_app = var - @module_app_key = var.key - end + # def set_module_app=(var) + # @module_app = var + # @module_app_key = var.key + # end def finalize! set_active_actions diff --git a/lib/orbit_app/module/summary.rb b/lib/orbit_app/module/summary.rb index c3098cb1..16634055 100644 --- a/lib/orbit_app/module/summary.rb +++ b/lib/orbit_app/module/summary.rb @@ -3,7 +3,7 @@ require "orbit_app/summary" module OrbitApp module Module - module Summary + module Summary include OrbitApp::Summary class Item diff --git a/lib/orbit_app/module/widget.rb b/lib/orbit_app/module/widget.rb new file mode 100644 index 00000000..708dc28d --- /dev/null +++ b/lib/orbit_app/module/widget.rb @@ -0,0 +1,108 @@ +module OrbitApp + module Module + module WidgetUtility + Version = "0.1" + + module ClassMethods + @@widgets = [] + + def add(var) + @@widgets << var + 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(&block) + @widgets = [] + @default_widget = nil + @categories_query = '' + @tags_query = '' + block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? + end + + %w{categories_query tags_query}.each do |field| + define_method(field){|var| instance_variable_set( "@" + field, var)} + end + + def get_categories + @categories_query + end + + def get_tags + @tags_query + end + + def default_widget(&block) + @default_widget = DefaultWidget.new(&block) + end + + def customize_widget(name,label,options ={}) + @widgets << Widget.new(name,label,options) + end + + def to_module_app_format + hash = {} + @widgets.collect{|t| hash[t.name] = t.to_hash} + hash + end + + def get_default_widget + return @default_widget + end + + end + + class DefaultWidget + def initialize(&block) + @query = nil + @image = nil + block.arity < 1 ? instance_eval(&block) : block.call(self) if block_given? + end + + def to_module_app_format + {:query=>@query,:image=>@image} rescue nil + end + + def query(var) + @query = var + end + + def image(var) + @image = var + end + + end + + class Widget + attr_reader :name,:default_template,:fields + + def initialize(name,label,options ={}) + @name = name + @fields = options[:fields] + @label = label + end + + def to_hash + {:name => @name,:fields=>@fields,:label=>@label} + end + + def finalize! + + end + + protected + + end# of widget + end # of WidgetRegisition + end # of Module +end # of OrbitApp diff --git a/vendor/built_in_modules/announcement/config/locales/zh_tw.yml b/vendor/built_in_modules/announcement/config/locales/zh_tw.yml index 4814586b..5fd57d49 100644 --- a/vendor/built_in_modules/announcement/config/locales/zh_tw.yml +++ b/vendor/built_in_modules/announcement/config/locales/zh_tw.yml @@ -15,3 +15,6 @@ zh_tw: search: 搜尋公告 update_bulletin_success: 公告已成功更新 update_bulletin_category_success: 公告類別已成功更新 + widget: + index: 目錄Widget + bulletins_and_web_links: 公告與連結並排Widget \ No newline at end of file diff --git a/vendor/built_in_modules/announcement/init.rb b/vendor/built_in_modules/announcement/init.rb index 67be8242..2d8b9ae4 100644 --- a/vendor/built_in_modules/announcement/init.rb +++ b/vendor/built_in_modules/announcement/init.rb @@ -1,9 +1,36 @@ module Announcement OrbitApp.registration "Announcement",:type=> 'ModuleApp' do - + module_label 'announcement.announcement' base_url File.expand_path File.dirname(__FILE__) personal_plugin :enable => true,:path=>"panel/announcement/plugin/profile",:i18n=>'admin.announcement' + version "0.1" + organization "Rulingcom" + author "RD dep" + intro "I am intro" + update_info 'some update_info' + + front_end do + app_page 'bulletins' + end + + category ["BulletinCategory"] + + widgets do + default_widget do + query 'Bulletin.all' + image :image + end + + categories_query 'BulletinCategory.all' + tags_query 'AnnouncementTag.all' + + customize_widget "index","announcement.widget.index",:fields=>["title","category","postdate"] + customize_widget "bulletins_and_web_links","announcement.widget.bulletins_and_web_links" + # item "index","announcement.widget.index",:default_template=>true,:fields=>["title","category","postdate"] + # item "bulletins_and_web_links","announcement.widget.bulletins_and_web_links" + end + side_bar do head_label_i18n 'admin.announcement',:icon_class=>"icons-announcement" available_for [:admin,:guest,:manager,:sub_manager]