sidebar-engine 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
File without changes
data/LICENSE ADDED
File without changes
data/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # SidebarEngine
2
+
3
+ This gem provide sidebar engine base on mongoid for rails application.
4
+
5
+ ## Installation
6
+
7
+ Put it in your `Gemfile`:
8
+
9
+ ```ruby
10
+ gem "sidebar-engine"
11
+ ```
12
+
13
+ And run `bundle install`.
@@ -0,0 +1,12 @@
1
+ class SceneSidebar
2
+ include Mongoid::Document
3
+ field :name, :type => String
4
+ field :description, :type => String
5
+ has_many :sidebars
6
+
7
+ class << self
8
+ def parse_scene(scence)
9
+ self.find_by :name => scence.to_s
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ require "sidebar"
2
+ require "scene_sidebar"
3
+ require "sidebar_helper"
4
+ ActionView::Base.send(:include, SidebarHelper)
data/lib/sidebar.rb ADDED
@@ -0,0 +1,248 @@
1
+ class Sidebar
2
+ include Mongoid::Document
3
+ field :description, :type => String
4
+ field :display_name, :type => String
5
+ field :config, :type=>Hash,:default=>{}
6
+ belongs_to :scene_sidebar
7
+
8
+ class ParamField
9
+ attr_accessor :key
10
+ attr_accessor :options
11
+ attr_accessor :default
12
+ include ActionView::Helpers::TagHelper
13
+ include ActionView::Helpers::FormTagHelper
14
+ include ActionView::Helpers::FormOptionsHelper
15
+
16
+ def initialize(key, default, options = { })
17
+ @key, @default, @options = key.to_s, default, options
18
+ end
19
+
20
+ def label
21
+ options[:label] || key.humanize.gsub(/url/i, 'URL')
22
+ end
23
+
24
+ def label_html(sidebar)
25
+ content_tag('label', label)
26
+ end
27
+
28
+ def input_html(sidebar)
29
+ text_field_tag(input_name(sidebar), sidebar.config[key], { :class => 'span4'})
30
+ end
31
+
32
+ def line_html(sidebar)
33
+ html = label_html(sidebar)
34
+ html << content_tag(:div, input_html(sidebar), :class => 'input')
35
+ end
36
+
37
+ def input_name(sidebar)
38
+ "configure[#{sidebar.id}][#{key}]"
39
+ end
40
+
41
+ def canonicalize(value)
42
+ value
43
+ end
44
+
45
+ class SelectField < self
46
+ def input_html(sidebar)
47
+ select_tag(input_name(sidebar),
48
+ options_for_select(options[:choices], sidebar.config[key]),
49
+ options)
50
+ end
51
+ end
52
+
53
+ class TextAreaField < self
54
+ def input_html(sidebar)
55
+ html_options = { "rows" => "10", "class" => "span4" }.update(options.stringify_keys)
56
+ text_area_tag(input_name(sidebar), sidebar.config[key], html_options)
57
+ end
58
+ end
59
+
60
+ class RadioField < self
61
+ def input_html(sidebar)
62
+ options[:choices].collect do |choice|
63
+ value = value_for(choice)
64
+ radio_button_tag(input_name(sidebar), value,
65
+ value == sidebar.config[key], options) +
66
+ content_tag('label', label_for(choice))
67
+ end.join("<br />")
68
+ end
69
+
70
+ def label_for(choice)
71
+ choice.is_a?(Array) ? choice.last : choice.to_s.humanize
72
+ end
73
+
74
+ def value_for(choice)
75
+ choice.is_a?(Array) ? choice.first : choice
76
+ end
77
+ end
78
+
79
+ class CheckBoxField < self
80
+ def input_html(sidebar)
81
+ hidden_field_tag(input_name(sidebar),0)+
82
+ check_box_tag(input_name(sidebar), 1, sidebar.config[key], options)
83
+ end
84
+
85
+ def line_html(sidebar)
86
+ input_html(sidebar) + ' ' + label_html(sidebar) + '<br >'
87
+ end
88
+
89
+ def canonicalize(value)
90
+ case value
91
+ when "0"
92
+ false
93
+ else
94
+ true
95
+ end
96
+ end
97
+ end
98
+
99
+ def self.build(key, default, options)
100
+ param_field = class_for(options).new(key, default, options)
101
+ end
102
+
103
+ def self.class_for(options)
104
+ case options[:input_type]
105
+ when :text_area
106
+ TextAreaField
107
+ when :textarea
108
+ TextAreaField
109
+ when :radio
110
+ RadioField
111
+ when :checkbox
112
+ CheckBoxField
113
+ when :select
114
+ SelectField
115
+ else
116
+ if options[:choices]
117
+ SelectField
118
+ else
119
+ self
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+
126
+ class << self
127
+ def setting(key, default=nil, options = { })
128
+ return if instance_methods.include?(key.to_s)
129
+ param_fields << ParamField.build(key.to_s, default, options)
130
+ fieldmap.update(key.to_s => param_fields.last)
131
+ self.send(:define_method, key) do
132
+ self.config[key.to_s]
133
+ end
134
+ self.send(:define_method, "#{key}=") do |newval|
135
+ self.config[key.to_s] = newval
136
+ end
137
+ end
138
+
139
+ def fieldmap
140
+ @fieldmap ||= {}
141
+ end
142
+
143
+ def param_fields
144
+ @param_fields ||= []
145
+ end
146
+
147
+ def param_fields=(newval)
148
+ @param_fields = newval
149
+ end
150
+
151
+ def description(desc = nil)
152
+ if desc
153
+ @description = desc
154
+ else
155
+ @description
156
+ end
157
+ end
158
+
159
+ def lifetime(timeout = nil)
160
+ if timeout
161
+ @lifetime = timeout
162
+ else
163
+ @lifetime
164
+ end
165
+ end
166
+
167
+ def short_name
168
+ self.to_s.underscore.split(%r{_}).first
169
+ end
170
+
171
+ def path_name
172
+ self.to_s.underscore
173
+ end
174
+
175
+ def display_name(new_dn = nil)
176
+ @display_name = new_dn if new_dn
177
+ @display_name || short_name.humanize
178
+ end
179
+
180
+ def instantiate(attrs = nil, allocating = false)
181
+ doc = super(attrs,allocating)
182
+ param_fields.each do |field|
183
+ unless doc.config.has_key?(field.key)
184
+ doc.config[field.key] = field.default
185
+ end
186
+ end
187
+ doc
188
+ end
189
+ end
190
+
191
+ def initialize(*args)
192
+ if block_given?
193
+ super(*args) { |instance| yield instance }
194
+ else
195
+ super(*args)
196
+ end
197
+ self.class.param_fields.each do |field|
198
+ unless config.has_key?(field.key)
199
+ config[field.key] = field.default
200
+ end
201
+ end
202
+ end
203
+
204
+ def html_id
205
+ short_name + '-' + id.to_s
206
+ end
207
+
208
+ def parse_request(params,contents,current_user)
209
+ end
210
+
211
+ def param_fields
212
+ self.class.param_fields
213
+ end
214
+
215
+ def fieldmap(field = nil)
216
+ if field
217
+ self.class.fieldmap[field.to_s]
218
+ else
219
+ self.class.fieldmap
220
+ end
221
+ end
222
+
223
+ def description
224
+ self.class.description
225
+ end
226
+
227
+ def short_name
228
+ self.class.short_name
229
+ end
230
+
231
+ def display_name
232
+ self.class.display_name
233
+ end
234
+
235
+ def content_partial
236
+ "/#{self.class.path_name}/content"
237
+ end
238
+
239
+ def to_locals_hash
240
+ param_fields.inject({ :sidebar => self }) do |hash, field|
241
+ hash.merge(field.key => config[field.key])
242
+ end
243
+ end
244
+
245
+ def lifetime
246
+ self.class.lifetime
247
+ end
248
+ end
@@ -0,0 +1,30 @@
1
+ module SidebarHelper
2
+ def render_scene_sidebars(scene)
3
+ scene_htmls = []
4
+ begin
5
+ @scene = SceneSidebar.parse_scene(scene)
6
+ if @scene
7
+ @scene.sidebars.each do |sb|
8
+ sb.parse_request(params,content_hash,controller.current_user)
9
+ scene_htmls << render_sidebar(sb)
10
+ end
11
+ end
12
+ end
13
+ scene_htmls.join
14
+ end
15
+
16
+ def render_sidebar(sidebar)
17
+ render_to_string(:partial => sidebar.content_partial,
18
+ :locals => sidebar.to_locals_hash,
19
+ :layout => false)
20
+ end
21
+
22
+ # get controller instance variables
23
+ def content_hash
24
+ hash = {}
25
+ controller.instance_variables.grep(/@[a-zA-Z]/).map do |var|
26
+ hash[var.to_s] = controller.instance_variable_get(var)
27
+ end
28
+ hash
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: utf-8
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = "sidebar-engine"
5
+ gem.version = "0.0.1"
6
+ gem.platform = Gem::Platform::RUBY
7
+
8
+ gem.homepage = "https://github.com/totothink/sidebar-engine"
9
+ gem.description = %q{provide sidbar engine.}
10
+ gem.summary = gem.description
11
+ gem.authors = ["Aaron"]
12
+ gem.email = ["yalong1976@gmail.com"]
13
+
14
+ gem.files = Dir["lib/*"] + ["README.md", "LICENSE", "sidebar-engine.gemspec","CHANGELOG"]
15
+ gem.require_path = "lib"
16
+
17
+ gem.required_ruby_version = ">= 1.9.3"
18
+
19
+ gem.license = "MIT"
20
+
21
+ gem.add_dependency "mongoid", ">= 2.0"
22
+ gem.add_dependency "rails", ">= 3.2"
23
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sidebar-engine
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Aaron
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-03-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: mongoid
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '2.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '3.2'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '3.2'
46
+ description: provide sidbar engine.
47
+ email:
48
+ - yalong1976@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - lib/sidebar-engine.rb
54
+ - lib/scene_sidebar.rb
55
+ - lib/sidebar_helper.rb
56
+ - lib/sidebar.rb
57
+ - README.md
58
+ - LICENSE
59
+ - sidebar-engine.gemspec
60
+ - CHANGELOG
61
+ homepage: https://github.com/totothink/sidebar-engine
62
+ licenses:
63
+ - MIT
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ! '>='
72
+ - !ruby/object:Gem::Version
73
+ version: 1.9.3
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 1.8.25
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: provide sidbar engine.
86
+ test_files: []