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.
- data/Gemfile +5 -2
- data/History.rdoc +24 -0
- data/README.md +113 -0
- data/VERSION +1 -1
- data/{public → app/assets}/images/lolita/plus.png +0 -0
- data/{public → app/assets}/javascripts/lolita/application.js +0 -0
- data/{public → app/assets}/javascripts/lolita/base64.js +0 -0
- data/{public → app/assets}/javascripts/lolita/main.js +1 -0
- data/{public → app/assets}/javascripts/lolita/tab.js +0 -0
- data/{public → app/assets}/stylesheets/lolita/PIE-custom.htc +0 -0
- data/{public → app/assets}/stylesheets/lolita/PIE.htc +0 -0
- data/{public → app/assets}/stylesheets/lolita/default.css +0 -0
- data/{public → app/assets}/stylesheets/lolita/style.css +0 -21
- data/app/controllers/lolita/info_controller.rb +1 -12
- data/app/controllers/lolita/rest_controller.rb +2 -7
- data/app/helpers/lolita_helper.rb +1 -12
- data/app/views/components/lolita/configuration/column/_header.html.erb +1 -1
- data/app/views/components/lolita/configuration/column/_sort.html.erb +4 -7
- data/app/views/components/lolita/configuration/field/array/habtm/_display.html.haml +1 -1
- data/app/views/components/lolita/configuration/field/array/select/_display.html.erb +1 -1
- data/app/views/components/lolita/configuration/field/string/disabled/_display.html.erb +1 -1
- data/app/views/components/lolita/configuration/field/string/text/_display.html.erb +1 -1
- data/app/views/components/lolita/configuration/list/_paginator.html.erb +1 -1
- data/app/views/components/lolita/configuration/list/_title.html.erb +1 -6
- data/app/views/components/lolita/configuration/nested_form/_display.html.erb +6 -8
- data/app/views/components/lolita/navigation/_tree.html.erb +25 -18
- data/app/views/components/lolita/shared/_header.html.erb +1 -1
- data/app/views/components/lolita/shared/_right_sidebar.html.erb +6 -1
- data/app/views/layouts/lolita/application.html.erb +3 -3
- data/config/locales/en.yml +24 -1
- data/config/locales/lv.yml +0 -1
- data/config/routes.rb +1 -3
- data/lib/generators/lolita/install_generator.rb +1 -5
- data/lib/lolita.rb +23 -38
- data/lib/lolita/adapter/abstract_adapter.rb +0 -1
- data/lib/lolita/adapter/active_record.rb +4 -42
- data/lib/lolita/adapter/mongoid.rb +4 -76
- data/lib/lolita/configuration/base.rb +2 -15
- data/lib/lolita/configuration/column.rb +2 -25
- data/lib/lolita/configuration/factory/field.rb +2 -10
- data/lib/lolita/configuration/field.rb +1 -6
- data/lib/lolita/configuration/field/array.rb +31 -124
- data/lib/lolita/configuration/field/integer.rb +1 -0
- data/lib/lolita/configuration/list.rb +2 -23
- data/lib/lolita/configuration/tabs.rb +0 -6
- data/lib/lolita/controllers/component_helpers.rb +1 -1
- data/lib/lolita/controllers/internal_helpers.rb +4 -18
- data/lib/lolita/controllers/user_helpers.rb +11 -23
- data/lib/lolita/hooks.rb +120 -163
- data/lib/lolita/lazy_loader.rb +0 -3
- data/lib/lolita/mapping.rb +0 -23
- data/lib/lolita/modules/rest.rb +1 -1
- data/lib/lolita/navigation/branch.rb +1 -52
- data/lib/lolita/navigation/tree.rb +0 -10
- data/lib/lolita/rails.rb +2 -1
- data/lib/lolita/rails/routes.rb +5 -4
- data/lib/lolita/system_configuration/application.rb +1 -7
- data/lolita.gemspec +83 -100
- data/spec/configuration/field_spec.rb +1 -1
- data/spec/configuration/list_spec.rb +14 -19
- data/spec/rails_app/app/mongoid/post.rb +0 -4
- data/spec/rails_app/config/application.rb +1 -12
- data/spec/rails_app/config/environments/development.rb +2 -6
- data/spec/rails_app/config/environments/production.rb +1 -5
- data/spec/rails_app/config/environments/test.rb +1 -5
- data/vendor/assets/javascripts/jquery-1.6.2.min.js +18 -0
- data/{public → vendor/assets}/javascripts/jquery-ui-1.8.13.min.js +0 -0
- data/{public → vendor/assets}/javascripts/modernizr-1.7.min.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/jquery.tinymce.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/langs/en.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/license.txt +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/about.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/anchor.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/charmap.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/color_picker.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/editor_template.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/editor_template_src.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/image.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/colorpicker.jpg +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/flash.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/icons.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/iframe.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/pagebreak.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/quicktime.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/realmedia.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/shockwave.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/trans.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/video.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/img/windowsmedia.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/about.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/anchor.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/charmap.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/color_picker.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/image.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/link.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/js/source_editor.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/langs/en.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/langs/en_dlg.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/link.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/shortcuts.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/content.css +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/dialog.css +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/butt2.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/button-bg.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/buttons.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/down_arrow.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/fade-butt.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/icons.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/items.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/menu-arrow.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/menu-check.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/progress.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/tabs.gif +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/img/toolbarbg.png +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/skins/cirkuit/ui.css +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/themes/advanced/source_editor.htm +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/tiny_mce.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/tiny_mce_popup.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/utils/editable_selects.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/utils/form_utils.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/utils/mctabs.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce/utils/validate.js +0 -0
- data/{public → vendor/assets}/javascripts/tinymce_config.js +1 -1
- metadata +121 -127
- data/README.rdoc +0 -100
- data/app/controllers/lolita/field_data_controller.rb +0 -36
- data/app/views/components/lolita/configuration/field/array/autocomplete/_display.html.haml +0 -11
- data/app/views/components/lolita/configuration/field/array/checkbox/_display.html.haml +0 -8
- data/app/views/components/lolita/configuration/field/array/polymorphic/_display.html.haml +0 -6
- data/app/views/components/lolita/configuration/field/array/polymorphic/_options_for_select.html.haml +0 -1
- data/app/views/components/lolita/configuration/search/_display.html.haml +0 -2
- data/app/views/components/lolita/shared/_save_button.html.erb +0 -6
- data/lib/generators/lolita/assets_generator.rb +0 -19
- data/lib/lolita/configuration/factory.rb +0 -56
- data/lib/lolita/configuration/helper.rb +0 -24
- data/lib/lolita/configuration/page.rb +0 -126
- data/lib/lolita/configuration/search.rb +0 -91
- data/lib/lolita/controller_additions.rb +0 -15
- data/lib/lolita/controllers/authorization_helpers.rb +0 -56
- data/lib/lolita/search/simple.rb +0 -76
- data/public/javascripts/jquery-1.6.min.js +0 -16
- data/public/javascripts/rails.js +0 -137
- data/spec/configuration/search_spec.rb +0 -44
- 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))
|
data/app/views/components/lolita/configuration/field/array/polymorphic/_options_for_select.html.haml
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
= options_for_select(collection,id)
|
@@ -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
|