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,53 @@
1
+ module Lolita
2
+ module Configuration
3
+ class Action
4
+
5
+ include Lolita::Builder
6
+ lolita_accessor :url
7
+ attr_writer :title,:html
8
+ attr_reader :name
9
+
10
+ def initialize(dbi,name, options ={}, &block)
11
+ @dbi = dbi
12
+ @name = name
13
+ options.each do |key,value|
14
+ self.send(:"#{key}=",value)
15
+ end
16
+ instance_eval(&block) if block_given?
17
+ end
18
+
19
+ def html attributes = nil
20
+ if attributes
21
+ @html = attributes
22
+ else
23
+ result = {}
24
+ (@html || {}).each{|k,v|
25
+ result[k] = v.respond_to?(:call) ? v.call : v
26
+ }
27
+ result
28
+ end
29
+ end
30
+
31
+ def title value=nil
32
+ if value
33
+ @title = value
34
+ else
35
+ if @title
36
+ @title.respond_to?(:call) ? @title.call : @title
37
+ else
38
+ ::I18n.t("#{@dbi.klass.to_s.underscore}.actions.#{@name}")
39
+ end
40
+ end
41
+ end
42
+
43
+ def view_url view, record
44
+ if @url.respond_to?(:call)
45
+ @url.call(view,record)
46
+ else
47
+ @url
48
+ end
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -1,89 +1,41 @@
1
- # Every class that include Lolita::Configuration this module assign
2
- # #lolita and #lolita= methods. First one is for normal Lolita configuration
3
- # definition, and the other one made to assing Lolita to class as a Lolita::Configuration::Base
4
- # object. You may want to do that to change configuration or for testing purpose.
5
1
  module Lolita
6
2
  module Configuration
7
- # Lolita could be defined inside of any class that is supported by Lolita::Adapter, for now that is
8
- # * ActiveRecord::Base
9
- # * Mongoid::Document
10
- # Main block can hold these methods:
11
- # <tt>list</tt> - List definition, see Lolitia::Configuration::List
12
- # <tt>tab</tt> - Tab definition, see Lolita::Configuration::Tab
13
- # <tt>tabs</tt> - Tabs definition, see Lolita::Configuration::Tabs
3
+ # This is superclass of other configuration classes, that is used to configure different parts of resource.
14
4
  class Base
5
+ include Lolita::Builder
6
+ attr_reader :dbi
7
+ attr_writer :component
8
+ alias :dbp :dbi
15
9
 
16
- attr_reader :dbi,:klass
17
- @@generators=[:tabs,:list]
18
-
19
- class << self
20
-
21
- def add_generator(method)
22
- @@generators<<method.to_sym
23
- end
24
- end
25
- # When configuration is defined in class than you don't need to worry about
26
- # creating new object, because Lolita itself create it for that class.
27
- # New object is created like when you define it in class, but <i>parent_class</i>
28
- # must be given.
29
- # ====Example
30
- # class Person < ActiveRecord::Base
31
- # include Lolita::Configuration
32
- # lolita
33
- # end
34
- # Person.lolita.klass #=> Person
35
- # # Init Lolita by youself
36
- #
37
- # class Person < ActiveRecord::Base
38
- # include Lolita::Configuration
39
- # end
40
- # Person.lolita=Lolita::Configuration::Base.new(Person)
41
- # Person.lolita.klass #=> Person
42
- def initialize(orm_class,&block)
43
- @in_callback_mode = false
44
- @klass=orm_class
45
- @dbi=Lolita::DBI::Base.create(orm_class)
46
- block_given? ? self.instance_eval(&block) : self.generate!
47
- end
48
-
49
-
50
- # Create list variable for ::Base class and create lazy object of Lolita::LazyLoader.
51
- # See Lolita::Configuration::List for more information.
52
- def list &block
53
- Lolita::LazyLoader.lazy_load(self,:@list,Lolita::Configuration::List,@dbi,&block)
10
+ def initialize(dbp, *args)
11
+ set_and_validate_dbp dbp
12
+ set_attributes *args
54
13
  end
55
14
 
56
- def list=(new_list)
57
- @list = new_list if new_list.is_a?(Lolita::Configuration::List)
15
+ def component
16
+ @component ||= "Lolita::Components::#{self.class.to_s.sub("Lolita::","")}Component".constantize.new(self)
58
17
  end
59
18
 
