lolita 3.1.18 → 3.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. data/Gemfile +5 -2
  2. data/History.rdoc +24 -0
  3. data/README.md +113 -0
  4. data/VERSION +1 -1
  5. data/{public → app/assets}/images/lolita/plus.png +0 -0
  6. data/{public → app/assets}/javascripts/lolita/application.js +0 -0
  7. data/{public → app/assets}/javascripts/lolita/base64.js +0 -0
  8. data/{public → app/assets}/javascripts/lolita/main.js +1 -0
  9. data/{public → app/assets}/javascripts/lolita/tab.js +0 -0
  10. data/{public → app/assets}/stylesheets/lolita/PIE-custom.htc +0 -0
  11. data/{public → app/assets}/stylesheets/lolita/PIE.htc +0 -0
  12. data/{public → app/assets}/stylesheets/lolita/default.css +0 -0
  13. data/{public → app/assets}/stylesheets/lolita/style.css +0 -21
  14. data/app/controllers/lolita/info_controller.rb +1 -12
  15. data/app/controllers/lolita/rest_controller.rb +2 -7
  16. data/app/helpers/lolita_helper.rb +1 -12
  17. data/app/views/components/lolita/configuration/column/_header.html.erb +1 -1
  18. data/app/views/components/lolita/configuration/column/_sort.html.erb +4 -7
  19. data/app/views/components/lolita/configuration/field/array/habtm/_display.html.haml +1 -1
  20. data/app/views/components/lolita/configuration/field/array/select/_display.html.erb +1 -1
  21. data/app/views/components/lolita/configuration/field/string/disabled/_display.html.erb +1 -1
  22. data/app/views/components/lolita/configuration/field/string/text/_display.html.erb +1 -1
  23. data/app/views/components/lolita/configuration/list/_paginator.html.erb +1 -1
  24. data/app/views/components/lolita/configuration/list/_title.html.erb +1 -6
  25. data/app/views/components/lolita/configuration/nested_form/_display.html.erb +6 -8
  26. data/app/views/components/lolita/navigation/_tree.html.erb +25 -18
  27. data/app/views/components/lolita/shared/_header.html.erb +1 -1
  28. data/app/views/components/lolita/shared/_right_sidebar.html.erb +6 -1
  29. data/app/views/layouts/lolita/application.html.erb +3 -3
  30. data/config/locales/en.yml +24 -1
  31. data/config/locales/lv.yml +0 -1
  32. data/config/routes.rb +1 -3
  33. data/lib/generators/lolita/install_generator.rb +1 -5
  34. data/lib/lolita.rb +23 -38
  35. data/lib/lolita/adapter/abstract_adapter.rb +0 -1
  36. data/lib/lolita/adapter/active_record.rb +4 -42
  37. data/lib/lolita/adapter/mongoid.rb +4 -76
  38. data/lib/lolita/configuration/base.rb +2 -15
  39. data/lib/lolita/configuration/column.rb +2 -25
  40. data/lib/lolita/configuration/factory/field.rb +2 -10
  41. data/lib/lolita/configuration/field.rb +1 -6
  42. data/lib/lolita/configuration/field/array.rb +31 -124
  43. data/lib/lolita/configuration/field/integer.rb +1 -0
  44. data/lib/lolita/configuration/list.rb +2 -23
  45. data/lib/lolita/configuration/tabs.rb +0 -6
  46. data/lib/lolita/controllers/component_helpers.rb +1 -1
  47. data/lib/lolita/controllers/internal_helpers.rb +4 -18
  48. data/lib/lolita/controllers/user_helpers.rb +11 -23
  49. data/lib/lolita/hooks.rb +120 -163
  50. data/lib/lolita/lazy_loader.rb +0 -3
  51. data/lib/lolita/mapping.rb +0 -23
  52. data/lib/lolita/modules/rest.rb +1 -1
  53. data/lib/lolita/navigation/branch.rb +1 -52
  54. data/lib/lolita/navigation/tree.rb +0 -10
  55. data/lib/lolita/rails.rb +2 -1
  56. data/lib/lolita/rails/routes.rb +5 -4
  57. data/lib/lolita/system_configuration/application.rb +1 -7
  58. data/lolita.gemspec +83 -100
  59. data/spec/configuration/field_spec.rb +1 -1
  60. data/spec/configuration/list_spec.rb +14 -19
  61. data/spec/rails_app/app/mongoid/post.rb +0 -4
  62. data/spec/rails_app/config/application.rb +1 -12
  63. data/spec/rails_app/config/environments/development.rb +2 -6
  64. data/spec/rails_app/config/environments/production.rb +1 -5
  65. data/spec/rails_app/config/environments/test.rb +1 -5
  66. data/vendor/assets/javascripts/jquery-1.6.2.min.js +18 -0
  67. data/{public → vendor/assets}/javascripts/jquery-ui-1.8.13.min.js +0 -0
  68. data/{public → vendor/assets}/javascripts/modernizr-1.7.min.js +0 -0
  69. data/{public → vendor/assets}/javascripts/tinymce/jquery.tinymce.js +0 -0
  70. data/{public → vendor/assets}/javascripts/tinymce/langs/en.js +0 -0
  71. data/{public → vendor/assets}/javascripts/tinymce/license.txt +0 -0
  72. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/about.htm +0 -0
  73. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/anchor.htm +0 -0
  74. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/charmap.htm +0 -0
  75. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/color_picker.htm +0 -0
  76. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/editor_template.js +0 -0
  77. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/editor_template_src.js +0 -0
  78. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/image.htm +0 -0
  79. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/colorpicker.jpg +0 -0
  80. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/flash.gif +0 -0
  81. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/icons.gif +0 -0
  82. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/iframe.gif +0 -0
  83. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/pagebreak.gif +0 -0
  84. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/quicktime.gif +0 -0
  85. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/realmedia.gif +0 -0
  86. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/shockwave.gif +0 -0
  87. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/trans.gif +0 -0
  88. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/video.gif +0 -0
  89. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/windowsmedia.gif +0 -0
  90. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/about.js +0 -0
  91. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/anchor.js +0 -0
  92. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/charmap.js +0 -0
  93. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/color_picker.js +0 -0
  94. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/image.js +0 -0
  95. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/link.js +0 -0
  96. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/source_editor.js +0 -0
  97. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/langs/en.js +0 -0
  98. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/langs/en_dlg.js +0 -0
  99. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/link.htm +0 -0
  100. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/shortcuts.htm +0 -0
  101. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/content.css +0 -0
  102. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/dialog.css +0 -0
  103. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/butt2.png +0 -0
  104. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/button-bg.png +0 -0
  105. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/buttons.png +0 -0
  106. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/down_arrow.gif +0 -0
  107. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/fade-butt.png +0 -0
  108. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/icons.png +0 -0
  109. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/items.gif +0 -0
  110. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/menu-arrow.png +0 -0
  111. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/menu-check.png +0 -0
  112. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/progress.gif +0 -0
  113. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/tabs.gif +0 -0
  114. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/toolbarbg.png +0 -0
  115. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/ui.css +0 -0
  116. data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/source_editor.htm +0 -0
  117. data/{public → vendor/assets}/javascripts/tinymce/tiny_mce.js +0 -0
  118. data/{public → vendor/assets}/javascripts/tinymce/tiny_mce_popup.js +0 -0
  119. data/{public → vendor/assets}/javascripts/tinymce/utils/editable_selects.js +0 -0
  120. data/{public → vendor/assets}/javascripts/tinymce/utils/form_utils.js +0 -0
  121. data/{public → vendor/assets}/javascripts/tinymce/utils/mctabs.js +0 -0
  122. data/{public → vendor/assets}/javascripts/tinymce/utils/validate.js +0 -0
  123. data/{public → vendor/assets}/javascripts/tinymce_config.js +1 -1
  124. metadata +121 -127
  125. data/README.rdoc +0 -100
  126. data/app/controllers/lolita/field_data_controller.rb +0 -36
  127. data/app/views/components/lolita/configuration/field/array/autocomplete/_display.html.haml +0 -11
  128. data/app/views/components/lolita/configuration/field/array/checkbox/_display.html.haml +0 -8
  129. data/app/views/components/lolita/configuration/field/array/polymorphic/_display.html.haml +0 -6
  130. data/app/views/components/lolita/configuration/field/array/polymorphic/_options_for_select.html.haml +0 -1
  131. data/app/views/components/lolita/configuration/search/_display.html.haml +0 -2
  132. data/app/views/components/lolita/shared/_save_button.html.erb +0 -6
  133. data/lib/generators/lolita/assets_generator.rb +0 -19
  134. data/lib/lolita/configuration/factory.rb +0 -56
  135. data/lib/lolita/configuration/helper.rb +0 -24
  136. data/lib/lolita/configuration/page.rb +0 -126
  137. data/lib/lolita/configuration/search.rb +0 -91
  138. data/lib/lolita/controller_additions.rb +0 -15
  139. data/lib/lolita/controllers/authorization_helpers.rb +0 -56
  140. data/lib/lolita/search/simple.rb +0 -76
  141. data/public/javascripts/jquery-1.6.min.js +0 -16
  142. data/public/javascripts/rails.js +0 -137
  143. data/spec/configuration/search_spec.rb +0 -44
  144. data/spec/search/simple_spec.rb +0 -48
