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.
Files changed (254) hide show
  1. data/.gitignore +31 -0
  2. data/Gemfile +15 -36
  3. data/History.rdoc +9 -3
  4. data/README.md +57 -30
  5. data/Rakefile +1 -44
  6. data/app/assets/javascripts/lolita/list.js +28 -0
  7. data/app/assets/javascripts/lolita/main.js +81 -12
  8. data/app/assets/javascripts/lolita/tab.js +37 -32
  9. data/app/assets/stylesheets/lolita/style.css.erb +58 -18
  10. data/app/controllers/lolita/field_data_controller.rb +13 -9
  11. data/app/controllers/lolita/info_controller.rb +3 -5
  12. data/app/controllers/lolita/rest_controller.rb +53 -24
  13. data/app/helpers/components/lolita/configuration_component.rb +1 -1
  14. data/app/views/components/lolita/configuration/action/_display.html.haml +1 -0
  15. data/app/views/components/lolita/configuration/column/_display.html.haml +4 -0
  16. data/app/views/components/lolita/configuration/column/_first.html.haml +2 -0
  17. data/app/views/components/lolita/configuration/column/_last.html.haml +5 -0
  18. data/app/views/components/lolita/configuration/column/header/_display.html.haml +5 -0
  19. data/app/views/components/lolita/configuration/column/header/_first.html.haml +1 -0
  20. data/app/views/components/lolita/configuration/column/header/_last.html.haml +1 -0
  21. data/app/views/components/lolita/configuration/column/header/_sort.html.haml +6 -0
  22. data/app/views/components/lolita/configuration/columns/_display.html.haml +2 -0
  23. data/app/views/components/lolita/configuration/columns/body/_display.html.haml +3 -0
  24. data/app/views/components/lolita/configuration/columns/body/row/_display.html.haml +5 -0
  25. data/app/views/components/lolita/configuration/columns/header/_display.html.haml +5 -0
  26. data/app/views/components/lolita/configuration/field/_display.html.haml +7 -0
  27. data/app/views/components/lolita/configuration/field/_label.html.haml +1 -0
  28. data/app/views/components/lolita/configuration/field/_object.html.haml +1 -0
  29. data/app/views/components/lolita/configuration/field/array/_display.html.haml +5 -0
  30. data/app/views/components/lolita/configuration/field/array/autocomplete/_display.html.haml +1 -1
  31. data/app/views/components/lolita/configuration/field/array/autocomplete/_input.html.haml +2 -2
  32. data/app/views/components/lolita/configuration/field/array/polymorphic/_display.html.haml +3 -3
  33. data/app/views/components/lolita/configuration/field/array/select/_display.html.haml +1 -0
  34. data/app/views/components/lolita/configuration/field/big_decimal/_display.html.haml +1 -0
  35. data/app/views/components/lolita/configuration/field/boolean/_display.html.haml +1 -0
  36. data/app/views/components/lolita/configuration/field/date/_display.html.haml +1 -0
  37. data/app/views/components/lolita/configuration/field/date_time/_display.html.haml +2 -0
  38. data/app/views/components/lolita/configuration/field/date_time/date/_display.html.haml +1 -0
  39. data/app/views/components/lolita/configuration/field/date_time/time/_display.html.haml +1 -0
  40. data/app/views/components/lolita/configuration/field/float/_display.html.haml +1 -0
  41. data/app/views/components/lolita/configuration/field/integer/_display.html.haml +1 -0
  42. data/app/views/components/lolita/configuration/field/string/_display.html.haml +1 -0
  43. data/app/views/components/lolita/configuration/field/string/disabled/_display.html.haml +2 -0
  44. data/app/views/components/lolita/configuration/field/string/hidden/_display.html.haml +1 -0
  45. data/app/views/components/lolita/configuration/field/string/password/_display.html.haml +1 -0
  46. data/app/views/components/lolita/configuration/field/string/text/_display.html.haml +7 -0
  47. data/app/views/components/lolita/configuration/field/time/_display.html.haml +1 -0
  48. data/app/views/components/lolita/configuration/field_set/_display.html.haml +3 -0
  49. data/app/views/components/lolita/configuration/filter/_display.html.haml +9 -0
  50. data/app/views/components/lolita/configuration/list/_display.html.haml +9 -0
  51. data/app/views/components/lolita/configuration/list/_new_resource.html.haml +4 -0
  52. data/app/views/components/lolita/configuration/list/_paginator.html.haml +1 -0
  53. data/app/views/components/lolita/configuration/list/_title.html.haml +6 -0
  54. data/app/views/components/lolita/configuration/nested_form/_display.html.haml +12 -0
  55. data/app/views/components/lolita/configuration/nested_form/_fields.html.haml +8 -0
  56. data/app/views/components/lolita/configuration/nested_list/_display.html.haml +7 -0
  57. data/app/views/components/lolita/configuration/nested_list/_paginator.html.haml +2 -0
  58. data/app/views/components/lolita/configuration/tab/_display.html.haml +4 -0
  59. data/app/views/components/lolita/configuration/tab/_error_msg.html.haml +14 -0
  60. data/app/views/components/lolita/configuration/tab/_fields.html.haml +6 -0
  61. data/app/views/components/lolita/configuration/tab/_form.html.haml +4 -0
  62. data/app/views/components/lolita/configuration/tab/_title.html.haml +3 -0
  63. data/app/views/components/lolita/configuration/tab/content/_display.html.haml +1 -0
  64. data/app/views/components/lolita/configuration/tab/default/_display.html.haml +2 -0
  65. data/app/views/components/lolita/configuration/tabs/_display.html.haml +10 -0
  66. data/app/views/components/lolita/configuration/tabs/_form.html.haml +7 -0
  67. data/app/views/components/lolita/navigation/_display.html.haml +2 -0
  68. data/app/views/components/lolita/navigation/_tree.html.haml +14 -0
  69. data/app/views/components/lolita/shared/_buttons.html.haml +6 -0
  70. data/app/views/components/lolita/shared/_flash.html.haml +3 -0
  71. data/app/views/components/lolita/shared/_header.html.haml +7 -0
  72. data/app/views/components/lolita/shared/_languages.html.haml +11 -0
  73. data/app/views/components/lolita/shared/_right_sidebar.html.haml +6 -0
  74. data/app/views/components/lolita/shared/_save_button.html.haml +1 -0
  75. data/app/views/layouts/lolita/application.html.haml +36 -0
  76. data/app/views/lolita/rest/form.html.haml +1 -0
  77. data/app/views/lolita/rest/index.html.haml +1 -0
  78. data/app/views/lolita/rest/index.js.erb +1 -0
  79. data/config/locales/en.yml +4 -0
  80. data/config/locales/lv.yml +5 -2
  81. data/lib/generators/lolita/uninstall_generator.rb +76 -0
  82. data/lib/lolita.rb +104 -170
  83. data/lib/lolita/adapter/abstract_adapter.rb +1 -0
  84. data/lib/lolita/adapter/active_record.rb +22 -55
  85. data/lib/lolita/adapter/common_helper.rb +252 -0
  86. data/lib/lolita/adapter/mongoid.rb +11 -55
  87. data/lib/lolita/base.rb +5 -0
  88. data/lib/lolita/builder.rb +3 -3
  89. data/lib/lolita/components/base.rb +12 -0
  90. data/lib/lolita/components/configuration/column_component.rb +31 -0
  91. data/lib/lolita/components/configuration/list_component.rb +11 -0
  92. data/lib/lolita/configuration.rb +61 -0
  93. data/lib/lolita/configuration/action.rb +53 -0
  94. data/lib/lolita/configuration/base.rb +23 -71
  95. data/lib/lolita/configuration/column.rb +50 -16
  96. data/lib/lolita/configuration/columns.rb +51 -23
  97. data/lib/lolita/configuration/core.rb +80 -0
  98. data/lib/lolita/configuration/factory/field.rb +8 -3
  99. data/lib/lolita/configuration/factory/tab.rb +12 -6
  100. data/lib/lolita/configuration/field.rb +8 -11
  101. data/lib/lolita/configuration/field/array.rb +7 -9
  102. data/lib/lolita/configuration/fields.rb +1 -1
  103. data/lib/lolita/configuration/filter.rb +26 -19
  104. data/lib/lolita/configuration/list.rb +143 -80
  105. data/lib/lolita/configuration/nested_list.rb +102 -0
  106. data/lib/lolita/configuration/search.rb +14 -0
  107. data/lib/lolita/configuration/tab.rb +13 -9
  108. data/lib/lolita/configuration/tab/content.rb +6 -0
  109. data/lib/lolita/configuration/tab/default.rb +2 -2
  110. data/lib/lolita/configuration/tabs.rb +35 -82
  111. data/lib/lolita/controller_additions.rb +4 -3
  112. data/lib/lolita/controllers.rb +13 -0
  113. data/lib/lolita/controllers/authentication_helpers.rb +17 -0
  114. data/lib/lolita/controllers/component_helpers.rb +9 -5
  115. data/lib/lolita/controllers/internal_helpers.rb +22 -97
  116. data/lib/lolita/controllers/rails_helpers.rb +132 -0
  117. data/lib/lolita/controllers/url_helpers.rb +1 -1
  118. data/lib/lolita/errors.rb +3 -0
  119. data/lib/lolita/extensions/authentication/default_adapter.rb +24 -0
  120. data/lib/lolita/extensions/authentication/devise_adapter.rb +58 -0
  121. data/lib/lolita/extensions/authentication/proxy.rb +60 -0
  122. data/lib/lolita/extensions/authorization/cancan_adapter.rb +45 -0
  123. data/lib/lolita/extensions/authorization/default_adapter.rb +29 -0
  124. data/lib/lolita/extensions/authorization/proxy.rb +48 -0
  125. data/lib/lolita/extensions/extensions.rb +66 -0
  126. data/lib/lolita/helpers.rb +12 -0
  127. data/lib/lolita/lazy_loader.rb +15 -10
  128. data/lib/lolita/mapping.rb +25 -19
  129. data/lib/lolita/navigation/branch.rb +29 -2
  130. data/lib/lolita/navigation/tree.rb +6 -0
  131. data/lib/lolita/observed_array.rb +1 -1
  132. data/lib/lolita/orm.rb +7 -0
  133. data/lib/lolita/processors/request_processor.rb +38 -0
  134. data/lib/lolita/rails/engine.rb +24 -0
  135. data/lib/lolita/{modules/rest.rb → rails/railtie.rb} +8 -2
  136. data/lib/lolita/rails/routes.rb +26 -29
  137. data/lib/lolita/register.rb +48 -0
  138. data/lib/lolita/ruby_ext/lolita_model_name.rb +37 -0
  139. data/lib/lolita/system_configuration/application.rb +1 -0
  140. data/lib/lolita/system_configuration/base.rb +12 -5
  141. data/lib/lolita/utils.rb +14 -0
  142. data/lib/lolita/version.rb +30 -0
  143. data/lolita.gemspec +26 -398
  144. data/spec/configuration/base_spec.rb +14 -35
  145. data/spec/configuration/column_spec.rb +51 -2
  146. data/spec/configuration/columns_spec.rb +13 -19
  147. data/spec/configuration/core_spec.rb +89 -0
  148. data/spec/configuration/field_spec.rb +17 -5
  149. data/spec/configuration/filter_spec.rb +76 -61
  150. data/spec/configuration/list_spec.rb +339 -45
  151. data/spec/configuration/nested_list_spec.rb +111 -0
  152. data/spec/configuration/search_spec.rb +1 -1
  153. data/spec/configuration/tabs_spec.rb +89 -74
  154. data/spec/controllers/configuration_spec.rb +15 -0
  155. data/spec/controllers/internal_helpers_spec.rb +1 -1
  156. data/spec/controllers/lolita_rest_spec.rb +31 -2
  157. data/spec/coverage_helper.rb +33 -0
  158. data/spec/extensions/authentication/default_adapter_spec.rb +34 -0
  159. data/spec/extensions/authentication/devise_adapter_spec.rb +94 -0
  160. data/spec/extensions/authentication/proxy_spec.rb +55 -0
  161. data/spec/extensions/authorization/cancan_adapter_spec.rb +94 -0
  162. data/spec/extensions/authorization/default_adapter_spec.rb +43 -0
  163. data/spec/extensions/authorization/proxy_spec.rb +60 -0
  164. data/spec/extensions/extensions_spec.rb +45 -0
  165. data/spec/fabricators/category_fabricator.rb +3 -0
  166. data/spec/fabricators/post_fabricator.rb +4 -0
  167. data/spec/fabricators/tag_fabricator.rb +3 -0
  168. data/spec/lolita_spec.rb +1 -0
  169. data/spec/orm/mongoid.rb +1 -0
  170. data/spec/rails_app/app/mongoid/category.rb +14 -1
  171. data/spec/rails_app/app/mongoid/post.rb +9 -1
  172. data/spec/rails_app/config/application.rb +0 -4
  173. data/spec/rails_app/config/boot.rb +1 -2
  174. data/spec/register_spec.rb +50 -0
  175. data/spec/search/simple_spec.rb +4 -4
  176. data/spec/simple_spec_helper.rb +2 -1
  177. data/spec/spec_helper.rb +22 -35
  178. data/vendor/assets/javascripts/tinymce_config.js +5 -3
  179. metadata +202 -180
  180. data/.document +0 -5
  181. data/GUIDELINES.rdoc +0 -22
  182. data/VERSION +0 -1
  183. data/app/helpers/lolita_helper.rb +0 -23
  184. data/app/views/components/lolita/configuration/column/_display.html.erb +0 -4
  185. data/app/views/components/lolita/configuration/column/_header.html.erb +0 -7
  186. data/app/views/components/lolita/configuration/column/_sort.html.erb +0 -7
  187. data/app/views/components/lolita/configuration/columns/_body.html.erb +0 -5
  188. data/app/views/components/lolita/configuration/columns/_display.html.erb +0 -2
  189. data/app/views/components/lolita/configuration/columns/_first.html.erb +0 -3
  190. data/app/views/components/lolita/configuration/columns/_first_column_header.html.erb +0 -3
  191. data/app/views/components/lolita/configuration/columns/_header.html.erb +0 -9
  192. data/app/views/components/lolita/configuration/columns/_last.html.erb +0 -4
  193. data/app/views/components/lolita/configuration/columns/_last_column_header.html.erb +0 -3
  194. data/app/views/components/lolita/configuration/columns/_row.html.erb +0 -7
  195. data/app/views/components/lolita/configuration/field/_display.html.erb +0 -13
  196. data/app/views/components/lolita/configuration/field/_label.html.erb +0 -1
  197. data/app/views/components/lolita/configuration/field/_object.html.erb +0 -1
  198. data/app/views/components/lolita/configuration/field/array/_display.html.erb +0 -5
  199. data/app/views/components/lolita/configuration/field/array/filter/_display.html.erb +0 -1
  200. data/app/views/components/lolita/configuration/field/array/select/_display.html.erb +0 -4
  201. data/app/views/components/lolita/configuration/field/big_decimal/_display.html.erb +0 -1
  202. data/app/views/components/lolita/configuration/field/boolean/_display.html.erb +0 -1
  203. data/app/views/components/lolita/configuration/field/boolean/filter/_display.html.erb +0 -2
  204. data/app/views/components/lolita/configuration/field/date/_display.html.erb +0 -1
  205. data/app/views/components/lolita/configuration/field/date_time/_display.html.erb +0 -1
  206. data/app/views/components/lolita/configuration/field/date_time/date/_display.html.erb +0 -1
  207. data/app/views/components/lolita/configuration/field/date_time/time/_display.html.erb +0 -1
  208. data/app/views/components/lolita/configuration/field/float/_display.html.erb +0 -1
  209. data/app/views/components/lolita/configuration/field/hidden/_display.html.erb +0 -1
  210. data/app/views/components/lolita/configuration/field/integer/_display.html.erb +0 -1
  211. data/app/views/components/lolita/configuration/field/string/_display.html.erb +0 -1
  212. data/app/views/components/lolita/configuration/field/string/disabled/_display.html.erb +0 -1
  213. data/app/views/components/lolita/configuration/field/string/password/_display.html.erb +0 -3
  214. data/app/views/components/lolita/configuration/field/string/text/_display.html.erb +0 -11
  215. data/app/views/components/lolita/configuration/field/time/_display.html.erb +0 -1
  216. data/app/views/components/lolita/configuration/field_set/_display.html.erb +0 -5
  217. data/app/views/components/lolita/configuration/list/_display.html.erb +0 -11
  218. data/app/views/components/lolita/configuration/list/_filter.html.erb +0 -8
  219. data/app/views/components/lolita/configuration/list/_new_resource.html.erb +0 -6
  220. data/app/views/components/lolita/configuration/list/_paginator.html.erb +0 -1
  221. data/app/views/components/lolita/configuration/list/_title.html.erb +0 -10
  222. data/app/views/components/lolita/configuration/nested_form/_display.html.erb +0 -15
  223. data/app/views/components/lolita/configuration/nested_form/_fields.html.erb +0 -13
  224. data/app/views/components/lolita/configuration/tab/_display.html.erb +0 -8
  225. data/app/views/components/lolita/configuration/tab/_error_msg.html.erb +0 -20
  226. data/app/views/components/lolita/configuration/tab/_fields.html.erb +0 -9
  227. data/app/views/components/lolita/configuration/tab/_form.html.erb +0 -8
  228. data/app/views/components/lolita/configuration/tab/content/_display.html.erb +0 -1
  229. data/app/views/components/lolita/configuration/tab/default/_display.html.erb +0 -3
  230. data/app/views/components/lolita/configuration/tabs/_display.html.erb +0 -11
  231. data/app/views/components/lolita/navigation/_display.html.erb +0 -3
  232. data/app/views/components/lolita/navigation/_tree.html.erb +0 -32
  233. data/app/views/components/lolita/shared/_flash.html.erb +0 -5
  234. data/app/views/components/lolita/shared/_header.html.erb +0 -9
  235. data/app/views/components/lolita/shared/_right_sidebar.html.erb +0 -9
  236. data/app/views/components/lolita/shared/_save_button.html.erb +0 -6
  237. data/app/views/layouts/lolita/application.html.erb +0 -37
  238. data/app/views/lolita/rest/form.html.erb +0 -1
  239. data/app/views/lolita/rest/index.html.erb +0 -1
  240. data/config/locales/default/lv.yml +0 -181
  241. data/db/seed.rb +0 -1
  242. data/features/create_page.feature +0 -20
  243. data/features/step_definitions/lolita_steps.rb +0 -7
  244. data/features/step_definitions/web_steps.rb +0 -219
  245. data/features/support/env.rb +0 -73
  246. data/features/support/paths.rb +0 -35
  247. data/lib/lolita/controllers/authorization_helpers.rb +0 -56
  248. data/lib/lolita/controllers/user_helpers.rb +0 -44
  249. data/lib/lolita/modules.rb +0 -6
  250. data/lib/lolita/rails.rb +0 -23
  251. data/lib/lolita/rails/all.rb +0 -11
  252. data/spec/support/factories/category.rb +0 -3
  253. data/spec/support/factories/post.rb +0 -4
  254. 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
- #result = self.map_reduce_search(content_fields,query)
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)}/
@@ -0,0 +1,5 @@
1
+ require 'lolita/register'
2
+ require 'lolita/lazy_loader'
3
+ require 'lolita/observed_array'
4
+ require 'lolita/builder'
5
+ require 'lolita/controller_additions'
@@ -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!(default_options)
220
+ result[result.size-1].merge!(builder_default_options)
221
221
  result
222
222
  end
223
223
 
224
- def default_options
224
+ def builder_default_options
225
225
  {builder_local_variable_name => self}
226
226
  end
227
227
 
@@ -0,0 +1,12 @@
1
+ module Lolita
2
+ module Components
3
+
4
+ class Base
5
+ attr_reader :parent
6
+ def initialize(parent)
7
+ @parent = parent
8
+ end
9
+ end
10
+
11
+ end
12
+ end
@@ -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,11 @@
1
+ module Lolita
2
+ module Components
3
+ module Configuration
4
+
5
+ class ListComponent
6
+
7
+ end
8
+
9
+ end
10
+ end
11
+ 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