lolita 3.1.16 → 3.1.17
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 +2 -1
- data/History.rdoc +10 -0
- data/VERSION +1 -1
- data/app/views/components/lolita/configuration/field/_display.html.erb +1 -1
- data/app/views/components/lolita/configuration/field/_label.html.erb +1 -1
- 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/list/_paginator.html.erb +1 -1
- data/app/views/components/lolita/configuration/nested_form/_display.html.erb +3 -3
- data/app/views/components/lolita/configuration/nested_form/_fields.html.erb +1 -1
- data/app/views/components/lolita/configuration/tab/_display.html.erb +4 -13
- data/app/views/components/lolita/configuration/tab/_error_msg.html.erb +14 -0
- data/app/views/components/lolita/configuration/tab/_form.html.erb +1 -1
- data/app/views/components/lolita/shared/_header.html.erb +1 -1
- data/app/views/kaminari/lolita/_first_page.html.erb +11 -0
- data/app/views/kaminari/lolita/_gap.html.erb +8 -0
- data/app/views/kaminari/lolita/_last_page.html.erb +11 -0
- data/app/views/kaminari/lolita/_next_page.html.erb +11 -0
- data/app/views/kaminari/lolita/_page.html.erb +12 -0
- data/app/views/kaminari/lolita/_paginator.html.erb +23 -0
- data/app/views/kaminari/lolita/_prev_page.html.erb +11 -0
- data/app/views/layouts/lolita/application.html.erb +5 -3
- data/config/locales/en.yml +2 -0
- data/config/locales/lv.yml +10 -1
- data/lib/lolita/configuration/field/array.rb +10 -0
- data/lib/lolita/configuration/helper.rb +1 -1
- data/lib/lolita/configuration/nested_form.rb +33 -0
- data/lib/lolita/rails.rb +5 -1
- data/lib/lolita/system_configuration/application.rb +21 -0
- data/lib/lolita/system_configuration/base.rb +161 -0
- data/lib/lolita.rb +6 -2
- data/lolita.gemspec +15 -3
- data/public/javascripts/lolita/tab.js +9 -14
- data/public/stylesheets/lolita/style.css +114 -19
- data/spec/lolita_spec.rb +1 -1
- metadata +52 -32
- data/lib/lolita/base_configuration.rb +0 -166
data/Gemfile
CHANGED
@@ -5,10 +5,11 @@ gem "rails", "~>3.0.10"
|
|
5
5
|
gem "kaminari", "~>0.12.4"
|
6
6
|
gem "abstract"
|
7
7
|
gem "builder", "~> 2.1.2" #cucumber asks for builder 3 but rails supports 2.1
|
8
|
+
gem "haml", "~> 3.1.2"
|
8
9
|
|
9
10
|
group :mongoid do
|
10
11
|
gem "mongo", "~> 1.3.0"
|
11
|
-
gem "mongoid", "~> 2.
|
12
|
+
gem "mongoid", "~> 2.1.7"
|
12
13
|
gem "bson_ext", "~> 1.3.0"
|
13
14
|
end
|
14
15
|
|
data/History.rdoc
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
=== Version 3.1.17 / 2011-09-01
|
2
|
+
* Bug fixes
|
3
|
+
* Error explanation updated with nested errors
|
4
|
+
|
5
|
+
* Enhancements
|
6
|
+
* Array field have special method for values
|
7
|
+
* HAML support added
|
8
|
+
* look improved
|
9
|
+
* project configuration added
|
10
|
+
|
1
11
|
=== Version 3.1.16 / 2011-08-30
|
2
12
|
* Bug fixes
|
3
13
|
* Component helper name detection fixed
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.17
|
@@ -1 +1 @@
|
|
1
|
-
<%= label
|
1
|
+
<%= tab_form.label field.name, raw(field.title.to_s.capitalize), :id=>"field_#{field.__id__}_label" %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
= hidden_field_tag "#{resource_name}[#{field.name.to_s.singularize}_ids][]",""
|
2
|
-
- field.
|
2
|
+
- field.view_values(self).each do |value|
|
3
3
|
- editors = resource.send(:"#{field.name.to_s.singularize}_ids")
|
4
4
|
.habtm-container
|
5
5
|
= label_tag "#{resource_name}_#{field.name}_#{value.last}",value.first, :class => "habtm-label"
|
@@ -1 +1 @@
|
|
1
|
-
<%= paginate
|
1
|
+
<%= paginate page, :theme => "lolita" %>
|
@@ -1,13 +1,13 @@
|
|
1
1
|
<div class="nested_form" id=<%= "nested_form_#{nested_form.__id__}" %>>
|
2
2
|
<% unless nested_form.field_style == :normal %>
|
3
|
-
|
3
|
+
<%= render_component *nested_form.as_field.build(:name=>"/lolita/configuration/field", :state => :"label") %>
|
4
4
|
<% end %>
|
5
|
-
<%= tab_form.fields_for nested_form.name do |form| %>
|
5
|
+
<%= tab_form.fields_for nested_form.name, resource.send(nested_form.build_method) do |form| %>
|
6
6
|
<% tab_form(form) do %>
|
7
7
|
<%= render_component nested_form, :fields %>
|
8
8
|
<% end %>
|
9
9
|
<% end %>
|
10
|
-
<% if nested_form.expandable? %>
|
10
|
+
<% if nested_form.expandable? && !nested_form.update_only? %>
|
11
11
|
<p><%= link_to_add_fields ::I18n.t("lolita.nested_form.add", :resource_name => nested_form.klass.model_name.human.downcase), tab_form, nested_form %> </p>
|
12
12
|
<% end %>
|
13
13
|
</div>
|
@@ -1,17 +1,8 @@
|
|
1
|
-
<div class="tab box" id="tab_<%=tab.__id__%>">
|
2
|
-
|
1
|
+
<div class="tab box <%=resource.lolita.tabs.first == tab ? "first-tab" : "default minimized"%>" id="tab_<%=tab.__id__%>">
|
2
|
+
<div class="tab-title boxtitle <%= resource.lolita.tabs.first == tab ? "black" : "grey"%>" >
|
3
3
|
<h1><%= tab.title %></h1>
|
4
|
-
<div class="arrow"></div>
|
4
|
+
<div class="arrow"></div>
|
5
5
|
</div>
|
6
|
-
|
7
|
-
<p class="errorExplanation" id="errorExplanation">
|
8
|
-
<%= raw resource.errors.keys.collect{|k|
|
9
|
-
if error_tab = tab.fields.by_name(k)
|
10
|
-
"#{error_tab.title.humanize.capitalize}: "+
|
11
|
-
"#{resource.errors[k].collect{|m| m.capitalize}.join(" and ")}"
|
12
|
-
end
|
13
|
-
}.compact.join("<br>") %>
|
14
|
-
</p>
|
15
|
-
<% end %>
|
6
|
+
<%= render_component "lolita/configuration/tab", :error_msg, :tab => tab %>
|
16
7
|
<%= render_component "lolita/configuration/tab", :form, :tab => tab %>
|
17
8
|
</div>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% if resource.errors.any? %>
|
2
|
+
<p class="errorExplanation" id="errorExplanation">
|
3
|
+
<%= raw resource.errors.keys.collect{|k|
|
4
|
+
title = if k.to_s.match(/\./)
|
5
|
+
assoc_name, attr_name = k.to_s.split(".")
|
6
|
+
klass = resource.lolita.dbi.reflect_on_association(assoc_name.to_sym).klass
|
7
|
+
klass.human_attribute_name(attr_name).downcase
|
8
|
+
else
|
9
|
+
resource.class.human_attribute_name(k)
|
10
|
+
end
|
11
|
+
"#{title.to_s.capitalize}: #{resource.errors[k].join(" #{::I18n.t("lolita.shared.and")} ")}"
|
12
|
+
}.compact.join("<br>") %>
|
13
|
+
</p>
|
14
|
+
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%
|
2
2
|
#This partial is useful for hooks. You don't need to hook in each tab, but you can hook here, that is common to all tabs
|
3
3
|
%>
|
4
|
-
<%= form_for resource, :url => "#",:html => {:multipart=>true, :id=>"tab-form-#{tab.__id__}",:method => resource.new_record? ? :post : :put} do |form| %>
|
4
|
+
<%= form_for resource, :url => "#",:html => {:onsubmit => "return false;",:multipart=>true, :id=>"tab-form-#{tab.__id__}",:method => resource.new_record? ? :post : :put} do |form| %>
|
5
5
|
<% self.tab_form = form %>
|
6
6
|
<%= render_component *tab.build %>
|
7
7
|
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "First" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the first page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<span class="first">
|
10
|
+
<%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :remote => remote %>
|
11
|
+
</span>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%# Non-link tag that stands for skipped pages...
|
2
|
+
- available local variables
|
3
|
+
current_page: a page object for the currently displayed page
|
4
|
+
num_pages: total number of pages
|
5
|
+
per_page: number of items to fetch per page
|
6
|
+
remote: data-remote
|
7
|
+
-%>
|
8
|
+
<span class="page gap"><%= raw(t 'views.pagination.truncate') %></span>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "Last" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the last page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<span class="last">
|
10
|
+
<%= link_to_unless current_page.last?, raw(t 'views.pagination.last'), url, {:remote => remote} %>
|
11
|
+
</span>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "Next" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the next page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<span class="next">
|
10
|
+
<%= link_to_unless current_page.last?, raw(t 'views.pagination.next'), url, :rel => 'next', :remote => remote %>
|
11
|
+
</span>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%# Link showing page number
|
2
|
+
- available local variables
|
3
|
+
page: a page object for "this" page
|
4
|
+
url: url to this page
|
5
|
+
current_page: a page object for the currently displayed page
|
6
|
+
num_pages: total number of pages
|
7
|
+
per_page: number of items to fetch per page
|
8
|
+
remote: data-remote
|
9
|
+
-%>
|
10
|
+
<span class="page<%= ' current' if page.current? %>">
|
11
|
+
<%= link_to_unless page.current?, page, url, opts = {:remote => remote, :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
|
12
|
+
</span>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%# The container tag
|
2
|
+
- available local variables
|
3
|
+
current_page: a page object for the currently displayed page
|
4
|
+
num_pages: total number of pages
|
5
|
+
per_page: number of items to fetch per page
|
6
|
+
remote: data-remote
|
7
|
+
paginator: the paginator that renders the pagination tags inside
|
8
|
+
-%>
|
9
|
+
<%= paginator.render do -%>
|
10
|
+
<nav class="pagination">
|
11
|
+
<%= first_page_tag unless current_page.first? %>
|
12
|
+
<%= prev_page_tag unless current_page.first? %>
|
13
|
+
<% each_page do |page| -%>
|
14
|
+
<% if page.left_outer? || page.right_outer? || page.inside_window? -%>
|
15
|
+
<%= page_tag page %>
|
16
|
+
<% elsif !page.was_truncated? -%>
|
17
|
+
<%= gap_tag %>
|
18
|
+
<% end -%>
|
19
|
+
<% end -%>
|
20
|
+
<%= next_page_tag unless current_page.last? %>
|
21
|
+
<%= last_page_tag unless current_page.last? %>
|
22
|
+
</nav>
|
23
|
+
<% end -%>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%# Link to the "Previous" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the previous page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<span class="prev">
|
10
|
+
<%= link_to_unless current_page.first?, raw(t 'views.pagination.previous'), url, :rel => 'prev', :remote => remote %>
|
11
|
+
</span>
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<!--[if IE 7 ]> <html class="no-js ie7" lang="en"> <![endif]-->
|
5
5
|
<!--[if IE 8 ]> <html class="no-js ie8" lang="en"> <![endif]-->
|
6
6
|
<!--[if (gte IE 9)|!(IE)]><!-->
|
7
|
-
<html class="no-js" lang="en">
|
7
|
+
<html class="no-js" lang="en" style="height:100%">
|
8
8
|
<!--<![endif]-->
|
9
9
|
<head>
|
10
10
|
<meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
@@ -38,8 +38,10 @@
|
|
38
38
|
<%= yield %>
|
39
39
|
</div>
|
40
40
|
</div>
|
41
|
-
<
|
42
|
-
</footer>
|
41
|
+
<div class="push"></div>
|
43
42
|
</div>
|
43
|
+
<footer>
|
44
|
+
<div id="powered"><%= ::I18n.t("lolita.shared.powered", :year => Date.today.year)%></div>
|
45
|
+
</footer>
|
44
46
|
</body>
|
45
47
|
</html>
|
data/config/locales/en.yml
CHANGED
data/config/locales/lv.yml
CHANGED
@@ -6,6 +6,8 @@ lv:
|
|
6
6
|
log_out: Atteikties
|
7
7
|
edit: Labot
|
8
8
|
delete: Dzēst
|
9
|
+
and: un
|
10
|
+
powered: Darbojas ar Lolita (2010-%{year})
|
9
11
|
nested_form:
|
10
12
|
add: "Pievienot %{resource_name}"
|
11
13
|
tabs:
|
@@ -20,4 +22,11 @@ lv:
|
|
20
22
|
confirm: "Vai esat pārliecināts, ka vēlaties dzēst ierakstu?"
|
21
23
|
filter:
|
22
24
|
apply_button: Pielietot
|
23
|
-
include_blank_by_title: " -- Filtrēt pēc %{title} -- "
|
25
|
+
include_blank_by_title: " -- Filtrēt pēc %{title} -- "
|
26
|
+
views:
|
27
|
+
pagination:
|
28
|
+
previous: "« Atpakaļ"
|
29
|
+
next: "Uz priekšu »"
|
30
|
+
last: "Beigas"
|
31
|
+
first: "Sākums"
|
32
|
+
truncate: "..."
|
@@ -47,6 +47,16 @@ module Lolita
|
|
47
47
|
@association_values
|
48
48
|
end
|
49
49
|
|
50
|
+
# used in views for shorter accessing to values
|
51
|
+
def view_values(view)
|
52
|
+
values = association_values
|
53
|
+
if values.respond_to?(:call)
|
54
|
+
values.call(view)
|
55
|
+
else
|
56
|
+
association_values
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
50
60
|
private
|
51
61
|
|
52
62
|
def set_association_type #TODO test
|
@@ -15,7 +15,7 @@ module Lolita
|
|
15
15
|
key_method = dbi.adapter_name == :active_record ? :association_foreign_key : :key
|
16
16
|
!dbi.associations.values.detect{|assoc| assoc.send(key_method) == name}
|
17
17
|
elsif dbi.klass.respond_to?(:uploaders)
|
18
|
-
|
18
|
+
dbi.klass.uploaders.keys.include?(name.to_sym)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -19,31 +19,56 @@ module Lolita
|
|
19
19
|
|
20
20
|
attr_reader :parent, :options, :field_style
|
21
21
|
attr_accessor :name, :expandable, :field_rejection_proc
|
22
|
+
attr_writer :build_method
|
22
23
|
|
23
24
|
def initialize parent,name=nil, options ={}
|
24
25
|
@parent=parent
|
25
26
|
@options = options
|
26
27
|
self.name=name || "nested_form_#{next_nested_form}"
|
28
|
+
set_attributes_from(options)
|
27
29
|
end
|
28
30
|
|
31
|
+
def allow_destroy?
|
32
|
+
dbi.klass.nested_attributes_options[name][:allow_destroy]
|
33
|
+
end
|
34
|
+
|
35
|
+
def update_only?
|
36
|
+
dbi.klass.nested_attributes_options[name][:update_only]
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_method
|
40
|
+
@build_method || self.name
|
41
|
+
end
|
42
|
+
# Set field style - normal or simple. Default - normal.
|
29
43
|
def field_style=(value)
|
30
44
|
allowed_values = [:normal,:simple]
|
31
45
|
raise ArgumentError, "Only #{allowed_values.inspect} are allowed" unless allowed_values.include?(value)
|
32
46
|
@field_style = value
|
33
47
|
end
|
34
48
|
|
49
|
+
# Detect if it's possible to add more than one field group, like if model has many other objects.
|
35
50
|
def expandable?
|
36
51
|
@expandable == true || (@expandable == nil && macro == :many)
|
37
52
|
end
|
38
53
|
|
54
|
+
# Create field, that is not real field, but represents nested attributes as one.
|
55
|
+
# It is used to create label.
|
56
|
+
def as_field
|
57
|
+
Lolita::Configuration::Field.add(dbi,self.name, :string)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Parent (a.k.a tab) dbi
|
39
61
|
def dbi
|
40
62
|
@parent.dbi
|
41
63
|
end
|
42
64
|
|
65
|
+
# Fields setter. Fields should be array and each element should be Lolita::Configuration::Field object.
|
43
66
|
def fields=(new_fields)
|
44
67
|
@fields = new_fields
|
45
68
|
end
|
46
69
|
|
70
|
+
# Return all fields. Each time fields ar returned from @fields if its defined or calculated by using #field_rejection_proc
|
71
|
+
# or collected from parent (tab) where fields nested form is same with self.
|
47
72
|
def fields
|
48
73
|
if @fields
|
49
74
|
@fields
|
@@ -54,10 +79,12 @@ module Lolita
|
|
54
79
|
end
|
55
80
|
end
|
56
81
|
|
82
|
+
# Parent (tab) dbi klass
|
57
83
|
def klass
|
58
84
|
dbi.reflect_on_association(name).klass
|
59
85
|
end
|
60
86
|
|
87
|
+
# Parent (tab) dbi klass reflection with #name and macros of that.
|
61
88
|
def macro
|
62
89
|
dbi.association_macro(dbi.reflect_on_association(name))
|
63
90
|
end
|
@@ -67,6 +94,12 @@ module Lolita
|
|
67
94
|
def next_nested_form
|
68
95
|
@@last_nested_form+=1
|
69
96
|
end
|
97
|
+
|
98
|
+
def set_attributes_from(options)
|
99
|
+
options.each{|key,value|
|
100
|
+
instance_variable_set(:"@#{key}",value)
|
101
|
+
}
|
102
|
+
end
|
70
103
|
end
|
71
104
|
end
|
72
105
|
end
|
data/lib/lolita/rails.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'lolita/rails/routes'
|
2
|
-
|
2
|
+
require 'haml'
|
3
3
|
|
4
4
|
ActiveSupport.on_load(:action_controller) {
|
5
5
|
include Lolita::Controllers::ViewUserHelpers
|
@@ -16,5 +16,9 @@ module Lolita
|
|
16
16
|
class Engine < Rails::Engine
|
17
17
|
config.lolita=Lolita
|
18
18
|
config.i18n.load_path += Dir[File.join(Lolita.root,'config', 'locales','default', '*.{yml}')]
|
19
|
+
config.before_initialize do
|
20
|
+
Haml.init_rails(binding)
|
21
|
+
Haml::Template.options[:format] = :html5
|
22
|
+
end
|
19
23
|
end
|
20
24
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Lolita
|
2
|
+
module SystemConfiguration
|
3
|
+
class Application
|
4
|
+
|
5
|
+
attr_writer :name
|
6
|
+
|
7
|
+
def name
|
8
|
+
@name || default_name
|
9
|
+
end
|
10
|
+
|
11
|
+
def default_name
|
12
|
+
if defined?(Rails)
|
13
|
+
Rails::Application.subclasses.first.to_s.split("::").first
|
14
|
+
else
|
15
|
+
"Lolita"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
module Lolita
|
2
|
+
module SystemConfiguration
|
3
|
+
class Base
|
4
|
+
attr_reader :scope, :modules, :routes, :controllers,:resources
|
5
|
+
attr_accessor :mappings,:default_route,:user_classes,:authentication
|
6
|
+
attr_writer :default_locale
|
7
|
+
|
8
|
+
def initialize(scope)
|
9
|
+
@scope=scope
|
10
|
+
@mappings={}
|
11
|
+
@resources={}
|
12
|
+
@default_module=nil
|
13
|
+
@user_classes=[]
|
14
|
+
@modules=[]
|
15
|
+
@routes={}
|
16
|
+
@controllers={}
|
17
|
+
end
|
18
|
+
|
19
|
+
def application &block
|
20
|
+
@application ||= Lolita::SystemConfiguration::Application.new
|
21
|
+
if block_given?
|
22
|
+
yield @application
|
23
|
+
end
|
24
|
+
@application
|
25
|
+
end
|
26
|
+
|
27
|
+
def navigation
|
28
|
+
@navigation||=Lolita::Navigation::Base.new()
|
29
|
+
@navigation
|
30
|
+
end
|
31
|
+
|
32
|
+
def locales=(value)
|
33
|
+
unless value.is_a?(Array)
|
34
|
+
@locales=[value]
|
35
|
+
else
|
36
|
+
@locales=value
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def locales
|
41
|
+
@locales || []
|
42
|
+
end
|
43
|
+
|
44
|
+
def locale()
|
45
|
+
@locale || default_locale
|
46
|
+
end
|
47
|
+
|
48
|
+
def locale=given_locale
|
49
|
+
@locale=if locales.include?(given_locale.to_s.to_sym)
|
50
|
+
given_locale.to_s.to_sym
|
51
|
+
else
|
52
|
+
Lolita.default_locale
|
53
|
+
end
|
54
|
+
end
|
55
|
+
# Return default locale. First looks for defined default locale for Lolita, when not found than
|
56
|
+
# take first of defined #locales for Lolita, if there no defined locales for Lolita, than
|
57
|
+
# look for I18n and take default locale from there or if there is no I18n than take :en
|
58
|
+
def default_locale
|
59
|
+
@default_locale || self.locales.first || (defined?(::I18n) ? ::I18n.default_locale : :en)
|
60
|
+
end
|
61
|
+
# Call (with #call) to route klass
|
62
|
+
# And return all names of routes that are needed for resource.
|
63
|
+
# When with #add_module routes are defined like
|
64
|
+
# Lolita.add_module MyModule, :route=>:my_module
|
65
|
+
# then this will be passed to the method that creates routes, but
|
66
|
+
# when Proc is passed to <i>:route</i> then this Proc should return
|
67
|
+
# name of route or nil.
|
68
|
+
# These names then are used for methods like <em>lolita_[route_name]_route</em>
|
69
|
+
# that should be required somewhere in you module.
|
70
|
+
def conditional_routes(klass=nil)
|
71
|
+
@routes.map{|name,route|
|
72
|
+
if route.first
|
73
|
+
if route.last.respond_to?(:call)
|
74
|
+
route.last.call(klass)
|
75
|
+
else
|
76
|
+
route.last
|
77
|
+
end
|
78
|
+
end
|
79
|
+
}.compact
|
80
|
+
end
|
81
|
+
|
82
|
+
# Find all routes that is needed for defined classes
|
83
|
+
# And return only one for each different route.
|
84
|
+
def common_routes(klasses)
|
85
|
+
@routes.map{|name,route|
|
86
|
+
unless route.first
|
87
|
+
klasses.map{|klass| route.last.respond_to?(:call) ? route.last.call(klass) : route.last}
|
88
|
+
end
|
89
|
+
}.flatten.compact.uniq
|
90
|
+
end
|
91
|
+
|
92
|
+
# Include module in Lolita, don't know why i need this
|
93
|
+
def use(module_name)
|
94
|
+
Lolita.send(:include,module_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
def add_mapping(resource,options={})
|
98
|
+
mapping = Lolita::Mapping.new(resource, options)
|
99
|
+
self.mappings[mapping.name] = mapping
|
100
|
+
mapping
|
101
|
+
end
|
102
|
+
|
103
|
+
# Add new module to Lolita
|
104
|
+
# Accpted options
|
105
|
+
# * <tt>controller</tt> - not in use
|
106
|
+
# * <tt>nested</tt> - is route stands itsefl or is used in combination with resource
|
107
|
+
# * <tt>route</tt> - Symbol of route name or lambad, that return route name based on resource.
|
108
|
+
# Route name is used to call method lolita_[route_name] in Mapper class, and that should draw route.
|
109
|
+
# * <tt>:name</tt> - name of module, underscored symbol. Used to draw default route, by default always
|
110
|
+
# lolita_rest is called, but if route with resource name is found, than by default this route will be drawn.
|
111
|
+
# Like lolita_for :posts, can go to different controller than rest and do other things.
|
112
|
+
# * <tt>:path</tt> - some file that will be included. Deprecated will be removed
|
113
|
+
# ====Example
|
114
|
+
# Lolita.add_module Lolita::Posts, :route=>:post, :name=>:post
|
115
|
+
# lolita_for :posts #=> create url whatever is defined in lolita_post method, and goes to :controller=>"lolita/posts"
|
116
|
+
# Lolita.add_module Lolita::FileUpload, :route=>lambda{|resource| resource.lolita.tabs.by_type(:file) ? :file_upload : nil}
|
117
|
+
# lolita_for :users #=> creat default rest urls and also call method lolita_file_upload if user lolita define :file tab.
|
118
|
+
# To add route for public interface that goes to added module, than use
|
119
|
+
# Lolita.add_module Post, :name=>:posts
|
120
|
+
# And then when in routes.rb will be defined lolita_for(:posts) it will call method <i>lolita_posts_route</i>
|
121
|
+
# and that method should define resource.
|
122
|
+
# ====Example
|
123
|
+
# # require this in your gem or lib
|
124
|
+
# module ActionDispatch::Routing
|
125
|
+
# class Mapper
|
126
|
+
# protected
|
127
|
+
# def lolita_posts_route mapping, controllers
|
128
|
+
# resources mapping.plural,:only=>[:index,:new,:create],
|
129
|
+
# :controller=>controllers[:posts],:module=>mapping.module
|
130
|
+
# end
|
131
|
+
# end
|
132
|
+
# end
|
133
|
+
# You open Mapper class and add your method that call #resources or #match or other method that define route
|
134
|
+
# For common route for all lolita resources your method should look like this
|
135
|
+
# ====Example
|
136
|
+
# def lolita_files_route
|
137
|
+
# mapping=Lolita.add_mapping(:files,:class_name=>"Lolita::Multimedia::File",:module=>"file_upload")
|
138
|
+
# scope :module=>mapping.module do
|
139
|
+
# resources mapping.name
|
140
|
+
# end
|
141
|
+
# end
|
142
|
+
def add_module module_container, options={}
|
143
|
+
raise ArgumentError, "Can't add module without module container!" unless module_container
|
144
|
+
options.assert_valid_keys(:controller,:route,:model,:path,:name,:nested)
|
145
|
+
name=options[:name]||module_container.to_s.to_sym
|
146
|
+
self.modules<<module_container
|
147
|
+
|
148
|
+
if options.has_key?(:route)
|
149
|
+
self.routes[name]=[options.has_key?(:nested) ? options[:nested] : true,options[:route]]
|
150
|
+
end
|
151
|
+
self.controllers[name]=options[:controller] if options.has_key?(:controller)
|
152
|
+
|
153
|
+
if options[:path]
|
154
|
+
require File.join(options[:path],name.to_s)
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
data/lib/lolita.rb
CHANGED
@@ -42,7 +42,11 @@ module Lolita
|
|
42
42
|
module Builder
|
43
43
|
autoload(:Custom, 'lolita/builder')
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
|
+
module SystemConfiguration
|
47
|
+
autoload :Base, 'lolita/system_configuration/base'
|
48
|
+
autoload :Application, 'lolita/system_configuration/application'
|
49
|
+
end
|
46
50
|
|
47
51
|
module Adapter
|
48
52
|
autoload :AbstractAdapter, 'lolita/adapter/abstract_adapter'
|
@@ -146,7 +150,7 @@ module Lolita
|
|
146
150
|
|
147
151
|
def self.scope name=nil
|
148
152
|
name||=scope_name
|
149
|
-
@@scopes[name]||=Lolita::
|
153
|
+
@@scopes[name]||=Lolita::SystemConfiguration::Base.new(name)
|
150
154
|
@@scopes[name]
|
151
155
|
end
|
152
156
|
|