60
- # Create collection of Lolita::Configuration::Tab, loading lazy.
61
- # See Lolita::Configuration::Tabs for details.
62
- def tabs &block
63
- Lolita::LazyLoader.lazy_load(self, :@tabs,Lolita::Configuration::Tabs,@dbi,&block)
64
- end
19
+ private
65
20
 
66
- # Shortcut for Lolita::Configuration::Tabs <<.
67
- # Tabs should not be defined in lolita block to create onew or more Lolita::Configuration::Tab
68
- # See Lolita::Configuration::Tab for details of defination.
69
- def tab *args, &block
70
- self.tabs<<Lolita::Configuration::Factory::Tab.add(@dbi,*args,&block)
71
- end
72
-
73
- # Call all supported instance metods to set needed variables and initialize object with them.
74
- def generate!
75
- @@generators.each{|generator|
76
- self.send(generator)
77
- }
21
+ def set_and_validate_dbp(dbp)
22
+ @dbp = dbp
23
+ @dbi = dbp
24
+ raise Lolita::UnknownDBPError.new("No DBP specified for #{self.class.to_s.split("::").last}") unless @dbp
78
25
  end
79
26
 
80
- private
27
+ alias :set_and_validate_dbi :set_and_validate_dbp
81
28
 
82
- def after_initialize
83
- @dbi.klass.run(:after_lolita_loaded, :once => self)
29
+ # Used to set attributes if block not given.
30
+ def set_attributes(*args)
31
+ options = args && args.extract_options! || {}
32
+ options.each do |attr_name,value|
33
+ self.send("#{attr_name}=".to_sym,value)
34
+ end
84
35
  end
85
36
 
86
37
  end
38
+
87
39
  end
88
40
  end
89
41
 
@@ -1,48 +1,72 @@
1
1
  module Lolita
2
2
  module Configuration
3
- class Column
4
-
5
- include Lolita::Builder
3
+ class Column < Lolita::Configuration::Base
6
4
 
7
5
  MAX_TEXT_SIZE=20
8
- lolita_accessor :name,:title,:type,:options,:sortable
6
+ attr_reader :list_association_name
7
+ lolita_accessor :name,:title,:type,:options,:sortable, :association
9
8
 
10
9
  def initialize(dbi,*args,&block)
11
- @dbi=dbi
10
+ set_and_validate_dbi(dbi)
12
11
  self.set_attributes(*args)
13
12
  self.instance_eval(&block) if block_given?
14
13
  validate
14
+ normalize_attributes
15
+ detect_association
16
+ end
17
+
18
+ def list *args, &block
19
+ if args && args.any? || block_given?
20
+ detect_association
21
+ list_association = args[0] && @dbi.associations[args[0].to_s.to_sym] || self.association
22
+ list_dbi = list_association && Lolita::DBI::Base.create(list_association.klass)
23
+ raise Lolita::UnknownDBPError.new("DBI is not specified for list in column #{self}") unless list_dbi
24
+ @list_association_name = list_association.name
25
+ Lolita::LazyLoader.lazy_load(self,:@list,Lolita::Configuration::NestedList, list_dbi, self, :association_name => list_association.name, &block)
26
+ else
27
+ @list
28
+ end
15
29
  end
16
30
 
31
+ # Return value of column from given record. When record matches foreign key patter, then foreign key is used.
32
+ # In other cases it just ask for attribute with same name as column.
17
33
  def value(record)
18
- if self.name.to_s.match(/_id$/) && record.respond_to?(self.name.to_s.gsub(/_id$/,"").to_sym)
19
- remote_record = record.send(self.name.to_s.gsub(/_id$/,"").to_sym)
20
- if remote_record.respond_to?(:title)
21
- remote_record.send(:title)
22
- elsif remote_record.respond_to?(:name)
23
- remote_record.send(:name)
34
+ if self.association
35
+ if self.association.macro == :one && dbi.klass.respond_to?(:human_attribute_name)
36
+ dbi.klass.human_attribute_name(association.name)
37
+ # dbi.record(record.send(association.name)).title
38
+ elsif dbi.klass.respond_to?(:human_attribute_name)
39
+ "#{dbi.klass.human_attribute_name(association.name)} (#{record.send(association.name).count})"
24
40
  else
25
- record.send(self.name)
41
+ "#{association.name} (#{record.send(association.name).count})"
26
42
  end
