lolita 3.1.6 → 3.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +1 -1
- data/History.rdoc +8 -1
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/app/controllers/lolita/info_controller.rb +38 -0
- data/app/controllers/lolita/rest_controller.rb +4 -4
- data/app/views/components/lolita/configuration/column/_display.html.erb +1 -1
- data/app/views/components/lolita/configuration/column/_header.html.erb +1 -1
- data/app/views/components/lolita/configuration/column/_sort.html.erb +1 -1
- data/app/views/components/lolita/configuration/columns/_last.html.erb +2 -2
- data/app/views/components/lolita/configuration/field/_display.html.erb +1 -1
- data/app/views/components/lolita/configuration/field/_label.html.erb +1 -1
- data/app/views/components/lolita/configuration/list/_filter.html.erb +1 -1
- data/app/views/components/lolita/configuration/list/_new_resource.html.erb +1 -1
- data/app/views/components/lolita/configuration/list/_title.html.erb +1 -1
- data/app/views/components/lolita/shared/_header.html.erb +1 -1
- data/app/views/components/lolita/shared/_right_sidebar.html.erb +1 -1
- data/app/views/layouts/lolita/application.html.erb +2 -2
- data/app/views/lolita/info/index.html.erb +232 -0
- data/lib/lolita.rb +3 -0
- data/lib/lolita/builder.rb +218 -55
- data/lib/lolita/configuration/filter.rb +1 -1
- data/lib/lolita/configuration/tab.rb +2 -2
- data/lib/lolita/controllers/component_helpers.rb +4 -5
- data/lib/lolita/controllers/internal_helpers.rb +3 -4
- data/lib/lolita/rails/routes.rb +12 -4
- data/lolita.gemspec +9 -6
- data/public/javascripts/lolita/application.js +1 -0
- data/public/javascripts/lolita/main.js +5 -0
- data/spec/builder_spec.rb +97 -18
- data/spec/controllers/lolita_rest_spec.rb +1 -1
- data/spec/navigation/branch_spec.rb +0 -1
- metadata +117 -118
data/lib/lolita/builder.rb
CHANGED
@@ -7,79 +7,242 @@ module Lolita
|
|
7
7
|
# * #builder is setter/getter method for Lolita::Configuration, that accept Hash or Array or single
|
8
8
|
# String or Symbol for buider.
|
9
9
|
#
|
10
|
+
# Usage in your model
|
11
|
+
# You can change behaviour of any of configuraton elements, to do so you should specify what
|
12
|
+
# builder you want to use.
|
13
|
+
# lolita do
|
14
|
+
# list do
|
15
|
+
# column do
|
16
|
+
# name :my_column
|
17
|
+
# builder :name => "my_columns",:state => :display, :if=>{:state => :display}
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
# This expample show, how to replace :display component of column by your own :display.
|
22
|
+
# <i>:if</i> is determine, that column use builder provided to component render, but when state is <i>:display</i>
|
23
|
+
# then it will be replaced with this on. There are elements, that only have one <i>:display</i> state, than it's
|
24
|
+
# not necessary to provide <i>:if</i> or <i>:unless</i> state.
|
10
25
|
module Builder
|
11
|
-
lolita_accessor :builder
|
12
|
-
|
13
|
-
# Build response. Render component for current class with given options.
|
14
|
-
def build(*args)
|
15
|
-
args||=[]
|
16
|
-
options=args.extract_options!
|
17
|
-
builder_options=self.builder_options || {}
|
18
|
-
options=(options || {}).merge(builder_options)
|
19
|
-
builder_values=self.get_builder(*args)
|
20
|
-
return builder_values[:name].to_sym,builder_values[:state].to_sym,options
|
21
|
-
end
|
22
26
|
|
23
|
-
|
24
|
-
def builder_options
|
25
|
-
{builder_local_variable_name=>self}
|
26
|
-
end
|
27
|
+
class Custom
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
29
|
+
class << self
|
30
|
+
def create(element, *args)
|
31
|
+
possible_builder = extract_args(*args)
|
32
|
+
if possible_builder.is_a?(Hash)
|
33
|
+
Lolita::Builder::Custom.new(element, possible_builder)
|
34
|
+
else
|
35
|
+
possible_builder
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def extract_args(*args)
|
40
|
+
if args && args.any?
|
41
|
+
options = args.extract_options! || {}
|
42
|
+
if args[0] && args[0].is_a?(self)
|
43
|
+
args[0]
|
44
|
+
elsif args[0].is_a?(String) || args[0].is_a?(Symbol)
|
45
|
+
options[:name] = args[0]
|
46
|
+
if args[1]
|
47
|
+
options[:state] = args[1]
|
48
|
+
end
|
49
|
+
options
|
50
|
+
elsif options
|
51
|
+
options
|
52
|
+
else
|
53
|
+
raise ArgumentError, "Don't know how to make builder from #{options}."
|
54
|
+
end
|
55
|
+
else
|
56
|
+
return {}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
attr_accessor :options,:build_attributes
|
62
|
+
|
63
|
+
def initialize(element, attributes_as_hash)
|
64
|
+
@element = element
|
65
|
+
@options = {}
|
66
|
+
@build_attributes = {}
|
67
|
+
@conditions = {}
|
68
|
+
set_attributes(attributes_as_hash)
|
69
|
+
set_default_attribute_values
|
70
|
+
end
|
71
|
+
|
72
|
+
def with(*values)
|
73
|
+
new_values = self.class.extract_args(*values)
|
74
|
+
if new_values.is_a?(Hash)
|
75
|
+
@build_attributes = new_values
|
43
76
|
else
|
44
|
-
|
77
|
+
raise ArgumentError, "Can't build with other builder, use build on that builder!"
|
45
78
|
end
|
79
|
+
self
|
46
80
|
end
|
47
|
-
end
|
48
81
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
82
|
+
def build
|
83
|
+
|
84
|
+
path = if conditions?
|
85
|
+
switch_path do |name,state|
|
86
|
+
if conditions_met?
|
87
|
+
[fixed_name(name).to_sym,state.to_sym]
|
88
|
+
else
|
89
|
+
[self.name, self.state]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
else
|
93
|
+
[self.name,self.state]
|
94
|
+
end
|
95
|
+
result = path + [merged_options]
|
96
|
+
return result
|
97
|
+
end
|
55
98
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
99
|
+
def name
|
100
|
+
result = if build_attributes[:name].to_s.size > 0
|
101
|
+
fixed_name(build_attributes[:name])
|
102
|
+
else
|
103
|
+
fixed_name(@name,build_attributes[:name])
|
104
|
+
end
|
105
|
+
result.to_sym
|
106
|
+
end
|
107
|
+
|
108
|
+
def state
|
109
|
+
result = if build_attributes[:state] && build_attributes[:state].to_s.size > 0
|
110
|
+
build_attributes[:state]
|
111
|
+
else
|
112
|
+
@state
|
113
|
+
end
|
114
|
+
result.to_sym
|
63
115
|
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def switch_path
|
120
|
+
old_name = @name
|
121
|
+
old_state = @state
|
122
|
+
@name = nil
|
123
|
+
@state = default_state
|
124
|
+
result = yield old_name,old_state
|
125
|
+
@name = old_name
|
126
|
+
@state = old_state
|
127
|
+
result
|
128
|
+
end
|
129
|
+
|
130
|
+
def conditions?
|
131
|
+
@conditions.any?
|
132
|
+
end
|
133
|
+
|
134
|
+
def conditions_met?
|
135
|
+
@conditions_met = if conditions?
|
136
|
+
if @conditions[:if]
|
137
|
+
compare(@conditions[:if],true)
|
138
|
+
elsif @conditions[:unless]
|
139
|
+
compare(@conditions[:unless],false)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
@conditions_met
|
143
|
+
end
|
144
|
+
|
145
|
+
def compare(pattern,predicate)
|
146
|
+
result = true
|
147
|
+
pattern.each do |key,value|
|
148
|
+
result &&= ((value.to_sym == self.send(key)) == predicate)
|
149
|
+
end
|
150
|
+
result
|
151
|
+
end
|
152
|
+
|
153
|
+
def fixed_name(name_to_fix, first_part = nil)
|
154
|
+
unless name_to_fix.to_s[0] == "/"
|
155
|
+
"/#{first_part.to_s.size > 0 ? first_part : default_name}/#{name_to_fix}".gsub(/\/{2,}/,"/").gsub(/\/$/,"")
|
156
|
+
else
|
157
|
+
name_to_fix
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
def default_name
|
162
|
+
@element.builder_default_name
|
163
|
+
end
|
164
|
+
|
165
|
+
def default_state
|
166
|
+
@element.builder_default_state
|
167
|
+
end
|
168
|
+
|
169
|
+
def attributes
|
170
|
+
[:name,:state]
|
171
|
+
end
|
172
|
+
|
173
|
+
def conditions
|
174
|
+
[:if,:unless]
|
175
|
+
end
|
176
|
+
|
177
|
+
def merged_options
|
178
|
+
result = {}
|
179
|
+
(@build_attributes || {}).merge(@options).each do |key,value|
|
180
|
+
unless attributes.include?(key.to_sym)
|
181
|
+
result[key.to_sym] = value
|
182
|
+
end
|
183
|
+
end
|
184
|
+
result
|
185
|
+
end
|
186
|
+
|
187
|
+
def set_attributes(attributes_as_hash)
|
188
|
+
attributes_as_hash.each do |attr_name, value|
|
189
|
+
if attributes.include?(attr_name.to_sym)
|
190
|
+
instance_variable_set(:"@#{attr_name}",value)
|
191
|
+
elsif conditions.include?(attr_name.to_sym)
|
192
|
+
@conditions[attr_name.to_sym] = value
|
193
|
+
else
|
194
|
+
@options[attr_name.to_sym] = value
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def set_default_attribute_values
|
200
|
+
@state ||= default_state
|
201
|
+
end
|
202
|
+
|
64
203
|
end
|
65
204
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
205
|
+
def builder *args
|
206
|
+
if args && args.any?
|
207
|
+
set_builder(*args)
|
69
208
|
else
|
70
|
-
|
209
|
+
@builder||=set_builder(nil)
|
210
|
+
@builder
|
71
211
|
end
|
72
|
-
name.gsub(/\/$/,"")
|
73
212
|
end
|
74
213
|
|
75
|
-
def
|
76
|
-
|
214
|
+
def builder=(*args)
|
215
|
+
set_builder(*args)
|
77
216
|
end
|
78
|
-
|
79
|
-
def
|
217
|
+
|
218
|
+
def build *values
|
219
|
+
result = builder.with(*values).build
|
220
|
+
result[result.size-1].merge!(default_options)
|
221
|
+
result
|
222
|
+
end
|
223
|
+
|
224
|
+
def default_options
|
225
|
+
{builder_local_variable_name => self}
|
226
|
+
end
|
227
|
+
|
228
|
+
def builder_default_name
|
80
229
|
self.class.to_s.split("::").map(&:underscore).join("/").to_sym
|
81
230
|
end
|
82
|
-
|
231
|
+
|
232
|
+
alias :builder_name :builder_default_name
|
233
|
+
|
234
|
+
def builder_default_state
|
235
|
+
:display
|
236
|
+
end
|
237
|
+
|
238
|
+
alias :default_build_state :builder_default_state
|
239
|
+
|
240
|
+
private
|
241
|
+
|
242
|
+
def set_builder *args
|
243
|
+
@builder=Lolita::Builder::Custom.create(self,*args)
|
244
|
+
end
|
245
|
+
|
83
246
|
def builder_local_variable_name
|
84
247
|
self.class.to_s.split("::").last.underscore.to_sym
|
85
248
|
end
|
@@ -101,7 +101,7 @@ module Lolita
|
|
101
101
|
|
102
102
|
def html_option_for_select field
|
103
103
|
{
|
104
|
-
:include_blank => I18n.t('lolita.filter.include_blank_by_title', :title => field.title)
|
104
|
+
:include_blank => ::I18n.t('lolita.filter.include_blank_by_title', :title => field.title)
|
105
105
|
}
|
106
106
|
end
|
107
107
|
end
|
@@ -28,7 +28,6 @@ module Lolita
|
|
28
28
|
def render_component *args
|
29
29
|
name,state,options=get_render_options(*args)
|
30
30
|
format=options.delete(:format)
|
31
|
-
|
32
31
|
raise "Can't render component without name!" unless name
|
33
32
|
will_use_component name
|
34
33
|
component_name=File.join(name.to_s,state ? state.to_s : nil)
|
@@ -60,12 +59,12 @@ module Lolita
|
|
60
59
|
end
|
61
60
|
|
62
61
|
def output_with_callbacks(partial_name,name,locals)
|
63
|
-
output= Lolita::Hooks.component(name).run(:before,:run_scope=>self).to_s
|
64
|
-
block_output=Lolita::Hooks.component(name).run(:around, :run_scope=>self) do
|
65
|
-
render(:partial=>partial_name,:locals=>locals)
|
62
|
+
output = Lolita::Hooks.component(name).run(:before,:run_scope => self).to_s
|
63
|
+
block_output = Lolita::Hooks.component(name).run(:around, :run_scope => self) do
|
64
|
+
render(:partial => partial_name,:locals=>locals)
|
66
65
|
end
|
67
66
|
output << block_output.to_s
|
68
|
-
output << Lolita::Hooks.component(name).run(:after,:run_scope=>self).to_s
|
67
|
+
output << Lolita::Hooks.component(name).run(:after,:run_scope => self).to_s
|
69
68
|
output
|
70
69
|
end
|
71
70
|
|
@@ -68,10 +68,9 @@ module Lolita
|
|
68
68
|
def build_response_for(conf_part,options={})
|
69
69
|
# FIXME when asked for some resources that always create new object, there may
|
70
70
|
# not be any args, like lolita.report on something like that
|
71
|
-
|
72
|
-
@
|
73
|
-
@component_object
|
74
|
-
@component_builder=@component_object.build(@component_options)
|
71
|
+
@component_options = options
|
72
|
+
@component_object = resource_class.lolita.send(conf_part.to_sym)
|
73
|
+
@component_builder = @component_object.build(@component_options)
|
75
74
|
end
|
76
75
|
|
77
76
|
|
data/lib/lolita/rails/routes.rb
CHANGED
@@ -12,6 +12,10 @@ module ActionDispatch::Routing
|
|
12
12
|
end
|
13
13
|
Lolita.run(:before_routes_loaded)
|
14
14
|
draw_without_lolita *args,&block
|
15
|
+
draw_without_lolita *args, do
|
16
|
+
match '/lolita' => "lolita/info#index"
|
17
|
+
match '/lolita/info/properties' => "lolita/info#properties"
|
18
|
+
end
|
15
19
|
Lolita.run(:after_routes_loaded)
|
16
20
|
end
|
17
21
|
|
@@ -39,7 +43,7 @@ module ActionDispatch::Routing
|
|
39
43
|
# # lolita_for try to call :lolita_gallery in Mapper class
|
40
44
|
def lolita_for *resources
|
41
45
|
|
42
|
-
return if migrating?
|
46
|
+
return if migrating? || generating_instalation?
|
43
47
|
options = resources.extract_options!
|
44
48
|
|
45
49
|
# if as = options.delete(:as)
|
@@ -91,7 +95,7 @@ module ActionDispatch::Routing
|
|
91
95
|
|
92
96
|
tree=Lolita::Navigation::Tree[:"left_side_navigation"]
|
93
97
|
unless tree.branches.detect{|b| b.object.is_a?(Lolita::Mapping) && b.object.to==mapping.to}
|
94
|
-
tree.append(mapping,:title=>mapping.to.
|
98
|
+
tree.append(mapping,:title=>mapping.to.model_name.human(:count=>2))
|
95
99
|
end
|
96
100
|
}
|
97
101
|
Lolita.common_routes(all_resource_classes).each do |route_name|
|
@@ -123,7 +127,11 @@ module ActionDispatch::Routing
|
|
123
127
|
private
|
124
128
|
|
125
129
|
def migrating?
|
126
|
-
File.basename($0)
|
130
|
+
File.basename($0).match(/^rake/) && (ARGV.include?("db:migrate"))
|
131
|
+
end
|
132
|
+
|
133
|
+
def generating_instalation?
|
134
|
+
File.basename($0).match(/^rails/) && (ARGV.detect{|arg| arg.to_s.match(/lolita[^:]*:.*/)})
|
127
135
|
end
|
128
136
|
end
|
129
|
-
end
|
137
|
+
end
|
data/lolita.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{lolita}
|
8
|
-
s.version = "3.1.
|
8
|
+
s.version = "3.1.7"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["ITHouse (Latvia) and Arturs Meisters"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-10}
|
13
13
|
s.description = %q{Great Rails CMS, that turns your business logic into good-looking, fully functional workspace. }
|
14
14
|
s.email = %q{support@ithouse.lv}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
|
|
26
26
|
"README.rdoc",
|
27
27
|
"Rakefile",
|
28
28
|
"VERSION",
|
29
|
+
"app/controllers/lolita/info_controller.rb",
|
29
30
|
"app/controllers/lolita/rest_controller.rb",
|
30
31
|
"app/helpers/components/lolita/configuration/list_component.rb",
|
31
32
|
"app/helpers/lolita_helper.rb",
|
@@ -78,6 +79,7 @@ Gem::Specification.new do |s|
|
|
78
79
|
"app/views/components/lolita/shared/_header.html.erb",
|
79
80
|
"app/views/components/lolita/shared/_right_sidebar.html.erb",
|
80
81
|
"app/views/layouts/lolita/application.html.erb",
|
82
|
+
"app/views/lolita/info/index.html.erb",
|
81
83
|
"app/views/lolita/rest/form.html.erb",
|
82
84
|
"app/views/lolita/rest/index.html.erb",
|
83
85
|
"author",
|
@@ -149,6 +151,7 @@ Gem::Specification.new do |s|
|
|
149
151
|
"public/images/lolita/plus.png",
|
150
152
|
"public/javascripts/jquery-1.6.min.js",
|
151
153
|
"public/javascripts/jquery-ui-1.8.13.min.js",
|
154
|
+
"public/javascripts/lolita/application.js",
|
152
155
|
"public/javascripts/lolita/main.js",
|
153
156
|
"public/javascripts/lolita/tab.js",
|
154
157
|
"public/javascripts/modernizr-1.7.min.js",
|
@@ -324,7 +327,7 @@ Gem::Specification.new do |s|
|
|
324
327
|
s.homepage = %q{http://github.com/ithouse/lolita}
|
325
328
|
s.licenses = ["MIT"]
|
326
329
|
s.require_paths = ["lib"]
|
327
|
-
s.rubygems_version = %q{1.6.
|
330
|
+
s.rubygems_version = %q{1.6.2}
|
328
331
|
s.summary = %q{Great Rails CMS.}
|
329
332
|
s.test_files = [
|
330
333
|
"spec/adapter_helper.rb",
|
@@ -385,7 +388,7 @@ Gem::Specification.new do |s|
|
|
385
388
|
|
386
389
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
387
390
|
s.add_runtime_dependency(%q<rails>, ["~> 3.0"])
|
388
|
-
s.add_runtime_dependency(%q<kaminari>, ["~> 0.
|
391
|
+
s.add_runtime_dependency(%q<kaminari>, ["~> 0.12.4"])
|
389
392
|
s.add_runtime_dependency(%q<abstract>, [">= 0"])
|
390
393
|
s.add_runtime_dependency(%q<builder>, ["~> 2.1.2"])
|
391
394
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -400,7 +403,7 @@ Gem::Specification.new do |s|
|
|
400
403
|
s.add_development_dependency(%q<akephalos>, [">= 0"])
|
401
404
|
else
|
402
405
|
s.add_dependency(%q<rails>, ["~> 3.0"])
|
403
|
-
s.add_dependency(%q<kaminari>, ["~> 0.
|
406
|
+
s.add_dependency(%q<kaminari>, ["~> 0.12.4"])
|
404
407
|
s.add_dependency(%q<abstract>, [">= 0"])
|
405
408
|
s.add_dependency(%q<builder>, ["~> 2.1.2"])
|
406
409
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -416,7 +419,7 @@ Gem::Specification.new do |s|
|
|
416
419
|
end
|
417
420
|
else
|
418
421
|
s.add_dependency(%q<rails>, ["~> 3.0"])
|
419
|
-
s.add_dependency(%q<kaminari>, ["~> 0.
|
422
|
+
s.add_dependency(%q<kaminari>, ["~> 0.12.4"])
|
420
423
|
s.add_dependency(%q<abstract>, [">= 0"])
|
421
424
|
s.add_dependency(%q<builder>, ["~> 2.1.2"])
|
422
425
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|