lolita 3.2.0.rc.7 → 3.2.0.rc.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +31 -0
- data/Gemfile +15 -36
- data/History.rdoc +9 -3
- data/README.md +57 -30
- data/Rakefile +1 -44
- data/app/assets/javascripts/lolita/list.js +28 -0
- data/app/assets/javascripts/lolita/main.js +81 -12
- data/app/assets/javascripts/lolita/tab.js +37 -32
- data/app/assets/stylesheets/lolita/style.css.erb +58 -18
- data/app/controllers/lolita/field_data_controller.rb +13 -9
- data/app/controllers/lolita/info_controller.rb +3 -5
- data/app/controllers/lolita/rest_controller.rb +53 -24
- data/app/helpers/components/lolita/configuration_component.rb +1 -1
- data/app/views/components/lolita/configuration/action/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/column/_display.html.haml +4 -0
- data/app/views/components/lolita/configuration/column/_first.html.haml +2 -0
- data/app/views/components/lolita/configuration/column/_last.html.haml +5 -0
- data/app/views/components/lolita/configuration/column/header/_display.html.haml +5 -0
- data/app/views/components/lolita/configuration/column/header/_first.html.haml +1 -0
- data/app/views/components/lolita/configuration/column/header/_last.html.haml +1 -0
- data/app/views/components/lolita/configuration/column/header/_sort.html.haml +6 -0
- data/app/views/components/lolita/configuration/columns/_display.html.haml +2 -0
- data/app/views/components/lolita/configuration/columns/body/_display.html.haml +3 -0
- data/app/views/components/lolita/configuration/columns/body/row/_display.html.haml +5 -0
- data/app/views/components/lolita/configuration/columns/header/_display.html.haml +5 -0
- data/app/views/components/lolita/configuration/field/_display.html.haml +7 -0
- data/app/views/components/lolita/configuration/field/_label.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/_object.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/array/_display.html.haml +5 -0
- data/app/views/components/lolita/configuration/field/array/autocomplete/_display.html.haml +1 -1
- data/app/views/components/lolita/configuration/field/array/autocomplete/_input.html.haml +2 -2
- data/app/views/components/lolita/configuration/field/array/polymorphic/_display.html.haml +3 -3
- data/app/views/components/lolita/configuration/field/array/select/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/big_decimal/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/boolean/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/date/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/date_time/_display.html.haml +2 -0
- data/app/views/components/lolita/configuration/field/date_time/date/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/date_time/time/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/float/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/integer/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/string/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/string/disabled/_display.html.haml +2 -0
- data/app/views/components/lolita/configuration/field/string/hidden/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/string/password/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field/string/text/_display.html.haml +7 -0
- data/app/views/components/lolita/configuration/field/time/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/field_set/_display.html.haml +3 -0
- data/app/views/components/lolita/configuration/filter/_display.html.haml +9 -0
- data/app/views/components/lolita/configuration/list/_display.html.haml +9 -0
- data/app/views/components/lolita/configuration/list/_new_resource.html.haml +4 -0
- data/app/views/components/lolita/configuration/list/_paginator.html.haml +1 -0
- data/app/views/components/lolita/configuration/list/_title.html.haml +6 -0
- data/app/views/components/lolita/configuration/nested_form/_display.html.haml +12 -0
- data/app/views/components/lolita/configuration/nested_form/_fields.html.haml +8 -0
- data/app/views/components/lolita/configuration/nested_list/_display.html.haml +7 -0
- data/app/views/components/lolita/configuration/nested_list/_paginator.html.haml +2 -0
- data/app/views/components/lolita/configuration/tab/_display.html.haml +4 -0
- data/app/views/components/lolita/configuration/tab/_error_msg.html.haml +14 -0
- data/app/views/components/lolita/configuration/tab/_fields.html.haml +6 -0
- data/app/views/components/lolita/configuration/tab/_form.html.haml +4 -0
- data/app/views/components/lolita/configuration/tab/_title.html.haml +3 -0
- data/app/views/components/lolita/configuration/tab/content/_display.html.haml +1 -0
- data/app/views/components/lolita/configuration/tab/default/_display.html.haml +2 -0
- data/app/views/components/lolita/configuration/tabs/_display.html.haml +10 -0
- data/app/views/components/lolita/configuration/tabs/_form.html.haml +7 -0
- data/app/views/components/lolita/navigation/_display.html.haml +2 -0
- data/app/views/components/lolita/navigation/_tree.html.haml +14 -0
- data/app/views/components/lolita/shared/_buttons.html.haml +6 -0
- data/app/views/components/lolita/shared/_flash.html.haml +3 -0
- data/app/views/components/lolita/shared/_header.html.haml +7 -0
- data/app/views/components/lolita/shared/_languages.html.haml +11 -0
- data/app/views/components/lolita/shared/_right_sidebar.html.haml +6 -0
- data/app/views/components/lolita/shared/_save_button.html.haml +1 -0
- data/app/views/layouts/lolita/application.html.haml +36 -0
- data/app/views/lolita/rest/form.html.haml +1 -0
- data/app/views/lolita/rest/index.html.haml +1 -0
- data/app/views/lolita/rest/index.js.erb +1 -0
- data/config/locales/en.yml +4 -0
- data/config/locales/lv.yml +5 -2
- data/lib/generators/lolita/uninstall_generator.rb +76 -0
- data/lib/lolita.rb +104 -170
- data/lib/lolita/adapter/abstract_adapter.rb +1 -0
- data/lib/lolita/adapter/active_record.rb +22 -55
- data/lib/lolita/adapter/common_helper.rb +252 -0
- data/lib/lolita/adapter/mongoid.rb +11 -55
- data/lib/lolita/base.rb +5 -0
- data/lib/lolita/builder.rb +3 -3
- data/lib/lolita/components/base.rb +12 -0
- data/lib/lolita/components/configuration/column_component.rb +31 -0
- data/lib/lolita/components/configuration/list_component.rb +11 -0
- data/lib/lolita/configuration.rb +61 -0
- data/lib/lolita/configuration/action.rb +53 -0
- data/lib/lolita/configuration/base.rb +23 -71
- data/lib/lolita/configuration/column.rb +50 -16
- data/lib/lolita/configuration/columns.rb +51 -23
- data/lib/lolita/configuration/core.rb +80 -0
- data/lib/lolita/configuration/factory/field.rb +8 -3
- data/lib/lolita/configuration/factory/tab.rb +12 -6
- data/lib/lolita/configuration/field.rb +8 -11
- data/lib/lolita/configuration/field/array.rb +7 -9
- data/lib/lolita/configuration/fields.rb +1 -1
- data/lib/lolita/configuration/filter.rb +26 -19
- data/lib/lolita/configuration/list.rb +143 -80
- data/lib/lolita/configuration/nested_list.rb +102 -0
- data/lib/lolita/configuration/search.rb +14 -0
- data/lib/lolita/configuration/tab.rb +13 -9
- data/lib/lolita/configuration/tab/content.rb +6 -0
- data/lib/lolita/configuration/tab/default.rb +2 -2
- data/lib/lolita/configuration/tabs.rb +35 -82
- data/lib/lolita/controller_additions.rb +4 -3
- data/lib/lolita/controllers.rb +13 -0
- data/lib/lolita/controllers/authentication_helpers.rb +17 -0
- data/lib/lolita/controllers/component_helpers.rb +9 -5
- data/lib/lolita/controllers/internal_helpers.rb +22 -97
- data/lib/lolita/controllers/rails_helpers.rb +132 -0
- data/lib/lolita/controllers/url_helpers.rb +1 -1
- data/lib/lolita/errors.rb +3 -0
- data/lib/lolita/extensions/authentication/default_adapter.rb +24 -0
- data/lib/lolita/extensions/authentication/devise_adapter.rb +58 -0
- data/lib/lolita/extensions/authentication/proxy.rb +60 -0
- data/lib/lolita/extensions/authorization/cancan_adapter.rb +45 -0
- data/lib/lolita/extensions/authorization/default_adapter.rb +29 -0
- data/lib/lolita/extensions/authorization/proxy.rb +48 -0
- data/lib/lolita/extensions/extensions.rb +66 -0
- data/lib/lolita/helpers.rb +12 -0
- data/lib/lolita/lazy_loader.rb +15 -10
- data/lib/lolita/mapping.rb +25 -19
- data/lib/lolita/navigation/branch.rb +29 -2
- data/lib/lolita/navigation/tree.rb +6 -0
- data/lib/lolita/observed_array.rb +1 -1
- data/lib/lolita/orm.rb +7 -0
- data/lib/lolita/processors/request_processor.rb +38 -0
- data/lib/lolita/rails/engine.rb +24 -0
- data/lib/lolita/{modules/rest.rb → rails/railtie.rb} +8 -2
- data/lib/lolita/rails/routes.rb +26 -29
- data/lib/lolita/register.rb +48 -0
- data/lib/lolita/ruby_ext/lolita_model_name.rb +37 -0
- data/lib/lolita/system_configuration/application.rb +1 -0
- data/lib/lolita/system_configuration/base.rb +12 -5
- data/lib/lolita/utils.rb +14 -0
- data/lib/lolita/version.rb +30 -0
- data/lolita.gemspec +26 -398
- data/spec/configuration/base_spec.rb +14 -35
- data/spec/configuration/column_spec.rb +51 -2
- data/spec/configuration/columns_spec.rb +13 -19
- data/spec/configuration/core_spec.rb +89 -0
- data/spec/configuration/field_spec.rb +17 -5
- data/spec/configuration/filter_spec.rb +76 -61
- data/spec/configuration/list_spec.rb +339 -45
- data/spec/configuration/nested_list_spec.rb +111 -0
- data/spec/configuration/search_spec.rb +1 -1
- data/spec/configuration/tabs_spec.rb +89 -74
- data/spec/controllers/configuration_spec.rb +15 -0
- data/spec/controllers/internal_helpers_spec.rb +1 -1
- data/spec/controllers/lolita_rest_spec.rb +31 -2
- data/spec/coverage_helper.rb +33 -0
- data/spec/extensions/authentication/default_adapter_spec.rb +34 -0
- data/spec/extensions/authentication/devise_adapter_spec.rb +94 -0
- data/spec/extensions/authentication/proxy_spec.rb +55 -0
- data/spec/extensions/authorization/cancan_adapter_spec.rb +94 -0
- data/spec/extensions/authorization/default_adapter_spec.rb +43 -0
- data/spec/extensions/authorization/proxy_spec.rb +60 -0
- data/spec/extensions/extensions_spec.rb +45 -0
- data/spec/fabricators/category_fabricator.rb +3 -0
- data/spec/fabricators/post_fabricator.rb +4 -0
- data/spec/fabricators/tag_fabricator.rb +3 -0
- data/spec/lolita_spec.rb +1 -0
- data/spec/orm/mongoid.rb +1 -0
- data/spec/rails_app/app/mongoid/category.rb +14 -1
- data/spec/rails_app/app/mongoid/post.rb +9 -1
- data/spec/rails_app/config/application.rb +0 -4
- data/spec/rails_app/config/boot.rb +1 -2
- data/spec/register_spec.rb +50 -0
- data/spec/search/simple_spec.rb +4 -4
- data/spec/simple_spec_helper.rb +2 -1
- data/spec/spec_helper.rb +22 -35
- data/vendor/assets/javascripts/tinymce_config.js +5 -3
- metadata +202 -180
- data/.document +0 -5
- data/GUIDELINES.rdoc +0 -22
- data/VERSION +0 -1
- data/app/helpers/lolita_helper.rb +0 -23
- data/app/views/components/lolita/configuration/column/_display.html.erb +0 -4
- data/app/views/components/lolita/configuration/column/_header.html.erb +0 -7
- data/app/views/components/lolita/configuration/column/_sort.html.erb +0 -7
- data/app/views/components/lolita/configuration/columns/_body.html.erb +0 -5
- data/app/views/components/lolita/configuration/columns/_display.html.erb +0 -2
- data/app/views/components/lolita/configuration/columns/_first.html.erb +0 -3
- data/app/views/components/lolita/configuration/columns/_first_column_header.html.erb +0 -3
- data/app/views/components/lolita/configuration/columns/_header.html.erb +0 -9
- data/app/views/components/lolita/configuration/columns/_last.html.erb +0 -4
- data/app/views/components/lolita/configuration/columns/_last_column_header.html.erb +0 -3
- data/app/views/components/lolita/configuration/columns/_row.html.erb +0 -7
- data/app/views/components/lolita/configuration/field/_display.html.erb +0 -13
- data/app/views/components/lolita/configuration/field/_label.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/_object.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/array/_display.html.erb +0 -5
- data/app/views/components/lolita/configuration/field/array/filter/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/array/select/_display.html.erb +0 -4
- data/app/views/components/lolita/configuration/field/big_decimal/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/boolean/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/boolean/filter/_display.html.erb +0 -2
- data/app/views/components/lolita/configuration/field/date/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/date_time/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/date_time/date/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/date_time/time/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/float/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/hidden/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/integer/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/string/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/string/disabled/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field/string/password/_display.html.erb +0 -3
- data/app/views/components/lolita/configuration/field/string/text/_display.html.erb +0 -11
- data/app/views/components/lolita/configuration/field/time/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/field_set/_display.html.erb +0 -5
- data/app/views/components/lolita/configuration/list/_display.html.erb +0 -11
- data/app/views/components/lolita/configuration/list/_filter.html.erb +0 -8
- data/app/views/components/lolita/configuration/list/_new_resource.html.erb +0 -6
- data/app/views/components/lolita/configuration/list/_paginator.html.erb +0 -1
- data/app/views/components/lolita/configuration/list/_title.html.erb +0 -10
- data/app/views/components/lolita/configuration/nested_form/_display.html.erb +0 -15
- data/app/views/components/lolita/configuration/nested_form/_fields.html.erb +0 -13
- data/app/views/components/lolita/configuration/tab/_display.html.erb +0 -8
- data/app/views/components/lolita/configuration/tab/_error_msg.html.erb +0 -20
- data/app/views/components/lolita/configuration/tab/_fields.html.erb +0 -9
- data/app/views/components/lolita/configuration/tab/_form.html.erb +0 -8
- data/app/views/components/lolita/configuration/tab/content/_display.html.erb +0 -1
- data/app/views/components/lolita/configuration/tab/default/_display.html.erb +0 -3
- data/app/views/components/lolita/configuration/tabs/_display.html.erb +0 -11
- data/app/views/components/lolita/navigation/_display.html.erb +0 -3
- data/app/views/components/lolita/navigation/_tree.html.erb +0 -32
- data/app/views/components/lolita/shared/_flash.html.erb +0 -5
- data/app/views/components/lolita/shared/_header.html.erb +0 -9
- data/app/views/components/lolita/shared/_right_sidebar.html.erb +0 -9
- data/app/views/components/lolita/shared/_save_button.html.erb +0 -6
- data/app/views/layouts/lolita/application.html.erb +0 -37
- data/app/views/lolita/rest/form.html.erb +0 -1
- data/app/views/lolita/rest/index.html.erb +0 -1
- data/config/locales/default/lv.yml +0 -181
- data/db/seed.rb +0 -1
- data/features/create_page.feature +0 -20
- data/features/step_definitions/lolita_steps.rb +0 -7
- data/features/step_definitions/web_steps.rb +0 -219
- data/features/support/env.rb +0 -73
- data/features/support/paths.rb +0 -35
- data/lib/lolita/controllers/authorization_helpers.rb +0 -56
- data/lib/lolita/controllers/user_helpers.rb +0 -44
- data/lib/lolita/modules.rb +0 -6
- data/lib/lolita/rails.rb +0 -23
- data/lib/lolita/rails/all.rb +0 -11
- data/spec/support/factories/category.rb +0 -3
- data/spec/support/factories/post.rb +0 -4
- data/spec/support/factories/tag.rb +0 -3
@@ -0,0 +1,252 @@
|
|
1
|
+
module Lolita
|
2
|
+
module Adapter
|
3
|
+
module CommonHelper
|
4
|
+
|
5
|
+
class Record
|
6
|
+
def initialize(adapter,orm_record)
|
7
|
+
@adapter = adapter
|
8
|
+
@record = orm_record
|
9
|
+
end
|
10
|
+
|
11
|
+
def title
|
12
|
+
if @record.respond_to?(:title)
|
13
|
+
@record.title
|
14
|
+
elsif @record.respond_to?(:name)
|
15
|
+
@record.name
|
16
|
+
elsif content_field = @adapter.fields.detect{|f| f.type.to_s=="string"}
|
17
|
+
@record.send(content_field.name)
|
18
|
+
else
|
19
|
+
"#{@record.class.lolita_model_name.human} #{@record.id}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class PaginationBuilder
|
25
|
+
def initialize adapter,page,per,options
|
26
|
+
@adapter = adapter
|
27
|
+
@page = page
|
28
|
+
@per = per
|
29
|
+
@options = options || {}
|
30
|
+
end
|
31
|
+
|
32
|
+
def params
|
33
|
+
request.respond_to?(:params) && request.params || {}
|
34
|
+
end
|
35
|
+
|
36
|
+
def request
|
37
|
+
@options[:request]
|
38
|
+
end
|
39
|
+
|
40
|
+
def set_nested_criteria
|
41
|
+
nested_hsh = params[:nested]
|
42
|
+
if params[:nested] && !params[:nested][:association]
|
43
|
+
nested_hsh = nested_hsh.reject{|k,v| [:parent,:path].include?(k.to_sym)}
|
44
|
+
@nested_criteria = @adapter.klass.where(nested_hsh)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_relation
|
49
|
+
@relation = if params[:nested] && params[:nested][:association]
|
50
|
+
@adapter.find_by_id(hsh[:nested][:id]).send(hsh[:nested][:association])
|
51
|
+
else
|
52
|
+
@adapter.klass.unscoped
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def set_custom_criteria
|
57
|
+
if @options[:pagination_method]
|
58
|
+
if @options[:pagination_method].respond_to?(:each)
|
59
|
+
@options[:pagination_method].each do |method_name|
|
60
|
+
@options[:previous_scope] = scope
|
61
|
+
if new_criteria = pagination_criteria_for_klass(method_name,@page,@per,@options)
|
62
|
+
@custom_criteria = @custom_criteria ? @custom_criteria.merge(new_criteria) : new_criteria
|
63
|
+
end
|
64
|
+
end
|
65
|
+
else
|
66
|
+
@custom_criteria = pagination_scope_for_klass(@options[:pagination_method],@page,@per,@options)
|
67
|
+
end
|
68
|
+
raise ArgumentError, "Didn't generate any scope from #{@options} page:{page} per:#{@per}" unless @custom_criteria
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def pagination_scope_for_klass(method_name,page,per,options)
|
73
|
+
if @adapter.klass.respond_to?(method_name)
|
74
|
+
@adapter.klass.send(method_name,page,per,options)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def create_page
|
79
|
+
set_nested_criteria
|
80
|
+
set_relation
|
81
|
+
set_custom_criteria
|
82
|
+
|
83
|
+
page_criteria = if @nested_criteria
|
84
|
+
@relation.merge(@nested_criteria)
|
85
|
+
else
|
86
|
+
@relation
|
87
|
+
end
|
88
|
+
if @custom_criteria
|
89
|
+
page_criteria = @custom_criteria.merge(page_criteria)
|
90
|
+
end
|
91
|
+
unless page_criteria.respond_to?(:current_page)
|
92
|
+
page_criteria = page_criteria.page(@page).per(@per)
|
93
|
+
end
|
94
|
+
page_criteria
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def record(orm_record)
|
99
|
+
Record.new(self,orm_record)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Return all association class names
|
103
|
+
def associations_class_names
|
104
|
+
self.associations.map{|name,association|
|
105
|
+
association.class_name
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
def association_by_klass(given_klass)
|
110
|
+
associations.select{|name,association|
|
111
|
+
association.klass == given_klass
|
112
|
+
}.values.first
|
113
|
+
end
|
114
|
+
|
115
|
+
def filter attributes={}
|
116
|
+
klass.where(attributes.reject{|k,v| v.blank? })
|
117
|
+
end
|
118
|
+
|
119
|
+
# Detect if class reflect on association by name
|
120
|
+
def reflect_on_association(name)
|
121
|
+
if orm_association = klass.reflect_on_association(name)
|
122
|
+
self.class.const_get(:Association).new(orm_association,self)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def by_id(id)
|
127
|
+
klass.where(klass.primary_key => id)
|
128
|
+
end
|
129
|
+
|
130
|
+
def find_by_id(id)
|
131
|
+
self.klass.unscoped.merge(by_id(id)).first
|
132
|
+
end
|
133
|
+
|
134
|
+
# def nested_scope_from_hash(hsh)
|
135
|
+
# nested_hsh ||= (hsh[:nested] || {})
|
136
|
+
# unless nested_hsh[:association]
|
137
|
+
# nested_hsh = nested_hsh.reject{|k,v| [:parent,:path].include?(k.to_sym)}
|
138
|
+
# criteria = klass.where(nested_hsh)
|
139
|
+
# criteria
|
140
|
+
# end
|
141
|
+
# end
|
142
|
+
|
143
|
+
# def scope_from_hash(hsh)
|
144
|
+
# if hsh[:nested] && hsh[:nested][:association]
|
145
|
+
# klass.find_by_id(hsh[:nested][:id]).send(hsh[:nested][:association])
|
146
|
+
# end
|
147
|
+
# end
|
148
|
+
|
149
|
+
# This method is used to paginate, main reason is for list and for index action.
|
150
|
+
# Method accepts three arguments
|
151
|
+
# <tt>page</tt> - page that should be shown (integer)
|
152
|
+
# <tt>per</tt> - how many records there should be in page
|
153
|
+
# <tt>options</tt> - Hash with optional information.
|
154
|
+
# By default, Lolita::Configuration::List passes request, with current request information.
|
155
|
+
# Also it passes <i>:pagination_method</i> that is used to detect if there is special method(-s) in model
|
156
|
+
# that should be used for creating page.
|
157
|
+
def paginate(page,per,options ={})
|
158
|
+
|
159
|
+
pagination_builder = PaginationBuilder.new(self,page,per,options)
|
160
|
+
pagination_builder.create_page
|
161
|
+
|
162
|
+
# criteria = options[:request].respond_to?(:params) && nested_scope_from_hash(options[:request].params) || {}
|
163
|
+
# scope = options[:request].respond_to?(:params) && scope_from_hash(options[:request].params) || klass.unscoped
|
164
|
+
|
165
|
+
# if options[:pagination_method]
|
166
|
+
# if options[:pagination_method].respond_to?(:each)
|
167
|
+
# options[:pagination_method].each do |method_name|
|
168
|
+
# options[:previous_scope] = scope
|
169
|
+
# if new_criteria = pagination_criteria_for_klass(method_name,page,per,options)
|
170
|
+
# criteria = criteria ? criteria.merge(new_criteria) : new_criteria
|
171
|
+
# end
|
172
|
+
# end
|
173
|
+
# else
|
174
|
+
# new_criteria = pagination_scope_for_klass(options[:pagination_method],page,per,options)
|
175
|
+
# criteria = if new_criteria.respond_to?(:current_page) #already have per and page
|
176
|
+
# new_criteria
|
177
|
+
# else
|
178
|
+
# criteria && criteria.merge(new_criteria) || new_criteria
|
179
|
+
# end
|
180
|
+
# end
|
181
|
+
# raise ArgumentError, "Didn't generate any scope from #{options} page:{page} per:#{per}" unless criteria
|
182
|
+
# criteria
|
183
|
+
# else
|
184
|
+
# scope.merge(criteria).page(page).per(per)
|
185
|
+
# end
|
186
|
+
end
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
def switch_record_state(record, state = nil)
|
191
|
+
set_state_for(record)
|
192
|
+
if state
|
193
|
+
record.send(:"#{state}_state!")
|
194
|
+
elsif !record.have_state?
|
195
|
+
if record.new_record?
|
196
|
+
record.create_state!
|
197
|
+
else
|
198
|
+
record.update_state!
|
199
|
+
end
|
200
|
+
end
|
201
|
+
record
|
202
|
+
end
|
203
|
+
|
204
|
+
def set_state_for(record)
|
205
|
+
unless record.respond_to?(:read_state!)
|
206
|
+
class << record
|
207
|
+
|
208
|
+
def set_state(new_state)
|
209
|
+
@state_set = true
|
210
|
+
@state = new_state
|
211
|
+
end
|
212
|
+
|
213
|
+
def have_state?
|
214
|
+
@state_set
|
215
|
+
end
|
216
|
+
|
217
|
+
def read_state!
|
218
|
+
set_state :read
|
219
|
+
end
|
220
|
+
|
221
|
+
def create_state!
|
222
|
+
set_state :create
|
223
|
+
end
|
224
|
+
|
225
|
+
def update_state!
|
226
|
+
set_state :update
|
227
|
+
end
|
228
|
+
|
229
|
+
def state
|
230
|
+
set_state(:read) unless @state
|
231
|
+
@state
|
232
|
+
end
|
233
|
+
|
234
|
+
def in_read_state?
|
235
|
+
state == :read
|
236
|
+
end
|
237
|
+
|
238
|
+
def in_create_state?
|
239
|
+
state == :create
|
240
|
+
end
|
241
|
+
|
242
|
+
def in_update_state?
|
243
|
+
state == :update
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
record
|
248
|
+
end
|
249
|
+
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
@@ -27,6 +27,14 @@ module Lolita
|
|
27
27
|
@association.foreign_key
|
28
28
|
end
|
29
29
|
|
30
|
+
def through?
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
34
|
+
def through
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
|
30
38
|
def native_macro
|
31
39
|
@association.macro
|
32
40
|
end
|
@@ -53,20 +61,6 @@ module Lolita
|
|
53
61
|
@associations
|
54
62
|
end
|
55
63
|
|
56
|
-
# Return all association class names
|
57
|
-
def associations_class_names
|
58
|
-
self.associations.map{|name,association|
|
59
|
-
association.class_name
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
# Detect if class reflect on association by name
|
64
|
-
def reflect_on_association(name)
|
65
|
-
if orm_association = klass.reflect_on_association(name)
|
66
|
-
Association.new(orm_association,self)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
64
|
# Each field from ORM is changed to this class instance.
|
71
65
|
class Field
|
72
66
|
include Lolita::Adapter::FieldHelper
|
@@ -124,6 +118,8 @@ module Lolita
|
|
124
118
|
|
125
119
|
end # end of field
|
126
120
|
|
121
|
+
include Lolita::Adapter::CommonHelper
|
122
|
+
|
127
123
|
def fields
|
128
124
|
@fields||=self.klass.fields.collect{|name,field|
|
129
125
|
Field.new(field,self)
|
@@ -146,44 +142,6 @@ module Lolita
|
|
146
142
|
end
|
147
143
|
end
|
148
144
|
|
149
|
-
def find_by_id(id)
|
150
|
-
self.klass.unscoped.where(:_id => id).first
|
151
|
-
end
|
152
|
-
|
153
|
-
# This method is used to paginate, main reason is for list and for index action.
|
154
|
-
# Method accepts three arguments
|
155
|
-
# <tt>page</tt> - page that should be shown (integer)
|
156
|
-
# <tt>per</tt> - how many records there should be in page
|
157
|
-
# <tt>options</tt> - Hash with optional information.
|
158
|
-
# By default, Lolita::Configuration::List passes request, with current request information.
|
159
|
-
# Also it passes <i>:pagination_method</i> that is used to detect if there is special method(-s) in model
|
160
|
-
# that should be used for creating page.
|
161
|
-
def paginate(page,per,options ={})
|
162
|
-
scope = nil
|
163
|
-
if options[:pagination_method]
|
164
|
-
if options[:pagination_method].respond_to?(:each)
|
165
|
-
options[:pagination_method].each do |method_name|
|
166
|
-
options[:previous_scope] = scope
|
167
|
-
if new_scope = pagination_scope_from_klass(method_name,page,per,options)
|
168
|
-
scope = scope ? scope.merge(new_scope) : new_scope
|
169
|
-
end
|
170
|
-
end
|
171
|
-
else
|
172
|
-
scope = pagination_scope_from_klass(options[:pagination_method],page,per,options)
|
173
|
-
end
|
174
|
-
raise ArgumentError, "Didn't generate any scope from #{options} page:{page} per:#{per}" unless scope
|
175
|
-
scope
|
176
|
-
else
|
177
|
-
klass.unscoped.page(page).per(per)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
def pagination_scope_from_klass(method_name,page,per,options)
|
182
|
-
if klass.respond_to?(method_name)
|
183
|
-
klass.send(method_name,page,per,options)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
145
|
def search(query, options = {})
|
188
146
|
unless query.blank?
|
189
147
|
content_fields = @dbi.fields.map{|field|
|
@@ -197,9 +155,7 @@ module Lolita
|
|
197
155
|
content_fields = content_fields & options[:fields]
|
198
156
|
end
|
199
157
|
content_fields = content_fields.slice(0..3)
|
200
|
-
|
201
|
-
#debugger
|
202
|
-
#result
|
158
|
+
|
203
159
|
where_hash = {}
|
204
160
|
content_fields.each do |field|
|
205
161
|
where_hash[field] = /#{Regexp.escape(query.to_s)}/
|
data/lib/lolita/base.rb
ADDED
data/lib/lolita/builder.rb
CHANGED
@@ -143,7 +143,7 @@ module Lolita
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def compare(pattern,predicate)
|
146
|
-
result = true
|
146
|
+
result = pattern.has_key?(:name) ? true : pattern[:name].to_s == build_attributes[:name].to_s
|
147
147
|
pattern.each do |key,value|
|
148
148
|
result &&= ((value.to_sym == self.send(key)) == predicate)
|
149
149
|
end
|
@@ -217,11 +217,11 @@ module Lolita
|
|
217
217
|
|
218
218
|
def build *values
|
219
219
|
result = builder.with(*values).build
|
220
|
-
result[result.size-1].merge!(
|
220
|
+
result[result.size-1].merge!(builder_default_options)
|
221
221
|
result
|
222
222
|
end
|
223
223
|
|
224
|
-
def
|
224
|
+
def builder_default_options
|
225
225
|
{builder_local_variable_name => self}
|
226
226
|
end
|
227
227
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Lolita
|
2
|
+
module Components
|
3
|
+
module Configuration
|
4
|
+
|
5
|
+
# Should include routes helper and lolita urls helpers
|
6
|
+
# - nested_list_options = column.list && {} || {}
|
7
|
+
# - content_text = column.formatted_value(record,self)
|
8
|
+
# %td{{:class => column.list && "with-nested-list"}.merge(nested_list_options)}= column.list ? link_to(content_text,"#") : content_text
|
9
|
+
|
10
|
+
class ColumnComponent < Lolita::Components::Base
|
11
|
+
|
12
|
+
def td_attributes(record)
|
13
|
+
{
|
14
|
+
:class => parent.list && "with-nested-list"
|
15
|
+
}.merge(nested_list_options(record))
|
16
|
+
end
|
17
|
+
|
18
|
+
def td_value(record,view)
|
19
|
+
column.formatted_value(record)
|
20
|
+
end
|
21
|
+
|
22
|
+
def nested_list_options parent
|
23
|
+
parent.list && {
|
24
|
+
:"data-nested-list-url" => lolita_resources_path(column.list.mapping, column.list.nested_options_for(record))
|
25
|
+
}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Lolita
|
2
|
+
# All classes that want to use lolita for configuration should include this module.
|
3
|
+
module Configuration
|
4
|
+
# When Lolita::Configuration is included, it add hook for class <em>:after_lolita_loaded</em> and define class methods
|
5
|
+
# <em>lolita</em> and <em>lolita=</em> and instance method <em>lolita</em> that refers to class method with same name.
|
6
|
+
def self.included(base)
|
7
|
+
base.class_eval do
|
8
|
+
include Lolita::Hooks
|
9
|
+
add_hook :after_lolita_loaded
|
10
|
+
|
11
|
+
extend ClassMethods
|
12
|
+
def lolita
|
13
|
+
self.class.lolita
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
# This is main method for configuration, it initialize new Lolita::Configuration::Core object, that have other methost to
|
20
|
+
# define different parts of configuration.
|
21
|
+
def lolita(&block)
|
22
|
+
Lolita::LazyLoader.lazy_load(self,:@lolita,Lolita::Configuration::Core,self,&block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def lolita=(value)
|
26
|
+
if value.is_a?(Lolita::Configuration::Core) || value.nil?
|
27
|
+
@lolita = value
|
28
|
+
else
|
29
|
+
raise ArgumentError.new("Only Lolita::Configuration::Core is acceptable.")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
require 'lolita/configuration/base'
|
37
|
+
require 'lolita/configuration/core'
|
38
|
+
require 'lolita/configuration/list'
|
39
|
+
require 'lolita/configuration/nested_list'
|
40
|
+
require 'lolita/configuration/tabs'
|
41
|
+
require 'lolita/configuration/tab'
|
42
|
+
require 'lolita/configuration/columns'
|
43
|
+
require 'lolita/configuration/column'
|
44
|
+
require 'lolita/configuration/fields'
|
45
|
+
require 'lolita/configuration/field'
|
46
|
+
require 'lolita/configuration/field_set'
|
47
|
+
require 'lolita/configuration/nested_form'
|
48
|
+
require 'lolita/configuration/search'
|
49
|
+
require 'lolita/configuration/filter'
|
50
|
+
require 'lolita/configuration/action'
|
51
|
+
|
52
|
+
require 'lolita/configuration/factory/field'
|
53
|
+
require 'lolita/configuration/factory/tab'
|
54
|
+
|
55
|
+
# Configuration for fields and tabs
|
56
|
+
["field","tab"].each do |type|
|
57
|
+
Dir["#{File.dirname(__FILE__)}/configuration/#{type}/**/*.*"].each do |path|
|
58
|
+
base_name=File.basename(path,".rb")
|
59
|
+
require "lolita/configuration/#{type}/#{base_name}"
|
60
|
+
end
|
61
|
+
end
|