27
43
  else
28
44
  record.send(self.name)
29
45
  end
30
46
  end
31
47
 
32
- def title(value=nil)
33
- @title=value if value
34
- @title||=@dbi.klass.human_attribute_name(@name.to_s)
35
- @title
48
+ def formatted_value(record,view)
49
+ self.formatter.with(self.value(record),record,self)
50
+ end
51
+
52
+ # Set/Get title. Getter return title what was set or ask for human_attribute_name to model.
53
+ def title(new_title=nil)
54
+ if new_title
55
+ @title = new_title
56
+ end
57
+ Lolita::Utils.dynamic_string(@title, :default => @name && @dbi.klass.human_attribute_name(@name))
36
58
  end
37
59
 
38
60
  def sortable?
39
61
  @sortable
40
62
  end
41
63
 
64
+ # Find if any of received sort options matches this column.
42
65
  def current_sort_state(params)
43
66
  @sortable && sort_pairs(params).detect{|pair| pair[0]==self.name.to_s} || []
44
67
  end
45
68
 
69
+ # Return string with sort options for column if column is sortable.
46
70
  def sort_params params
47
71
  if @sortable
48
72
  pairs = sort_pairs(params)
@@ -62,6 +86,7 @@ module Lolita
62
86
  end
63
87
  end
64
88
 
89
+ # Create array of sort information from params.
65
90
  def sort_pairs params
66
91
  (params[:s] || "").split("|").map{|pair| pair.split(",")}
67
92
  end
@@ -104,7 +129,16 @@ module Lolita
104
129
 
105
130
  private
106
131
 
132
+ def detect_association
133
+ @association ||= dbi.associations[self.name]
134
+ end
135
+
136
+ def normalize_attributes
137
+ @name = @name.to_sym
138
+ end
139
+
107
140
  def validate
141
+ raise Lolita::UnknownDBIError.new("DBI is not specified for column #{self}") unless self.dbi
108
142
  raise ArgumentError.new("Column must have name.") unless self.name
109
143
  end
110
144
  end
@@ -5,17 +5,34 @@ module Lolita
5
5
  include Enumerable
6
6
  include ObservedArray
7
7
  include Lolita::Builder
8
-
9
- attr_accessor :list
8
+
10
9
  attr_reader :dbi
10
+ attr_accessor :parent
11
11
 
12
- def initialize(list,dbi=nil)
13
- @list=list
14
- @dbi=dbi || list.dbi
12
+ def initialize(dbi, *args, &block)
13
+ @dbi=dbi
15
14
  @columns=[]
15
+ @generated_yet = (block_given? || (args && args.any?))
16
+ set_attributes(*args)
17
+ self.instance_eval(&block) if block_given?
18
+ end
19
+
20
+ # Add column to columns Array. Receive attributes for column as Hash and/or block.
21
+ def column *args, &block
22
+ @columns << build_element(*args,&block)
23
+ @columns.last
24
+ end
25
+
26
+ # Find first column by name
27
+ def by_name(name)
28
+ name = name.to_sym
29
+ self.detect do |column|
30
+ column.name == name
31
+ end
16
32
  end
17
33
 
18
34
  def each
35
+ self.populate
19
36
  @columns.each_with_index{|column,index|
20
37
  if column.is_a?(Lolita::Configuration::Column)
21
38
  yield column
@@ -25,41 +42,52 @@ module Lolita
25
42
  }
26
43
  end
27
44
 
45
+
28
46
  def generate!
47
+ @generated_yet = true
29
48
  @columns.clear
30
49
  @dbi.fields.each_with_index{|field,index|
31
50
  unless field.technical?
32
- @columns << Lolita::Configuration::Column.new(@dbi,field)
51
+ column(field)
33
52
  end
34
53
  }
35
54
  end
36
55
 
37
- def add attributes={},&block
38
- if block_given?
39
- @columns<<build_element(&block)
40
- else
41
- @columns<<build_element(attributes)
42
- end
43
- self
56
+ def populate
57
+ self.generate! if @columns.empty? && !@generated_yet
44
58
  end
45
59
 
46
60
  private
47
61
 
62
+ def set_attributes(*args)
63
+ if args && args.any?
64
+ options = args.extract_options! || {}
65
+ args.each do |col_name|
66
+ column col_name
67
+ end
68
+ options.each do |key,value|
69
+ if key == :column
70
+ column value
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ def generate_collection_elements!
77
+ self.populate
78
+ end
79
+
48
80
  def collection_variable
