lolita 3.1.18 → 3.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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