puffer 0.0.29 → 0.0.30
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 +1 -0
- data/Gemfile.lock +56 -52
- data/README.md +51 -43
- data/VERSION +1 -1
- data/app/assets/javascripts/puffer/application.js +3 -1
- data/app/assets/stylesheets/puffer/application.css +2 -0
- data/app/assets/stylesheets/puffer/puffer.css +5 -9
- data/app/components/base_component.rb +0 -1
- data/app/components/boolean/index.html.erb +1 -1
- data/app/components/boolean_component.rb +1 -1
- data/app/components/references_many/index.html.erb +1 -0
- data/app/components/references_many_component.rb +8 -0
- data/app/components/references_one_component.rb +6 -1
- data/app/components/select/filter.html.erb +2 -0
- data/app/components/select/form.html.erb +1 -1
- data/app/components/select_component.rb +13 -2
- data/app/controllers/admin/puffer_users_controller.rb +5 -1
- data/app/controllers/admin/sessions_controller.rb +4 -1
- data/app/controllers/puffer/base.rb +1 -1
- data/app/controllers/puffer/sessions_base.rb +3 -0
- data/app/controllers/puffer/tree_base.rb +4 -4
- data/app/helpers/puffer_helper.rb +16 -15
- data/app/models/puffer/puffer_user.rb +11 -10
- data/app/models/puffer_user.rb +14 -2
- data/app/views/layouts/puffer.html.erb +16 -17
- data/app/views/layouts/puffer_base.html.erb +1 -2
- data/app/views/layouts/puffer_dashboard.html.erb +2 -2
- data/app/views/puffer/base/edit.html.erb +12 -3
- data/app/views/puffer/base/new.html.erb +12 -3
- data/app/views/puffer/dashboard_base/index.html.erb +5 -5
- data/lib/generators/puffer/component/component_generator.rb +0 -1
- data/lib/generators/puffer/controller/controller_generator.rb +1 -1
- data/lib/generators/puffer/controller/templates/controller.rb +8 -0
- data/lib/puffer.rb +77 -13
- data/lib/puffer/component.rb +14 -9
- data/lib/puffer/controller/auth.rb +41 -2
- data/lib/puffer/controller/config.rb +1 -1
- data/lib/puffer/controller/mutate.rb +15 -6
- data/lib/puffer/extensions/core.rb +4 -0
- data/lib/puffer/extensions/directive_processor.rb +36 -0
- data/lib/puffer/extensions/form.rb +1 -1
- data/lib/puffer/extensions/mapper.rb +74 -149
- data/lib/puffer/field.rb +2 -4
- data/lib/puffer/field_set.rb +3 -15
- data/lib/puffer/filters.rb +105 -0
- data/lib/puffer/orm_adapter/active_record.rb +33 -0
- data/lib/puffer/orm_adapter/base.rb +4 -0
- data/lib/puffer/orm_adapter/mongoid.rb +29 -0
- data/lib/puffer/resource.rb +63 -62
- data/lib/puffer/resource/node.rb +71 -0
- data/lib/puffer/resource/routing.rb +4 -4
- data/lib/puffer/resource/tree.rb +36 -0
- data/puffer.gemspec +28 -8
- data/spec/dummy/app/controllers/admin/posts_controller.rb +1 -1
- data/spec/dummy/app/controllers/admin/users_controller.rb +1 -0
- data/spec/dummy/app/controllers/application_controller.rb +4 -0
- data/spec/dummy/app/controllers/orms/active_record_orm_primals_controller.rb +36 -0
- data/spec/dummy/app/controllers/orms/mongoid_orm_primals_controller.rb +42 -0
- data/spec/dummy/app/models/active_record_orm.rb +5 -0
- data/spec/dummy/app/models/active_record_orm/primal.rb +2 -0
- data/spec/dummy/app/models/{mongoid_test.rb → mongoid_orm.rb} +1 -1
- data/spec/dummy/app/models/mongoid_orm/primal.rb +46 -0
- data/spec/dummy/config/environments/development.rb +3 -0
- data/spec/dummy/config/routes.rb +2 -1
- data/spec/dummy/db/migrate/20110930183902_create_active_record_orm_primals.rb +17 -0
- data/spec/dummy/db/schema.rb +15 -1
- data/spec/fabricators/active_record_orm/primal.rb +13 -0
- data/spec/fabricators/mongoid_orm/primal.rb +12 -0
- data/spec/generators/puffer/component/component_generator_spec.rb +32 -0
- data/spec/generators/puffer/controller/controller_generator_spec.rb +31 -0
- data/spec/helpers/puffer_helper_spec.rb +62 -0
- data/spec/lib/filters_spec.rb +21 -0
- data/spec/lib/orm_adapter/active_record_spec.rb +33 -0
- data/spec/lib/orm_adapter/base_shared.rb +97 -0
- data/spec/lib/orm_adapter/mongoid_spec.rb +46 -0
- data/spec/lib/resource/routing_spec.rb +5 -5
- data/spec/lib/resource/tree_spec.rb +31 -0
- data/spec/lib/resource_spec.rb +36 -37
- data/spec/spec_helper.rb +3 -2
- metadata +71 -43
- data/app/views/puffer/base/_form.html.erb +0 -11
- data/lib/generators/puffer/component/templates/component_spec.rb +0 -19
- data/lib/puffer/resource/scoping.rb +0 -19
- data/spec/dummy/app/controllers/orms/mongoid_tests_controller.rb +0 -19
- data/spec/lib/params_spec.rb +0 -120
@@ -5,8 +5,13 @@ class ReferencesOneComponent < Puffer::Component::Base
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def choose
|
8
|
-
|
8
|
+
#@records = field.reflection.klass.includes(field.children.includes).where(field.children.searches(params[:search])).page(params[:page])
|
9
|
+
@records = field.reflection.klass.to_adapter.filter(field.reflection.klass, field.children, :search => params[:puffer_search]).page(params[:page])
|
9
10
|
render
|
10
11
|
end
|
11
12
|
|
13
|
+
def filter
|
14
|
+
|
15
|
+
end
|
16
|
+
|
12
17
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<% content_for :input do %>
|
2
|
-
<%= opts[:form].select field, @options, {:include_blank => field.options[:include_blank]}, field.input_options %>
|
2
|
+
<%= opts[:form].select field, @options, {:include_blank => field.options.key?(:include_blank) ? field.options[:include_blank] : true }, field.input_options %>
|
3
3
|
<% end %>
|
4
4
|
|
5
5
|
<%= render :file => 'base/form' %>
|
@@ -1,7 +1,19 @@
|
|
1
1
|
class SelectComponent < BaseComponent
|
2
2
|
|
3
3
|
def form
|
4
|
-
@options =
|
4
|
+
@options = select_options
|
5
|
+
super
|
6
|
+
end
|
7
|
+
|
8
|
+
def filter
|
9
|
+
@options = select_options
|
10
|
+
render
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def select_options
|
16
|
+
case field.options[:select]
|
5
17
|
when Symbol then
|
6
18
|
parent_controller.view_context.send field.options[:select]
|
7
19
|
when Proc then
|
@@ -9,7 +21,6 @@ class SelectComponent < BaseComponent
|
|
9
21
|
else
|
10
22
|
field.options[:select]
|
11
23
|
end
|
12
|
-
super
|
13
24
|
end
|
14
25
|
|
15
26
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# Implemented basic rails auth with custom PufferUser model.
|
2
|
+
# Admin::SessionsController could be redefined in application.
|
3
|
+
# See Puffer::SessionsBase docs for additional info.
|
1
4
|
class Admin::SessionsController < Puffer::SessionsBase
|
2
5
|
|
3
6
|
def new
|
@@ -5,7 +8,7 @@ class Admin::SessionsController < Puffer::SessionsBase
|
|
5
8
|
end
|
6
9
|
|
7
10
|
def create
|
8
|
-
@record = PufferUser.
|
11
|
+
@record = PufferUser.to_adapter.find_first(:conditions => {:email => params[:puffer_user][:email]})
|
9
12
|
if @record && @record.authenticate(params[:puffer_user][:password])
|
10
13
|
session[:puffer_user_id] = @record.id
|
11
14
|
redirect_to admin_root_url
|
@@ -1,3 +1,6 @@
|
|
1
|
+
# Puffer::SessionsBase is a base class for any Admin::SessionsController
|
2
|
+
# implementation by default implemented basic auth through PufferUser.
|
3
|
+
# See Puffer::SessionsDeviseBase for alternative implementation example.
|
1
4
|
class Puffer::SessionsBase < ApplicationController
|
2
5
|
unloadable
|
3
6
|
pufferize!
|
@@ -7,8 +7,8 @@ module Puffer
|
|
7
7
|
define_fieldset :tree, :fallbacks => :index
|
8
8
|
|
9
9
|
def index
|
10
|
-
return super if
|
11
|
-
@records = resource.collection_scope
|
10
|
+
return super if puffer_filters.any?
|
11
|
+
@records = resource.collection_scope
|
12
12
|
if session[:expanded].present?
|
13
13
|
@records = @records.where(["depth in (0, 1) or parent_id in (#{session[:expanded].join(', ')})"]).arrange
|
14
14
|
else
|
@@ -34,7 +34,7 @@ module Puffer
|
|
34
34
|
session[:expanded] ||= []
|
35
35
|
session[:expanded].push params[:id] if @parent
|
36
36
|
session[:expanded].uniq!
|
37
|
-
@records = @parent.self_and_descendants.where(:parent_id => [@parent.parent_id] + session[:expanded])
|
37
|
+
@records = resource.model.to_adapter.filter(@parent.self_and_descendants.where(:parent_id => [@parent.parent_id] + session[:expanded]), tree_fields).arrange
|
38
38
|
render 'toggle'
|
39
39
|
end
|
40
40
|
|
@@ -42,7 +42,7 @@ module Puffer
|
|
42
42
|
@parent = resource.member
|
43
43
|
session[:expanded] ||= []
|
44
44
|
session[:expanded].delete params[:id]
|
45
|
-
@records = resource.collection_scope.where(:id => [@parent.id])
|
45
|
+
@records = resource.model.to_adapter.filter(resource.collection_scope.where(:id => [@parent.id]), tree_fields).arrange
|
46
46
|
render 'toggle'
|
47
47
|
end
|
48
48
|
|
@@ -1,25 +1,26 @@
|
|
1
1
|
module PufferHelper
|
2
2
|
|
3
|
-
def
|
4
|
-
Rails.application.routes.
|
5
|
-
yield
|
3
|
+
def puffer_scopes_navigation
|
4
|
+
Rails.application.routes.resources_tree.map(&:scope).uniq.each do |scope|
|
5
|
+
yield scope, send("#{scope}_root_path"), scope == puffer_namespace
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
10
|
-
Rails.application.routes.
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
yield
|
9
|
+
def puffer_groups_navigation namespace = puffer_namespace
|
10
|
+
Rails.application.routes.resources_tree.roots.select {|node| node.controller.model && node.scope == namespace}.uniq_by(&:group).each do |resource_node|
|
11
|
+
path = send("#{resource_node.url_string}_path")
|
12
|
+
current = resource.resource_node ? resource.root.resource_node.group == resource_node.group : false
|
13
|
+
|
14
|
+
yield resource_node.group, path, current
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
20
|
-
title = controller.model.model_name.human
|
21
|
-
path =
|
22
|
-
current =
|
18
|
+
def puffer_resources_navigation namespace = puffer_namespace, group = configuration.group
|
19
|
+
Rails.application.routes.resources_tree.roots.select {|node| node.controller.model && node.scope == namespace && node.group == group}.each do |resource_node|
|
20
|
+
title = resource_node.controller.model.model_name.human
|
21
|
+
path = send("#{resource_node.url_string}_path")
|
22
|
+
current = resource.resource_node ? resource.root.resource_node == resource_node : false
|
23
|
+
|
23
24
|
yield title, path, current
|
24
25
|
end
|
25
26
|
end
|
@@ -41,7 +42,7 @@ module PufferHelper
|
|
41
42
|
res = record.call_chain(field.to_s)
|
42
43
|
end
|
43
44
|
unless field.native?
|
44
|
-
url = edit_polymorphic_path [resource.
|
45
|
+
url = edit_polymorphic_path [resource.scope, record.call_chain(field.path)] rescue nil
|
45
46
|
res = link_to res, url if url
|
46
47
|
end
|
47
48
|
res
|
@@ -1,24 +1,25 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Puffer::PufferUser
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
include ActiveModel::SecurePassword
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
included do
|
6
|
+
attr_protected :password_digest
|
7
|
+
has_secure_password
|
7
8
|
|
8
|
-
|
9
|
-
|
9
|
+
validates :email, :uniqueness => true, :presence => true
|
10
|
+
validates :password, :presence => true, :length => { :minimum => 6 }, :on => :create
|
11
|
+
end
|
10
12
|
|
11
|
-
def roles= value
|
13
|
+
def roles= value = []
|
12
14
|
value = value.split(',').map(&:strip).map(&:presence) if value.is_a?(String)
|
13
15
|
write_attribute(:roles, value.join(', '))
|
14
16
|
end
|
15
17
|
|
16
18
|
def roles_array
|
17
|
-
roles.split(',').map(&:strip).map(&:presence)
|
19
|
+
roles.to_s.split(',').map(&:strip).map(&:presence)
|
18
20
|
end
|
19
21
|
|
20
22
|
def has_role? role
|
21
23
|
roles_array.include?(role.to_s)
|
22
24
|
end
|
23
|
-
|
24
25
|
end
|
data/app/models/puffer_user.rb
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
-
|
1
|
+
if defined?(Mongoid::Document)
|
2
|
+
class PufferUser
|
3
|
+
include Mongoid::Document
|
2
4
|
|
3
|
-
|
5
|
+
field :email, :type => String
|
6
|
+
field :password_digest, :type => String
|
7
|
+
field :roles, :type => String
|
8
|
+
|
9
|
+
include Puffer::PufferUser
|
10
|
+
end
|
11
|
+
elsif defined?(ActiveRecord::Base) && ActiveRecord::Base.connection.table_exists?('puffer_users')
|
12
|
+
class PufferUser < ActiveRecord::Base
|
13
|
+
include Puffer::PufferUser
|
14
|
+
end
|
15
|
+
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
<% content_for :header do %>
|
2
2
|
<ul class="namespaces">
|
3
|
-
<%
|
4
|
-
<li<%= raw(current ? ' class="selected"' : '') %>><%= link_to title, path %></li>
|
3
|
+
<% puffer_scopes_navigation do |title, path, current| %>
|
4
|
+
<li<%= raw(current ? ' class="selected"' : '') %>><%= link_to title.to_s.humanize, path %></li>
|
5
5
|
<% end %>
|
6
6
|
</ul>
|
7
7
|
<ul class="navigation">
|
8
|
-
<%
|
9
|
-
<li<%= raw(current ? ' class="selected"' : '') %>><%= link_to title, path %></li>
|
8
|
+
<% puffer_groups_navigation do |title, path, current| %>
|
9
|
+
<li<%= raw(current ? ' class="selected"' : '') %>><%= link_to title.to_s.humanize, path %></li>
|
10
10
|
<% end %>
|
11
11
|
</ul>
|
12
12
|
<% end %>
|
@@ -15,8 +15,8 @@
|
|
15
15
|
<div class="columns">
|
16
16
|
<div class="column sidebar">
|
17
17
|
<div class="padder">
|
18
|
-
<ul class="navigation">
|
19
|
-
<%
|
18
|
+
<ul class="navigation">
|
19
|
+
<% puffer_resources_navigation do |title, path, current| %>
|
20
20
|
<li<%= raw(current ? ' class="selected"' : '') %>>
|
21
21
|
<%= link_to title, path %>
|
22
22
|
<% if current %>
|
@@ -34,19 +34,18 @@
|
|
34
34
|
<% end %>
|
35
35
|
</p>
|
36
36
|
</dd>
|
37
|
-
<dt>Search</dt>
|
38
|
-
<dd>
|
39
|
-
<%= form_tag resource.collection_path, {:method => :get} do %>
|
40
|
-
<%= text_field_tag :search, params[:search] %>
|
41
|
-
<%= submit_tag 'Search' %>
|
42
37
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
38
|
+
<%= form_for puffer_filters, :url => resource.collection_path, :method => :get do |f| %>
|
39
|
+
<dt><%= f.label :puffer_search %></dt>
|
40
|
+
<dd><%= f.text_field :puffer_search %></dd>
|
41
|
+
|
42
|
+
<% index_fields.columns.each do |field| %>
|
43
|
+
<%= field.render controller, :filter, :form => f %>
|
48
44
|
<% end %>
|
49
|
-
|
45
|
+
|
46
|
+
<dd><%= submit_tag 'Search', :name => nil %></dd>
|
47
|
+
<% end %>
|
48
|
+
|
50
49
|
</dl>
|
51
50
|
</div>
|
52
51
|
<% end %>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% content_for :header do %>
|
2
2
|
<ul class="namespaces">
|
3
|
-
<%
|
4
|
-
<li<%= raw(current ? ' class="selected"' : '') %>><%= link_to title, path %></li>
|
3
|
+
<% puffer_scopes_navigation do |title, path, current| %>
|
4
|
+
<li<%= raw(current ? ' class="selected"' : '') %>><%= link_to title.to_s.humanize, path %></li>
|
5
5
|
<% end %>
|
6
6
|
</ul>
|
7
7
|
<% end %>
|
@@ -1,6 +1,15 @@
|
|
1
1
|
<% @title = "Edit #{resource.human}" %>
|
2
2
|
<h1><%= @title %></h1>
|
3
|
-
<%= form_for record, :url => resource.member_path
|
4
|
-
|
5
|
-
<%
|
3
|
+
<%= form_for record, :url => resource.member_path do |f| %>
|
4
|
+
<ul class="form">
|
5
|
+
<% update_fields.each do |field| -%>
|
6
|
+
<li><%= field.render controller, :update, :form => f, :record => f.object %></li>
|
7
|
+
<% end -%>
|
8
|
+
</ul>
|
6
9
|
|
10
|
+
<div class="buttons">
|
11
|
+
<%= f.submit t('puffer.save') %>
|
12
|
+
<%= f.submit t('puffer.save_and_exit') %>
|
13
|
+
<%= link_to 'cancel', (request.referer || resource.collectin_path) %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
@@ -1,6 +1,15 @@
|
|
1
1
|
<% @title = "New #{resource.human}" %>
|
2
2
|
<h1><%= @title %></h1>
|
3
|
-
<%= form_for record, :url => resource.collection_path
|
4
|
-
|
5
|
-
<%
|
3
|
+
<%= form_for record, :url => resource.collection_path do |f| %>
|
4
|
+
<ul class="form">
|
5
|
+
<% create_fields.each do |field| -%>
|
6
|
+
<li><%= field.render controller, :create, :form => f, :record => f.object %></li>
|
7
|
+
<% end -%>
|
8
|
+
</ul>
|
6
9
|
|
10
|
+
<div class="buttons">
|
11
|
+
<%= f.submit t('puffer.save') %>
|
12
|
+
<%= f.submit t('puffer.save_and_exit') %>
|
13
|
+
<%= link_to 'cancel', (request.referer || resource.collectin_path) %>
|
14
|
+
</div>
|
15
|
+
<% end %>
|
@@ -1,13 +1,13 @@
|
|
1
|
-
<%
|
2
|
-
<h2><%=
|
1
|
+
<% puffer_scopes_navigation do |scope| %>
|
2
|
+
<h2><%= scope.to_s.humanize %></h2>
|
3
3
|
<ul class="navigation">
|
4
|
-
<%
|
4
|
+
<% puffer_groups_navigation scope do |group| %>
|
5
5
|
<li>
|
6
6
|
<span><%= group.to_s.humanize %></span>
|
7
7
|
<ul class="additional">
|
8
|
-
<%
|
8
|
+
<% puffer_resources_navigation scope, group do |resource, url| %>
|
9
9
|
<li>
|
10
|
-
<%= link_to
|
10
|
+
<%= link_to resource, url %>
|
11
11
|
</li>
|
12
12
|
<% end %>
|
13
13
|
</ul>
|
@@ -5,7 +5,6 @@ class Puffer::ComponentGenerator < Rails::Generators::NamedBase
|
|
5
5
|
@name = name.underscore
|
6
6
|
|
7
7
|
template 'component.rb', "app/components/#{@name}_component.rb"
|
8
|
-
template 'component_spec.rb', "spec/app/components/#{@name}_component_spec.rb"
|
9
8
|
end
|
10
9
|
|
11
10
|
def generate_views
|
@@ -6,13 +6,21 @@ class <%= controller_name %>Controller < Puffer::Base
|
|
6
6
|
|
7
7
|
index do
|
8
8
|
<% attributes.each do |attribute| -%>
|
9
|
+
<% if %w(_id id _type type created_at updated_at).include?(attribute.to_s) -%>
|
10
|
+
# field :<%= attribute %>
|
11
|
+
<% else -%>
|
9
12
|
field :<%= attribute %>
|
13
|
+
<% end -%>
|
10
14
|
<% end -%>
|
11
15
|
end
|
12
16
|
|
13
17
|
form do
|
14
18
|
<% attributes.each do |attribute| -%>
|
19
|
+
<% if %w(_id id _type type created_at updated_at).include?(attribute.to_s) -%>
|
20
|
+
# field :<%= attribute %>
|
21
|
+
<% else -%>
|
15
22
|
field :<%= attribute %>
|
23
|
+
<% end -%>
|
16
24
|
<% end -%>
|
17
25
|
end
|
18
26
|
|
data/lib/puffer.rb
CHANGED
@@ -11,11 +11,18 @@ require 'puffer/extensions/controller'
|
|
11
11
|
require 'puffer/extensions/core'
|
12
12
|
require 'puffer/extensions/mapper'
|
13
13
|
require 'puffer/extensions/form'
|
14
|
+
require 'puffer/extensions/directive_processor'
|
14
15
|
require 'puffer/extensions/engine'
|
15
16
|
require 'puffer/engine'
|
16
17
|
|
17
18
|
module Puffer
|
18
19
|
|
20
|
+
class PufferError < StandardError
|
21
|
+
end
|
22
|
+
|
23
|
+
class ComponentMissing < PufferError
|
24
|
+
end
|
25
|
+
|
19
26
|
module Controller
|
20
27
|
autoload :Action, 'puffer/controller/actions'
|
21
28
|
autoload :MemberAction, 'puffer/controller/actions'
|
@@ -24,24 +31,81 @@ module Puffer
|
|
24
31
|
|
25
32
|
module Component
|
26
33
|
autoload :Base, 'puffer/component'
|
34
|
+
end
|
27
35
|
|
28
|
-
|
29
|
-
|
36
|
+
# Puffer has two types of mappings. If maps <tt>field.type</tt> to component
|
37
|
+
# class and also maps field attributes to <tt>field.type</tt>
|
38
|
+
mattr_accessor :_component_mappings
|
39
|
+
self._component_mappings = {}
|
40
|
+
|
41
|
+
# Maps <tt>field.type</tt> to component class
|
42
|
+
#
|
43
|
+
# ex:
|
44
|
+
#
|
45
|
+
# Puffer.map_component :ckeditor, :rich, :text, :to => CkeditorComponent
|
46
|
+
#
|
47
|
+
# this declaration maps even text fields to use <tt>CkeditorComponent</tt> for
|
48
|
+
# rendering
|
49
|
+
def self.map_component *args
|
50
|
+
to = args.extract_options![:to]
|
51
|
+
args.each { |type| _component_mappings[type.to_sym] = to }
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.component_for field
|
55
|
+
type = field
|
56
|
+
type = field.type if field.respond_to? :type
|
57
|
+
(_component_mappings[type.to_sym] || "#{type}_component").to_s.camelize.constantize
|
58
|
+
rescue NameError
|
59
|
+
raise ComponentMissing, "Missing `#{type}` component for `#{field}` field. Please use Puffer.map_component binding or specify field type manually"
|
60
|
+
end
|
61
|
+
|
62
|
+
map_component :belongs_to, :has_one, :to => :ReferencesOneComponent
|
63
|
+
map_component :has_many, :has_and_belongs_to_many, :to => :ReferencesManyComponent
|
64
|
+
map_component :date, :time, :datetime, :date_time, :timestamp, :to => :DateTimeComponent
|
65
|
+
map_component :integer, :float, :decimal, :big_decimal, :to => :StringComponent
|
66
|
+
map_component :"mongoid/fields/serializable/object", :"bson/object_id", :symbol, :array, :hash, :set, :range, :to => :StringComponent
|
30
67
|
|
31
|
-
def self.map_component *args
|
32
|
-
to = args.extract_options![:to]
|
33
|
-
args.each { |type| _mappings[type.to_sym] = to }
|
34
|
-
end
|
35
68
|
|
36
|
-
|
37
|
-
|
69
|
+
|
70
|
+
|
71
|
+
mattr_accessor :_field_type_customs
|
72
|
+
self._field_type_customs = []
|
73
|
+
|
74
|
+
|
75
|
+
# Appends or prepends custom type.
|
76
|
+
#
|
77
|
+
# ex:
|
78
|
+
#
|
79
|
+
# Puffer.append_custom_field_type :paperclip do |field|
|
80
|
+
# field.model.respond_to?(:attachment_definitions)
|
81
|
+
# && field.model.attachment_definitions.key?(:field.field_name.to_sym)
|
82
|
+
# end
|
83
|
+
def self.prepend_custom_field_type custom_type, &block
|
84
|
+
_field_type_customs.shift [custom_type, block]
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.append_custom_field_type custom_type, &block
|
88
|
+
_field_type_customs.push [custom_type, block]
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.field_type_for field
|
92
|
+
custom_type = swallow_nil{_field_type_customs.detect {|(type, block)| block.call(field) }.first}
|
93
|
+
case custom_type
|
94
|
+
when Proc then
|
95
|
+
custom_type.call(field)
|
96
|
+
else
|
97
|
+
custom_type
|
38
98
|
end
|
99
|
+
end
|
39
100
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
101
|
+
append_custom_field_type :select do |field|
|
102
|
+
field.options.key? :select
|
103
|
+
end
|
104
|
+
append_custom_field_type :password do |field|
|
105
|
+
field.name =~ /password/
|
106
|
+
end
|
107
|
+
append_custom_field_type(proc {|type| type.reflection.macro}) do |field|
|
108
|
+
field.reflection
|
45
109
|
end
|
46
110
|
|
47
111
|
end
|