49
81
  @columns
50
82
  end
51
83
 
52
- def build_element(column=nil,&block)
53
- if column.is_a?(Lolita::Configuration::Column)
54
- column
55
- elsif column.is_a?(Proc)
56
- Lolita::Configuration::Column.new(@dbi,&column)
57
- elsif block_given?
58
- Lolita::Configuration::Column.new(@dbi,&block)
59
- elsif [Symbol,String,Hash].include?(column.class)
60
- Lolita::Configuration::Column.new(@dbi,column)
84
+ def build_element(*column,&block)
85
+ if column[0].is_a?(Lolita::Configuration::Column)
86
+ column[0]
87
+ elsif column[0].is_a?(Proc)
88
+ Lolita::Configuration::Column.new(@dbi,&column[0])
61
89
  else
62
- raise ArgumentError.new("Column can not be defined with #{column.class}.")
90
+ Lolita::Configuration::Column.new(@dbi,*column, &block)
63
91
  end
64
92
  end
65
93
 
@@ -0,0 +1,80 @@
1
+ module Lolita
2
+ module Configuration
3
+
4
+ # This is class of lolita instance.
5
+ # Main block can hold these methods:
6
+ # <tt>list</tt> - List definition, see Lolitia::Configuration::List
7
+ # <tt>tab</tt> - Tab definition, see Lolita::Configuration::Tab
8
+ # <tt>tabs</tt> - Tabs definition, see Lolita::Configuration::Tabs
9
+ class Core
10
+ attr_reader :dbi,:klass
11
+ @@generators=[:tabs,:list]
12
+
13
+ # When configuration is defined in class than you don't need to worry about
14
+ # creating new object, because Lolita itself create it for that class.
15
+ # New object is created like when you define it in class, but <i>parent_class</i>
16
+ # must be given.
17
+ # ====Example
18
+ # class Person < ActiveRecord::Base
19
+ # include Lolita::Configuration
20
+ # lolita
21
+ # end
22
+ # Person.lolita.klass #=> Person
23
+ # # Init Lolita by youself
24
+ #
25
+ # class Person < ActiveRecord::Base
26
+ # include Lolita::Configuration
27
+ # end
28
+ # Person.lolita=Lolita::Configuration::Base.new(Person)
29
+ # Person.lolita.klass #=> Person
30
+ def initialize(orm_class,&block)
31
+ @klass = orm_class
32
+ @dbp = Lolita::DBI::Base.create(orm_class)
33
+ @dbi = @dbp
34
+ block_given? ? self.instance_eval(&block) : self.generate!
35
+ end
36
+
37
+
38
+ # Create list variable for ::Base class and create lazy object of Lolita::LazyLoader.
39
+ # See Lolita::Configuration::List for more information.
40
+ def list &block
41
+ Lolita::LazyLoader.lazy_load(self,:@list,Lolita::Configuration::List,@dbp,&block)
42
+ end
43
+
44
+ def list=(new_list)
45
+ @list = new_list if new_list.is_a?(Lolita::Configuration::List)
46
+ end
47
+
48
+ # Create collection of Lolita::Configuration::Tab, loading lazy.
49
+ # See Lolita::Configuration::Tabs for details.
50
+ def tabs &block
51
+ Lolita::LazyLoader.lazy_load(self, :@tabs,Lolita::Configuration::Tabs,@dbp,&block)
52
+ end
53
+
54
+ # Shortcut for Lolita::Configuration::Tabs <<.
55
+ # Tabs should not be defined in lolita block to create onew or more Lolita::Configuration::Tab
56
+ # See Lolita::Configuration::Tab for details of defination.
57
+ def tab *args, &block
58
+ self.tabs << Lolita::Configuration::Factory::Tab.add(@dbp,*args,&block)
59
+ end
60
+
61
+ # Call all supported instance metods to set needed variables and initialize object with them.
62
+ def generate!
63
+ generators.each{|generator|
64
+ self.send(generator)
65
+ }
66
+ end
67
+
68
+ private
69
+
70
+ def generators
71
+ @@generators
72
+ end
73
+
74
+ def after_initialize
75
+ @dbp.klass.run(:after_lolita_loaded, :once => self)
76
+ end
77
+
78
+ end
79
+ end
80
+ end