lolita 3.1.0 → 3.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/{GUIDELINE → GUIDELINES} +0 -0
- data/History.rdoc +70 -0
- data/LICENSE.txt +3 -1
- data/README.rdoc +5 -1
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/app/controllers/lolita/rest_controller.rb +1 -1
- data/app/views/components/lolita/configuration/field/array/filter/_display.html.erb +1 -0
- data/app/views/components/lolita/configuration/field/boolean/filter/_display.html.erb +2 -0
- data/app/views/components/lolita/configuration/field/date_time/_display.html.erb +1 -0
- data/app/views/components/lolita/configuration/field/date_time/date/_display.html.erb +1 -0
- data/app/views/components/lolita/configuration/field/date_time/time/_display.html.erb +1 -0
- data/app/views/components/lolita/configuration/field/time/_display.html.erb +1 -1
- data/app/views/components/lolita/configuration/list/_filter.html.erb +2 -2
- data/config/locales/en.yml +4 -1
- data/lib/lolita.rb +18 -11
- data/lib/lolita/adapter/abstract_adapter.rb +1 -1
- data/lib/lolita/adapter/active_record.rb +28 -1
- data/lib/lolita/adapter/mongoid.rb +25 -2
- data/lib/lolita/configuration/field/array.rb +1 -0
- data/lib/lolita/configuration/field/date.rb +1 -1
- data/lib/lolita/configuration/field/date_time.rb +13 -0
- data/lib/lolita/configuration/filter.rb +24 -0
- data/lib/lolita/configuration/list.rb +4 -1
- data/lib/lolita/configuration/page.rb +18 -2
- data/lib/lolita/controllers/internal_helpers.rb +1 -0
- data/lib/lolita/hooks.rb +22 -22
- data/lib/lolita/hooks/named_hook.rb +7 -3
- data/lib/lolita/navigation/branch.rb +7 -0
- data/lib/lolita/navigation/tree.rb +7 -0
- data/lolita.gemspec +22 -12
- data/public/stylesheets/lolita/style.css +16 -0
- data/spec/adapter_helper.rb +1 -1
- data/spec/configuration/filter_spec.rb +63 -1
- data/spec/controllers/internal_helpers_spec.rb +7 -0
- data/spec/controllers/lolita_rest_spec.rb +1 -0
- data/spec/hooks_spec.rb +16 -15
- data/spec/navigation/tree_spec.rb +41 -18
- data/spec/orm/mongoid.rb +4 -7
- data/spec/rails_app/app/mongoid/address.rb +1 -1
- data/spec/rails_app/app/mongoid/category.rb +6 -0
- data/spec/rails_app/app/mongoid/comment.rb +2 -2
- data/spec/rails_app/app/mongoid/post.rb +10 -6
- data/spec/rails_app/app/mongoid/preference.rb +1 -1
- data/spec/rails_app/app/mongoid/profile.rb +3 -3
- data/spec/rails_app/app/mongoid/tag.rb +4 -0
- data/spec/support/factories/category.rb +3 -0
- data/spec/support/factories/post.rb +1 -0
- data/spec/support/factories/tag.rb +3 -0
- metadata +23 -14
- data/.project +0 -17
- data/lib/lolita/navigation.rb +0 -48
- data/log/development.log +0 -0
- data/test/cells/form_cell_test.rb +0 -15
- data/test/test_helper.rb +0 -2
data/{GUIDELINE → GUIDELINES}
RENAMED
File without changes
|
data/History.rdoc
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
=== Version 3.1.0 / 2011-04-12
|
2
|
+
* Enhancements
|
3
|
+
* Hooks added (Arturs Meisters)
|
4
|
+
* Builders updated to complete received names (Arturs Meisters)
|
5
|
+
* Fields renamed to related Ruby or ActiveSupport classes (Gatis Tomsons)
|
6
|
+
* Componente default naming changed to match related model/class structure (Gatis Tomsons)
|
7
|
+
* No need for <em>include Lolita::Configuration</em> and #lolita call for lolita_for
|
8
|
+
related class (Arturs Meisters)
|
9
|
+
* Automatic field type detection from ORM (Arturs Meisters)
|
10
|
+
* List filter introduced (Gatis Tomsons)
|
11
|
+
* Response for JSON (Gatis Tomsons)
|
12
|
+
* Configuration has locales, and Lolita using those to seperate project translation (Arturs Meisters)
|
13
|
+
* DateTime field formation for display only (Valdis Pornieks)
|
14
|
+
|
15
|
+
* Bug fixes
|
16
|
+
* Validation errors fixed (Janis Kesteris)
|
17
|
+
* MongoID adapter fixed to work with new mongoid (Valdis Pornieks)
|
18
|
+
* AR :order option fixed for find methods (Aivils Stoss)
|
19
|
+
* AR migration error fixed (Arturs Meisters)
|
20
|
+
* Redirect after destroy to index (Valdis Pornieks)
|
21
|
+
* Route and nested route bugs fixed (Arturs Meisters)
|
22
|
+
* Multiple textareas with tinyMCE (Valdis Pornieks)
|
23
|
+
* Resource path methods fixed (Arturs Meisters)
|
24
|
+
* #url_for fixed for lolita (Arturs Meisters, Gatis Tomsons)
|
25
|
+
* Layout fixed (Rolands Bondars)
|
26
|
+
|
27
|
+
=== Version 3.0.7 / 2011-03-29
|
28
|
+
* Enhancements
|
29
|
+
* Collection field updated (Arturs Meisters)
|
30
|
+
* #options_for_select added for collection field (Gatis Tomsons)
|
31
|
+
|
32
|
+
=== Version 3.0.6 / 2011-03-29
|
33
|
+
* Enhancements
|
34
|
+
* TinyMCE updated with new buttons (Janis Kesteris)
|
35
|
+
* #add_module changed to support nested routes (Arturs Meisters)
|
36
|
+
* Routes support nested resources (Arturs Meisters)
|
37
|
+
* Fields splited in classes based on type (Arturs Meisters)
|
38
|
+
* #render_component accept :format option (Arturs Meisters)
|
39
|
+
|
40
|
+
* Bug fixes
|
41
|
+
* Collection field collection priority fixed (Arturs Meisters)
|
42
|
+
* JQuery Ajax request updated, to support Rails CSRF fix. (Arturs Meisters)
|
43
|
+
|
44
|
+
=== Version 3.0.5 / 2011-03-23
|
45
|
+
* Enhacements
|
46
|
+
* #by_type for tabs added (Arturs Meisters)
|
47
|
+
* Test module invented and #be_routable matcher added (Arturs Meisters)
|
48
|
+
* Cucumber added for testing (Rolands Bondars)
|
49
|
+
|
50
|
+
* Bug fixes
|
51
|
+
* Small look fixes (Rolands Bondars)
|
52
|
+
* #content_for removed from tab components (Rolands Bondars)
|
53
|
+
|
54
|
+
=== Version 3.0.4 / 2011-03-17
|
55
|
+
* Enhancements
|
56
|
+
* Save button added (Rolands Bondars)
|
57
|
+
* Removed unnecessery stuff from TinyMCE (Rolands Bonadars)
|
58
|
+
* :content used as default type for tabs. (Arturs Meisters)
|
59
|
+
|
60
|
+
=== Version 3.0.3 / 2011-03-16
|
61
|
+
* Enhancements (Arturs Meisters)
|
62
|
+
* First version form 3.x series of Lolita
|
63
|
+
* Basic configuration classes
|
64
|
+
* Basic views
|
65
|
+
* Basic controller and views mechanism
|
66
|
+
* New look (Rolands Bondars)
|
67
|
+
|
68
|
+
=== Versions before 3.0.3
|
69
|
+
Lolita 3.0 is completely different from previous versions and don't have any compability or architecture same as
|
70
|
+
old versions.
|
data/LICENSE.txt
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
=Lolita
|
2
2
|
|
3
|
-
|
3
|
+
Great Rails CMS, that turns your business logic into good-looking, fully functional workspace.
|
4
4
|
==Demo
|
5
5
|
See the demo page at Demo[http://lolita-demo.ithouse.lv]
|
6
6
|
|
@@ -48,3 +48,7 @@ to all controllers.
|
|
48
48
|
If you decide to use some newer version, you most likely should copy new assets to your project.
|
49
49
|
This can be done with
|
50
50
|
rails g lolita:assets
|
51
|
+
|
52
|
+
==License
|
53
|
+
|
54
|
+
Lolita is under MIT license. See LICENSE.txt[https://github.com/ithouse/lolita/blob/master/LICENSE.txt]
|
data/Rakefile
CHANGED
@@ -16,9 +16,9 @@ Jeweler::Tasks.new do |gem|
|
|
16
16
|
gem.homepage = "http://github.com/ithouse/lolita"
|
17
17
|
gem.license = "MIT"
|
18
18
|
gem.summary = %Q{Great Rails CMS.}
|
19
|
-
gem.description = %Q{Great Rails CMS that
|
19
|
+
gem.description = %Q{Great Rails CMS, that turns your business logic into good-looking, fully functional workspace. }
|
20
20
|
gem.email = "support@ithouse.lv"
|
21
|
-
gem.authors = ["ITHouse
|
21
|
+
gem.authors = ["ITHouse (Latvia) and Arturs Meisters"]
|
22
22
|
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
23
23
|
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
24
|
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.1
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= select_tag filter.field_name(field), options_for_select(filter.options_for_select(field), params[filter.field_name(field)]),field.html_options || filter.html_option_for_select(field) %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= datetime_select resource_name, field.name %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= date_select resource_name, field.name %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= time_select resource_name, field.name %>
|
@@ -1 +1 @@
|
|
1
|
-
<%=
|
1
|
+
<%= time_select resource_name, field.name %>
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<% if list.filter? -%>
|
2
2
|
<form action="" action="get" class="filter">
|
3
3
|
<% list.filter.fields.each do |field| %>
|
4
|
-
<%= render_component *field.build %>
|
4
|
+
<%= render_component *field.build(:filter, :filter=>list.filter) %>
|
5
5
|
<% end %>
|
6
|
-
<button type="submit"
|
6
|
+
<button type="submit"><%= I18n.t "lolita.filter.apply_button" %></button>
|
7
7
|
</form>
|
8
8
|
<% end -%>
|
data/config/locales/en.yml
CHANGED
data/lib/lolita.rb
CHANGED
@@ -1,9 +1,23 @@
|
|
1
|
-
main_time=Time.now
|
2
1
|
|
3
2
|
$:<<File.dirname(__FILE__) unless $:.include?(File.dirname(__FILE__))
|
3
|
+
LOLITA_VERSION=File.read(File.expand_path("../../VERSION",__FILE__)).gsub(/[^.\w]/,"")
|
4
|
+
puts "=> Lolita #{LOLITA_VERSION} starting#{defined?(Rails) ? " with Rails" : ""}"
|
5
|
+
|
6
|
+
# TODO should allow run lolita seperated
|
7
|
+
unless (["-d","--debug"] & ARGV).empty?
|
8
|
+
require "ruby-debug"
|
9
|
+
Debugger.settings[:autoeval]=true
|
10
|
+
else
|
11
|
+
unless self.respond_to?(:debugger)
|
12
|
+
def debugger
|
13
|
+
warn "Debugger called at #{caller.first} was ignored, run lolita with -d to attatch debugger."
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
4
17
|
|
5
|
-
require 'abstract'
|
18
|
+
require 'abstract'
|
6
19
|
require 'active_support/core_ext/numeric/time'
|
20
|
+
require 'active_support/core_ext/date_time/conversions'
|
7
21
|
require 'active_support/concern'
|
8
22
|
require 'active_support/callbacks'
|
9
23
|
require 'active_support/dependencies'
|
@@ -105,10 +119,9 @@ module Lolita
|
|
105
119
|
autoload :ViewUserHelpers, 'lolita/controllers/view_user_helpers'
|
106
120
|
end
|
107
121
|
|
108
|
-
autoload(:Navigation,"lolita/navigation")
|
109
122
|
module Navigation
|
110
|
-
autoload :Tree, "lolita/navigation"
|
111
|
-
autoload :Branch, "lolita/navigation"
|
123
|
+
autoload :Tree, "lolita/navigation/tree"
|
124
|
+
autoload :Branch, "lolita/navigation/branch"
|
112
125
|
end
|
113
126
|
|
114
127
|
@@scopes={}
|
@@ -145,12 +158,6 @@ module Lolita
|
|
145
158
|
|
146
159
|
end
|
147
160
|
|
148
|
-
engine_time=Time.now
|
149
|
-
|
150
161
|
if defined?(Rails)
|
151
162
|
require 'lolita/rails/all'
|
152
163
|
end
|
153
|
-
|
154
|
-
puts "Lolita engine started in #{Time.at(Time.now-engine_time).strftime("%M:%S.%3N")}"
|
155
|
-
|
156
|
-
puts "Lolita started in #{Time.at(Time.now-main_time).strftime("%M:%S.%3N")}"
|
@@ -4,7 +4,7 @@ module Lolita
|
|
4
4
|
|
5
5
|
abstract_method '',:fields,:db, :db_name,:collection,:collection_name,:collections,:collection_names
|
6
6
|
abstract_method '',:associations,:associations_class_names
|
7
|
-
abstract_method 'opt={}',:paginate
|
7
|
+
abstract_method 'opt={}',:paginate, :filter
|
8
8
|
abstract_method 'name',:reflect_on_association
|
9
9
|
abstract_method 'association',:association_macro,:association_class_name
|
10
10
|
abstract_method 'id',:find_by_id
|
@@ -70,6 +70,33 @@ module Lolita
|
|
70
70
|
self.klass.paginate(opt)
|
71
71
|
end
|
72
72
|
|
73
|
+
def filter(opt={})
|
74
|
+
conditions = {}
|
75
|
+
joins = []
|
76
|
+
unless opt.empty?
|
77
|
+
opt.each_pair do |k,v|
|
78
|
+
field = klass.columns.detect{|f| f.name == k.to_s}
|
79
|
+
if field
|
80
|
+
conditions[k] = v
|
81
|
+
elsif association = associations[k.to_sym]
|
82
|
+
case association_macro(association)
|
83
|
+
when :many
|
84
|
+
conditions[association.name] = {:id => v}
|
85
|
+
joins << association.name
|
86
|
+
when :one
|
87
|
+
conditions[association.primary_key_name] = v
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
unless conditions.empty?
|
92
|
+
rs = self.klass.where(conditions)
|
93
|
+
joins.each { |join| rs = rs.joins(join) }
|
94
|
+
return rs
|
95
|
+
end
|
96
|
+
end
|
97
|
+
self
|
98
|
+
end
|
99
|
+
|
73
100
|
def db
|
74
101
|
self.klass.connection
|
75
102
|
end
|
@@ -112,7 +139,7 @@ module Lolita
|
|
112
139
|
def type_cast name
|
113
140
|
types = {
|
114
141
|
'decimal' => 'big_decimal',
|
115
|
-
'datetime' => '
|
142
|
+
'datetime' => 'date_time',
|
116
143
|
'text' => 'string'
|
117
144
|
}
|
118
145
|
types[name.to_s] || name
|
@@ -30,14 +30,16 @@ module Lolita
|
|
30
30
|
case macro
|
31
31
|
when :references_many
|
32
32
|
:many
|
33
|
+
when :references_and_referenced_in_many
|
34
|
+
:many
|
33
35
|
when :referenced_in
|
34
36
|
:one
|
37
|
+
when :references_one
|
38
|
+
:one
|
35
39
|
when :embeds_one
|
36
40
|
:one
|
37
41
|
when :embeds_many
|
38
42
|
:many
|
39
|
-
when :references_one
|
40
|
-
:one
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
@@ -64,6 +66,27 @@ module Lolita
|
|
64
66
|
self.klass.paginate(options)
|
65
67
|
end
|
66
68
|
|
69
|
+
def filter(opt={})
|
70
|
+
conditions = {}
|
71
|
+
unless opt.empty?
|
72
|
+
opt.each_pair do |k,v|
|
73
|
+
field = klass.fields.detect{|name,f| name == k.to_s}
|
74
|
+
if field
|
75
|
+
conditions[k] = v
|
76
|
+
elsif association = associations[k.to_s]
|
77
|
+
case association_macro(association)
|
78
|
+
when :many
|
79
|
+
conditions[:"#{klass.reflect_on_association(k).key}".in] = [v]
|
80
|
+
when :one
|
81
|
+
conditions[klass.reflect_on_association(k).foreign_key] = v
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
return self.klass.where(conditions)
|
86
|
+
end
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
67
90
|
def db
|
68
91
|
self.klass.db
|
69
92
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
module Lolita
|
2
3
|
module Configuration
|
3
4
|
class Filter
|
@@ -13,6 +14,7 @@ module Lolita
|
|
13
14
|
|
14
15
|
def field *args, &block
|
15
16
|
field=Lolita::Configuration::Field.add(self.dbi,*args,&block)
|
17
|
+
field
|
16
18
|
@fields<<field
|
17
19
|
field
|
18
20
|
end
|
@@ -58,6 +60,28 @@ module Lolita
|
|
58
60
|
end
|
59
61
|
end
|
60
62
|
|
63
|
+
def field_name field
|
64
|
+
#'f_'+('a'..'z').to_a[self.fields.index(field)]
|
65
|
+
"f_#{field.name}"
|
66
|
+
end
|
67
|
+
|
68
|
+
def options_for_select field
|
69
|
+
if field.options_for_select
|
70
|
+
field.options_for_select
|
71
|
+
else
|
72
|
+
if field.association_values.respond_to?(:call)
|
73
|
+
field.association_values.call(self)
|
74
|
+
else
|
75
|
+
field.association_values
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def html_option_for_select field
|
81
|
+
{
|
82
|
+
:include_blank => I18n.t('lolita.filter.include_blank_by_title', :title => field.title)
|
83
|
+
}
|
84
|
+
end
|
61
85
|
end
|
62
86
|
end
|
63
87
|
end
|
@@ -57,7 +57,10 @@ module Lolita
|
|
57
57
|
@filter.is_a?(Lolita::Configuration::Filter)
|
58
58
|
end
|
59
59
|
|
60
|
-
#
|
60
|
+
# Filter by now works only for these field types:
|
61
|
+
# - belongs_to
|
62
|
+
# - boolean
|
63
|
+
#
|
61
64
|
def filter(*args,&block)
|
62
65
|
@filter ||= Lolita::Configuration::Filter.new(self.dbi,*args,&block)
|
63
66
|
end
|
@@ -58,18 +58,19 @@ module Lolita
|
|
58
58
|
def paginate *args
|
59
59
|
options=args ? args.extract_options! : {}
|
60
60
|
hold=options.delete(:hold)
|
61
|
+
@params=options.delete(:params)
|
61
62
|
set_values_from_options(options)
|
62
63
|
options[:page]||=((args && args.first) || 1)
|
63
64
|
options[:per_page]||=@per_page || 10
|
64
65
|
@last_options=options
|
65
|
-
@last_options[:sort]=self.sort_columns
|
66
|
+
@last_options[:sort]=self.sort_columns unless self.sort_columns.empty?
|
66
67
|
unless hold
|
67
68
|
get_page()
|
68
69
|
end
|
69
70
|
end
|
70
71
|
|
71
72
|
def get_page()
|
72
|
-
@page=@dbi.paginate((@page_options||{}).merge(@last_options))
|
73
|
+
@page=@dbi.filter(filter_conditions).paginate((@page_options||{}).merge(@last_options))
|
73
74
|
end
|
74
75
|
|
75
76
|
# Return last paginated page
|
@@ -83,6 +84,21 @@ module Lolita
|
|
83
84
|
|
84
85
|
private
|
85
86
|
|
87
|
+
# returns filter conditions as Hash for get_page()
|
88
|
+
def filter_conditions
|
89
|
+
if @params
|
90
|
+
conditions = {}
|
91
|
+
@params.each_pair do |k,v|
|
92
|
+
if k.to_s =~ /^f_([a-z0-9_\-]+)$/ && !v.to_s.strip.blank?
|
93
|
+
conditions[$1.to_sym] = v
|
94
|
+
end
|
95
|
+
end
|
96
|
+
conditions
|
97
|
+
else
|
98
|
+
{}
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
86
102
|
def allowed_options
|
87
103
|
[:sort_columns,:asc,:desc]
|
88
104
|
end
|