data/README.rdoc DELETED
@@ -1,100 +0,0 @@
1
- =Lolita
2
-
3
- Great Rails CMS, that turns your business logic into good-looking, fully functional workspace.
4
- ==Demo
5
- See the demo page at Demo[http://lolita-demo.ithouse.lv]
6
-
7
- ==Installation
8
-
9
- First install Lolita gem
10
- sudo gem install lolita
11
-
12
- Then go to your rails project and
13
- rails g lolita:install
14
-
15
- That will create initializer and copy all assets.
16
- Also it will call <em>install</em> on all added modules to lolita.
17
- So if you in Gemfile have following
18
- gem "lolita"
19
- gem "lolita-file-upload"
20
- It will also call <i>lolita_file_upload:install</i>.
21
- ==Usage
22
-
23
- To make your model use Lolita do like this
24
- class Post < ActiveRecord::Base
25
- include Lolita::Configuration
26
- lolita
27
- end
28
- Then in routes.rb file make resources accessable for lolita with
29
- lolita_for :posts
30
- This will make routes like
31
- /lolita/posts
32
- /lolita/posts/1/edit
33
- /lolita/posts/new
34
- Or open /lolita and it will redirect to first available resource list view.
35
-
36
- For more detailed usage read Usage[https://github.com/ithouse/lolita/wiki/Usage] at wiki.
37
-
38
- ===Add authorization to Lolita
39
-
40
- Easiest way to add authentication is with Devise. First install Devise as gem, than add it to your project.
41
- Make Devise model, lets say, User. After that add these lines in <i>/config/initializers/lolita.rb</i>
42
- config.user_classes << User
43
- config.authentication = :authenticate_user!
44
- This will make before each Lolita requests call before filter, that than will call <em>authenticate_user!</em>
45
- that is Devise method for authenticating user. Without it Lolita will be acessable for everyone.
46
- You can also add any other authentication method like
47
- config.authentication = :authenticate_admin
48
- And than put this method for common use in <em>ApplicationController</em> or in some other place that is accessable
49
- to all controllers.
50
- ===Using newer version of Lolita
51
-
52
- If you decide to use some newer version, you most likely should copy new assets to your project.
53
- This can be done with
54
- rails g lolita:assets
55
- ===Using hooks
56
-
57
- Lolita define hooks for RestController and for components.
58
- ====RestController hooks
59
-
60
- There are two kind of hooks for all actions - <em>before_[action name]</em> and <em>after_[action name]</em>.
61
- Define callbacks for those hooks outside of controller. This will call User#log_action each time when #destroy
62
- action is requested.
63
- Lolita::RestController.before_destroy do
64
- User.log_action("Going to delete #{params[:id]}")
65
- end
66
- Also you can define callbacks in your controllers that extend Lolita::RestController. This will call #set_default_params
67
- each time #new action is requested.
68
- class PostController < Lolita::RestController
69
- before_new :set_default_params
70
-
71
- private
72
-
73
- def set_default_params
74
- params[:post][:title]="-Your title goes here-"
75
- end
76
- end
77
- ====Component hooks
78
-
79
- Components have three hooks - <em>before</em>, <em>after</em> and <em>around</em>.
80
- Component hooks are different from controller hooks with names. Each component has it's own name, that is used to
81
- call component, like
82
- render_component :"lolita/configuration/list/display"
83
- #same as
84
- render_component :"lolita/configuration/list", :display
85
- and this name is used to add callback for component. As components is not related to specific class, then there
86
- are only one way to define callback for them.
87
- Lolita::Hooks.component(:"/lolita/configuration/list/display").before do
88
- "<div>My Custom text</div>"
89
- end
90
- That what are inside of blocks depends on place where you define callback if it is in <i>.rb</i> file, than you
91
- should put HTML in quotes, if in <i>.erb</i> and similar files then there is no need for that. Also blocks with
92
- Ruby code only return last line, so you should probably define HTML as shown in previous example.
93
- For <b>around</b> callback if you pass block, then original content will be replaced with that, but if you want
94
- to let original content inside of your block content than it is done like this with #let_content method.
95
- Lolita::Hooks.component(:"/lolita/configuration/list/display").around do
96
- "<div style='color:red'>#{let_content}</div>"
97
- end
98
- ==License
99
-
100
- Lolita is under MIT license. See LICENSE.txt[https://github.com/ithouse/lolita/blob/master/LICENSE.txt]
@@ -1,36 +0,0 @@
1
- class Lolita::FieldDataController < ApplicationController
2
- include Lolita::Controllers::UserHelpers
3
-
4
- before_filter :authenticate_lolita_user!
5
- before_filter :find_field, :except => [:autocomplete_field]
6
-
7
- def array_polymorphic
8
- klass = params[:class].camelize.constantize
9
- data_collection = @field.polymorphic_association_values(:klass => klass)
10
- @id = params[:id].to_s.to_i
11
- @collection = [[]]+data_collection
12
- render_component(*@field.build(:state => :options_for_select, :collection => @collection, :id => @id))
13
- end
14
-
15
- def find_field
16
- @field = params[:field_class].camelize.constantize.lolita.tabs.fields.detect{|field|
17
- field.name.to_s == params[:name].to_s
18
- }
19
- end
20
-
21
- def autocomplete_field
22
- klass = params[:field_class].camelize.constantize
23
- field = klass.lolita.tabs.fields.detect{|field| field.name.to_s == params[:field_name]}
24
- data = if field
25
- (field.search || field.create_search(true)).run(params[:term],request).map do |record|
26
- {
27
- :id => record.id,
28
- :value => record.send(field.current_text_method(field.association.klass)),
29
- :name => "#{params[:field_class].downcase}[#{params[:field_name].singularize}_ids][]",
30
- :delete_link => I18n.t("lolita.shared.delete")
31
- }
32
- end
33
- end
34
- render :json => data || {}
35
- end
36
- end
@@ -1,11 +0,0 @@
1
- - ids_method = field.name.to_s.match(/_ids$/) ? field.name : "#{field.name.to_s.singularize}_ids"
2
-
3
- .autocomplete-container
4
- = hidden_field_tag "#{resource_name}[#{ids_method}][]",""
5
- = text_field_tag :"autocomplete-#{resource_name}", nil, :"data-autocomplete-url" => autocomplete_field_path(:field_class => tab_form.object.class.to_s, :field_name => field.name)
6
- %ul
7
- - resource.persisted? && resource.send(field.name).each do |element|
8
- %li
9
- = element.send(element.class.lolita.tabs.first.fields.first.name.to_sym)
10
- = link_to I18n.t("lolita.shared.delete").downcase, nil
11
- = hidden_field_tag "#{resource_name}[#{ids_method}][]", element.id
@@ -1,8 +0,0 @@
1
- - ids_method = field.name.to_s.match(/_ids$/) ? field.name : "#{field.name.to_s.singularize}_ids"
2
- = hidden_field_tag "#{resource_name}[#{ids_method}][]",""
3
- - field.view_values(self).each do |value|
4
- - editors = resource.send(:"#{ids_method}")
5
- .habtm-container
6
- = label_tag "#{resource_name}_#{field.name}_#{value.last}",value.first, :class => "habtm-label"
7
- = check_box_tag "#{resource_name}[#{ids_method}][]", value.last, resource.send("#{ids_method}").include?(value.last), :id => "#{resource_name}_#{field.name}_#{value.last}", :class => "habtm-checkbox"
8
- .clear
@@ -1,6 +0,0 @@
1
- - record = tab_form.object
2
- - type_name = field.association.name.to_s + "_type"
3
- - id_name = field.association.name.to_s + "_id"
4
-
5
- = tab_form.select(type_name,field.polymorphic_classes, {:include_blank => true},{:"data-polymorphic-url" => array_field_data_collector_path(:name => field.name, :field_class => record.class.to_s, :class => "klass", :id =>record.send(id_name) || 0) })
6
- = tab_form.select(id_name, field.polymorphic_association_values(:record => record))
@@ -1,2 +0,0 @@
1
- = form_tag lolita_resources_path(), :method => :get, :class => "search" do
2
- %input{:type => "text", :name => "q", :value => params[:q], :placeholder => t("lolita.search")}
@@ -1,6 +0,0 @@
1
- <div class="save black">
2
- <div class="last-save">
3
- <%= resource.updated_at.strftime("#{t("lolita.tabs.last_save")}: %m/%d/%Y %H:%M ") if resource.respond_to?(:updated_at) && resource.updated_at %>
4
- </div>
5
- <button class="save-all"><%=::I18n.t("lolita.tabs.save")%></button>
6
- </div>
@@ -1,19 +0,0 @@
1
- require 'generators/helpers/file_helper'
2
- module Lolita
3
- module Generators
4
- class AssetsGenerator < Rails::Generators::Base
5
- include Lolita::Generators::FileHelper
6
- desc "Copy all from lolita public directory to project public directory."
7
- def copy_all
8
- copy_dir("public")
9
- end
10
-
11
- def call_modules
12
- Lolita.modules.each do |module_name|
13
- command="#{module_name.to_s.underscore.gsub("/","_")}:assets"
14
- invoke command rescue nil
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,56 +0,0 @@
1
- module Lolita
2
- module Configuration
3
- module Factory
4
-
5
- def temp_object?
6
- @create_temp_object||=false
7
- @create_temp_object
8
- end
9
-
10
- def add(dbi,*args,&block)
11
- @create_temp_object=true
12
- name = nil
13
- if self == Lolita::Configuration::Tab
14
- if args && args.first
15
- name = args.first
16
- else
17
- raise ArgumentError, "Define tab with type."
18
- end
19
- else
20
- begin
21
- temp_object=self.const_get(:Base).new(dbi,*args,&block)
22
- name =temp_object.type
23
- rescue Exception => e
24
- raise e
25
- ensure
26
- @create_temp_object=false
27
- end
28
- end
29
- factory(name).new(dbi,*args,&block)
30
- end
31
-
32
-
33
- protected
34
-
35
- def factory(name)
36
- begin
37
- self.const_get(:"#{to_class(name)}")
38
- rescue NameError
39
- error_class=Lolita::ConfigurationClassNotFound
40
- raise error_class, "Can't find #{self}::#{to_class(name)}. Should be in /configuration/#{factory_name}/#{name}.rb"
41
- end
42
- end
43
-
44
- def to_class(name)
45
- name.to_s.downcase.gsub(/_id$/, "").gsub(/(^\w|_\w)/) do |m|
46
- m.gsub("_","").upcase
47
- end
48
- end
49
-
50
- def factory_name
51
- @factory_name||=self.to_s.split("::").last.downcase
52
- @factory_name
53
- end
54
- end
55
- end
56
- end
@@ -1,24 +0,0 @@
1
- module Lolita
2
- module Configuration
3
- module Helper
4
- class << self
5
- # Return true if field name matches one of these:
6
- # * created_at, updated_at, type
7
- # * ends with _id, but there is no association that uses that field as foreign_key
8
- # * there are uploader with that name
9
- def tehnical_field?(db_field,dbi)
10
- name = db_field[:name].to_s
11
- if name.match(/^created_at|updated_at|type$/)
12
- true
13
- elsif name.match(/_id$/)
14
- # FIXME move this to dbi association proxy
15
- key_method = dbi.adapter_name == :active_record ? :association_foreign_key : :key
16
- !dbi.associations.values.detect{|assoc| assoc.send(key_method) == name}
17
- elsif dbi.klass.respond_to?(:uploaders)
18
- dbi.klass.uploaders.keys.include?(name.to_sym)
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,126 +0,0 @@
1
- module Lolita
2
- module Configuration
3
- class Page
4
-
5
- # page options is used to define specific options for pagination like :joins or :conditions
6
- lolita_accessor :page_options
7
- attr_writer :per_page
8
- def initialize(dbi, list=nil)
9
- @dbi=dbi
10
- @list = list
11
- @sort_columns=[]
12
- end
13
-
14
- # Records per page (also block setter)
15
- def per_page(value=nil)
16
- if value
17
- @per_page=value
18
- self
19
- else
20
- @per_page
21
- end
22
- end
23
-
24
- # Define new sort column with ascending sort direction
25
- def asc(column)
26
- @sort_columns<<[column.to_sym,:asc]
27
- self
28
- end
29
-
30
- # Define new sort columns with descending sort direction
31
- def desc(column)
32
- @sort_columns<<[column.to_sym,:desc]
33
- self
34
- end
35
-
36
- # Return all sort columns.
37
- # Each column is an Array where first element is column name and second is direction
38
- # ====Example
39
- # page=Lolita::Configuration::Page.new(@dbi)
40
- # page.asc(:created_at)
41
- # page.sort_columns #=> [[:created_at,:asc]]
42
- def sort_columns
43
- @sort_columns
44
- end
45
-
46
- # Paginate
47
- # Options:
48
- # * <tt>:per_page</tt> - record count per page, default uses list.per_page
49
- # * <tt>:page</tt> - what page to show
50
- # * <tt>:sort_columns</tt> - sort columns for page. See #sort_columns
51
- # * <tt>:asc</tt> - column to sort in ascending direction
52
- # list.paginate(1,:asc=>:created_at)
53
- # * <tt>:desc</tt> - column to sort in descending direction
54
- #
55
- # ====Example
56
- # list.paginate(1)
57
- # list.paginate
58
- # list.paginate(:per_page=>2,:page=>1)
59
- def paginate *args
60
- options=args ? args.extract_options! : {}
61
- hold=options.delete(:hold)
62
- @params=options.delete(:params)
63
- set_values_from_options(options)
64
- options[:page]||=((args && args.first) || 1)
65
- options[:per_page]||=@per_page || 10
66
- @last_options=options
67
- @last_options[:sort]=self.sort_columns unless self.sort_columns.empty?
68
- unless hold
69
- get_page()
70
- end
71
- end
72
-
73
- def get_page()
74
- @page=@dbi.filter(filter_conditions).paginate((@page_options||{}).merge(@last_options))
75
- end
76
-
77
- # Return last paginated page
78
- # ====Example
79
- # list.paginate(2)
80
- # # call page to avoid another call to db
81
- # list.page
82
- def last_page
83
- @page
84
- end
85
-
86
- private
87
-
88
- # returns filter conditions as Hash for get_page()
89
- def filter_conditions
90
- if @params
91
- conditions = {}
92
- @params.each_pair do |k,v|
93
- if k.to_s =~ /^f_([a-z0-9_\-]+)$/ && !v.to_s.strip.blank?
94
- conditions[$1.to_sym] = v
95
- end
96
- end
97
- conditions
98
- else
99
- {}
100
- end
101
- end
102
-
103
- def allowed_options
104
- [:sort_columns,:asc,:desc]
105
- end
106
-
107
- def set_values_from_options(options)
108
- allowed_options.each{|meth|
109
- if options.has_key?(meth)
110
- self.send(meth,options.delete(meth))
111
- end
112
- }
113
- parse_params
114
- end
115
-
116
- def parse_params
117
- if @params
118
- if @params.has_key?(:sc)
119
- self.send((@params[:sd] || :asc).to_sym,@params[:sc])
120
- end
121
- end
122
- end
123
-
124
- end
125
- end
126
- end
@@ -1,91 +0,0 @@
1
- module Lolita
2
- module Configuration
3
- # Proxy class for search. It supports two methods #with and #run.
4
- # By default with method accepts method name or nothing and creates Lolita::Search::Simple instance
5
- # that will be used to run search on current dbi.
6
- # By default search run against all content fields, but when _:fields_ options is passed it search in
7
- # those fields only.
8
- # ==== Example
9
- # class Post < ActiveRecord::Base
10
- # include Lolita::Configuration
11
- # lolita do
12
- # list do
13
- # search :fields => [:name]
14
- # end
15
- # end
16
- # end
17
- # #with method also accepts class or instance of some class, that will be used to run search.
18
- # That class should have #run method that accepts query and request.
19
- # ====Example
20
- # class MyCustomSearch
21
- # def initialize(dbi)
22
- # @dbi = dbi
23
- # end
24
- #
25
- # def run(query,request = nil)
26
- # @dbi.klass.where(:my_field => query)
27
- # end
28
- # end
29
- # Also you can put your search method in model. For more see Lolita::Search::Simple
30
- # ====Example
31
- # class Post < ActiveRecord::Base
32
- # include Lolita::Configuration
33
- # lolita do
34
- # list do
35
- # search :my_custom_search
36
- # end
37
- # end
38
- #
39
- # def self.my_custom_search(query,request)
40
- # self.where(:title => query, :user_id => request.params[:user_id])
41
- # end
42
- # end
43
- class Search
44
- include Lolita::Builder
45
- attr_reader :dbi
46
- attr_writer :with, :fields
47
-
48
- def initialize dbi, *args, &block
49
- @dbi = dbi
50
- set_attributes(args ? args.extract_options! : {})
51
- instance_eval(&block) if block_given?
52
- @with ||= args[0]!=true && args[0] ? args[0] : nil
53
- end
54
-
55
- def with(value = nil)
56
- @with = value if value
57
- if !@with || [String,Symbol].include?(@with.class)
58
- @with = Lolita::Search::Simple.new(dbi,@with, :fields => @fields)
59
- elsif @with.class == Class
60
- initialize_arity = @with.instance_method(:initialize).arity
61
- @with = if initialize_arity < 0 || initialize_arity > 1
62
- @with.new(dbi,:fields => @fields)
63
- else
64
- @with.new(dbi)
65
- end
66
- end
67
- @with
68
- end
69
-
70
- def run(query,request = nil)
71
- if self.with.method(:run).arity < 0 || self.with.method(:run).arity > 1
72
- self.with.run(query,request)
73
- else
74
- self.with.run(query)
75
- end
76
- end
77
-
78
- private
79
-
80
- def set_attributes options
81
- if options.respond_to?(:each)
82
- options.each do |method_name, value|
83
- self.send(:"#{method_name}=",value)
84
- end
85
- end
86
- end
87
-
88
- end
89
-
90
- end
91
- end