puffer 0.0.32 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +7 -0
- data/Gemfile +1 -26
- data/Gemfile.lock +66 -64
- data/README.md +34 -23
- data/Rakefile +1 -11
- data/VERSION +1 -1
- data/app/assets/javascripts/puffer/application.js +6 -1
- data/app/assets/javascripts/puffer/associations.js +18 -0
- data/app/assets/javascripts/puffer/puffer.js +7 -0
- data/app/assets/javascripts/puffer/right-calendar-src.js +19 -3
- data/app/assets/javascripts/puffer/right-dnd-src.js +591 -0
- data/app/assets/javascripts/puffer/right-in-edit-src.js +373 -0
- data/app/assets/javascripts/puffer/right-keys-src.js +87 -0
- data/app/assets/javascripts/puffer/{paginator.js → right-paginator-src.js} +0 -0
- data/app/assets/javascripts/puffer/right-slider-src.js +29 -32
- data/app/assets/javascripts/puffer/right-sortable-src.js +430 -0
- data/app/assets/javascripts/puffer/right-src.js +358 -99
- data/app/assets/stylesheets/puffer/puffer.css +29 -4
- data/app/components/base/form.html.erb +8 -14
- data/app/components/base_component.rb +1 -1
- data/app/components/boolean/form.html.erb +5 -3
- data/app/components/boolean/index.html.erb +6 -2
- data/app/components/boolean_component.rb +2 -2
- data/app/components/date_time/filter.html.erb +9 -0
- data/app/components/date_time/form.html.erb +8 -4
- data/app/components/date_time_component.rb +21 -5
- data/app/components/file/form.html.erb +8 -4
- data/app/components/hidden/form.html.erb +3 -1
- data/app/components/nested_attributes_many/form.html.erb +47 -0
- data/app/components/nested_attributes_many_component.rb +7 -0
- data/app/components/nested_attributes_one/form.html.erb +48 -0
- data/app/components/nested_attributes_one_component.rb +7 -0
- data/app/components/password/form.html.erb +8 -4
- data/app/components/password_component.rb +1 -1
- data/app/components/references_many/index.html.erb +1 -1
- data/app/components/references_one/choose.html.erb +1 -1
- data/app/components/references_one/form.html.erb +10 -9
- data/app/components/references_one_component.rb +0 -1
- data/app/components/render_component.rb +13 -0
- data/app/components/select/filter.html.erb +4 -2
- data/app/components/select/form.html.erb +8 -4
- data/app/components/text/form.html.erb +8 -4
- data/app/controllers/admin/sessions_controller.rb +1 -21
- data/app/controllers/puffer/base.rb +10 -3
- data/app/controllers/puffer/dashboard_base.rb +7 -1
- data/app/controllers/puffer/{sessions_base.rb → sessions/base.rb} +10 -7
- data/app/controllers/puffer/sessions/clearance.rb +29 -0
- data/app/controllers/puffer/{sessions_devise_base.rb → sessions/devise.rb} +1 -1
- data/app/controllers/puffer/sessions/simple.rb +28 -0
- data/app/controllers/puffer/tree_base.rb +1 -1
- data/app/models/puffer_user.rb +3 -0
- data/app/views/layouts/puffer.html.erb +3 -3
- data/app/views/puffer/base/_edit.html.erb +15 -0
- data/app/views/puffer/base/_index.html.erb +26 -0
- data/app/views/puffer/base/_show.html.erb +13 -0
- data/app/views/puffer/base/_table.html.erb +1 -1
- data/app/views/puffer/base/edit.html.erb +1 -15
- data/app/views/puffer/base/edit.js.erb +1 -0
- data/app/views/puffer/base/index.html.erb +1 -20
- data/app/views/puffer/base/index.js.erb +1 -0
- data/app/views/puffer/base/new.html.erb +1 -1
- data/app/views/puffer/base/show.html.erb +1 -22
- data/app/views/puffer/base/show.js.erb +1 -0
- data/app/views/puffer/base/update.js.erb +1 -0
- data/app/views/puffer/sessions/base/new.html.erb +11 -0
- data/app/views/puffer/tree_base/_record.html.erb +1 -1
- data/lib/puffer/component.rb +14 -47
- data/lib/puffer/controller/auth.rb +13 -9
- data/lib/puffer/controller/config.rb +18 -0
- data/lib/puffer/controller/mutate.rb +8 -8
- data/lib/puffer/engine.rb +5 -0
- data/lib/puffer/field.rb +5 -11
- data/lib/puffer/filters.rb +86 -56
- data/lib/puffer/helpers/component_helper.rb +24 -0
- data/lib/puffer/helpers/puffer_helper.rb +65 -0
- data/lib/puffer/helpers/puffer_tree_helper.rb +19 -0
- data/lib/puffer/orm_adapter/active_record.rb +40 -11
- data/lib/puffer/orm_adapter/base.rb +9 -0
- data/lib/puffer/orm_adapter/mongoid.rb +32 -9
- data/lib/puffer/resource/node.rb +2 -2
- data/lib/puffer/resource/routing.rb +30 -16
- data/lib/puffer/resource.rb +20 -20
- data/lib/puffer/version.rb +3 -0
- data/lib/puffer.rb +26 -5
- data/puffer.gemspec +34 -296
- data/spec/app/components/base_component_spec.rb +1 -1
- data/spec/app/components/boolean_component_spec.rb +2 -0
- data/spec/app/components/date_time_component_spec.rb +1 -0
- data/spec/app/components/file_component_spec.rb +1 -0
- data/spec/app/components/hidden_component_spec.rb +1 -0
- data/spec/app/components/password_component_spec.rb +2 -0
- data/spec/app/components/select_component_spec.rb +1 -0
- data/spec/app/components/string_component_spec.rb +1 -0
- data/spec/app/components/text_component_spec.rb +1 -0
- data/spec/dummy/app/controllers/admin/news_controller.rb +2 -0
- data/spec/dummy/app/controllers/admin/profiles_controller.rb +1 -1
- data/spec/dummy/app/controllers/admin/users_controller.rb +2 -0
- data/spec/dummy/app/controllers/orms/active_record_orm_primals_controller.rb +8 -0
- data/spec/dummy/app/helpers/news_helper.rb +7 -0
- data/spec/dummy/app/models/active_record_orm/has_many_reference.rb +5 -0
- data/spec/dummy/app/models/active_record_orm/has_one_reference.rb +5 -0
- data/spec/dummy/app/models/active_record_orm/primal.rb +4 -0
- data/spec/dummy/config/environments/development.rb +1 -1
- data/spec/dummy/db/migrate/20111120144025_create_active_record_orm_has_one_references.rb +10 -0
- data/spec/dummy/db/migrate/20111122203304_create_active_record_orm_has_many_references.rb +10 -0
- data/spec/dummy/db/schema.rb +15 -1
- data/spec/helpers/puffer_helper_spec.rb +1 -1
- data/spec/lib/fields_spec.rb +0 -9
- data/spec/lib/filters_spec.rb +4 -8
- data/spec/lib/orm_adapter/base_shared.rb +22 -0
- data/spec/spec_helper.rb +1 -1
- metadata +89 -60
- data/app/components/string/form.html.erb +0 -5
- data/app/helpers/puffer_helper.rb +0 -51
- data/app/helpers/puffer_tree_helper.rb +0 -15
- data/app/views/puffer/sessions_base/new.html.erb +0 -11
- data/lib/puffer/extensions/form.rb +0 -16
@@ -20,15 +20,15 @@ a:hover
|
|
20
20
|
text-decoration: none;
|
21
21
|
}
|
22
22
|
|
23
|
-
h1
|
23
|
+
h1, h1 *
|
24
24
|
{
|
25
|
-
font-size: 21px;
|
25
|
+
font-size: 21px !important;
|
26
26
|
margin-bottom: 10px;
|
27
27
|
}
|
28
28
|
|
29
|
-
h2
|
29
|
+
h2, h2 *
|
30
30
|
{
|
31
|
-
font-size: 17px;
|
31
|
+
font-size: 17px !important;
|
32
32
|
margin-bottom: 10px;
|
33
33
|
}
|
34
34
|
|
@@ -168,6 +168,11 @@ h2
|
|
168
168
|
margin-bottom: 8px;
|
169
169
|
}
|
170
170
|
|
171
|
+
.sidebar .navigation > li .additional dd.date_range input[type=text]
|
172
|
+
{
|
173
|
+
width: 48%;
|
174
|
+
}
|
175
|
+
|
171
176
|
.sidebar .navigation > li .additional, .dashboard .navigation > li ul.additional
|
172
177
|
{
|
173
178
|
padding: 10px 12px;
|
@@ -273,6 +278,8 @@ h2
|
|
273
278
|
.list_table *
|
274
279
|
{
|
275
280
|
font-size: 8pt;
|
281
|
+
margin: 0;
|
282
|
+
padding: 0;
|
276
283
|
}
|
277
284
|
|
278
285
|
.list_table tr
|
@@ -412,6 +419,13 @@ select
|
|
412
419
|
height: 60px;
|
413
420
|
}
|
414
421
|
|
422
|
+
.nested_attributes li
|
423
|
+
{
|
424
|
+
border-left: 1px solid #ccc;
|
425
|
+
padding-left: 20px;
|
426
|
+
margin-bottom: 15px;
|
427
|
+
}
|
428
|
+
|
415
429
|
.field_error
|
416
430
|
{
|
417
431
|
color: #C83E3E;
|
@@ -464,3 +478,14 @@ select
|
|
464
478
|
{
|
465
479
|
display: block;
|
466
480
|
}
|
481
|
+
|
482
|
+
.show_entry
|
483
|
+
{
|
484
|
+
min-width: 900px;
|
485
|
+
}
|
486
|
+
|
487
|
+
.show_entry li
|
488
|
+
{
|
489
|
+
list-style: none;
|
490
|
+
margin-bottom: 10px;
|
491
|
+
}
|
@@ -1,15 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
<% end unless content_for? :error %>
|
8
|
-
|
9
|
-
<div class="label">
|
10
|
-
<%= yield :label %>
|
11
|
-
<div class="field_error">
|
12
|
-
<%= yield :error %>
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<div class="label">
|
3
|
+
<%= f.label field %>
|
4
|
+
<div class="field_error">
|
5
|
+
<%= f.object.errors[field.name.to_sym].first %>
|
6
|
+
</div>
|
13
7
|
</div>
|
14
|
-
|
15
|
-
|
8
|
+
<%= f.text_field field, field.input_options %>
|
9
|
+
<% end %>
|
@@ -1,3 +1,5 @@
|
|
1
|
-
<%=
|
2
|
-
<%=
|
3
|
-
<%=
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<%= f.check_box field, field.input_options %>
|
3
|
+
<%= f.label field %>
|
4
|
+
<%= @record.errors[field.name.to_sym].first %>
|
5
|
+
<% end %>
|
@@ -1,3 +1,7 @@
|
|
1
|
-
|
2
|
-
<%=
|
1
|
+
<% if field.options[:editable] && field.column %>
|
2
|
+
<%= component_wrap do %>
|
3
|
+
<%= link_to @record.call_chain(field.to_s) ? 'True' : 'False', event_path(:change, :id => @record.to_param), :remote => true %>
|
4
|
+
<% end %>
|
5
|
+
<% else %>
|
6
|
+
<%= check_box_tag '', '', @record.call_chain(field.to_s), :disabled => true %>
|
3
7
|
<% end %>
|
@@ -5,8 +5,8 @@ class BooleanComponent < BaseComponent
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def change
|
8
|
-
|
9
|
-
|
8
|
+
@record = resource.member
|
9
|
+
@record.update_attributes field.to_s => !@record.call_chain(field.to_s)
|
10
10
|
replace :index
|
11
11
|
end
|
12
12
|
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<dt><%= f.label field.field_name %></dt>
|
3
|
+
<dd class="date_range">
|
4
|
+
<%= f.fields_for field.to_s do |fields| %>
|
5
|
+
<%= fields.text_field :from, field.input_options.merge("data-calendar" => "{showButtons: true, listYears: true, format: '#{@format}'}", :autocomplete => :off) %>
|
6
|
+
<%= fields.text_field :till, field.input_options.merge("data-calendar" => "{showButtons: true, listYears: true, format: '#{@format}'}", :autocomplete => :off) %>
|
7
|
+
<% end %>
|
8
|
+
</dd>
|
9
|
+
<% end %>
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<div class="label">
|
3
|
+
<%= f.label field %>
|
4
|
+
<div class="field_error">
|
5
|
+
<%= @record.errors[field.name.to_sym].first %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= f.text_field field, field.input_options.merge("data-calendar" => "{showButtons: true, listYears: true, format: '#{@format}'}", :autocomplete => :off) %>
|
3
9
|
<% end %>
|
4
|
-
|
5
|
-
<%= render :file => 'base/form' %>
|
@@ -1,12 +1,28 @@
|
|
1
1
|
class DateTimeComponent < BaseComponent
|
2
2
|
|
3
|
+
def index
|
4
|
+
date = super
|
5
|
+
date.to_s(field.options[:format].presence || :db) if date.present?
|
6
|
+
end
|
7
|
+
|
3
8
|
def form
|
4
|
-
@format =
|
5
|
-
|
6
|
-
|
7
|
-
|
9
|
+
@format = time_format
|
10
|
+
render
|
11
|
+
end
|
12
|
+
|
13
|
+
def filter
|
14
|
+
@format = time_format
|
15
|
+
render
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def time_format
|
21
|
+
@format ||= case field.type
|
22
|
+
when :date then '%Y-%m-%d'
|
23
|
+
when :time then '%H:%M:%S'
|
24
|
+
when :datetime, :date_time, :timestamp then '%Y-%m-%d %H:%M:%S'
|
8
25
|
end
|
9
|
-
super
|
10
26
|
end
|
11
27
|
|
12
28
|
end
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<div class="label">
|
3
|
+
<%= f.label field %>
|
4
|
+
<div class="field_error">
|
5
|
+
<%= @record.errors[field.name.to_sym].first %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= f.file_field field, field.input_options %>
|
3
9
|
<% end %>
|
4
|
-
|
5
|
-
<%= render :file => 'base/form' %>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<h2><%= f.label field %></h2>
|
3
|
+
|
4
|
+
<ul class="nested_attributes" id="<%= "#{field.name}_nested_attributes" %>">
|
5
|
+
<% f.object.send(field.name).each_with_index do |nested_record, index| -%>
|
6
|
+
<%= f.fields_for field.name, nested_record, :child_index => index do |nested_builder| %>
|
7
|
+
<li id="<%= "#{field.name}_#{index}_attributes" %>">
|
8
|
+
<% field.children.each do |field| %>
|
9
|
+
<%= field.render :form, parent_controller, nested_builder.object, :builder => nested_builder %>
|
10
|
+
<% end %>
|
11
|
+
<%= nested_builder.hidden_field :id if nested_builder.object.persisted? %>
|
12
|
+
|
13
|
+
<% destroy_nested_record = capture do %>
|
14
|
+
<%= nested_builder.hidden_field :_destroy, :value => true %>
|
15
|
+
<%= nested_builder.hidden_field :id %>
|
16
|
+
<% end.to_s.strip.gsub("\n", ' ') %>
|
17
|
+
|
18
|
+
<%= link_to t('.destroy'), '#',
|
19
|
+
:data => {:insert => {
|
20
|
+
:content => destroy_nested_record,
|
21
|
+
:element => "#{field.name}_marked_for_destroy",
|
22
|
+
:remove => "#{field.name}_#{index}_attributes"
|
23
|
+
}} %>
|
24
|
+
</li>
|
25
|
+
<% end %>
|
26
|
+
<% end -%>
|
27
|
+
</ul>
|
28
|
+
|
29
|
+
<div id="<%= field.name %>_marked_for_destroy" style="display: none">
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<% new_nested_record = capture do %>
|
33
|
+
<%= f.fields_for field.name, field.reflection.klass.new, :child_index => "new_nested_index" do |nested_builder| %>
|
34
|
+
<li id="<%= "#{field.name}_new_nested_index_attributes" %>">
|
35
|
+
<% field.children.each do |field| %>
|
36
|
+
<%= field.render :form, parent_controller, nested_builder.object, :builder => nested_builder %>
|
37
|
+
<% end %>
|
38
|
+
|
39
|
+
<%= link_to t('.destroy'), '#',
|
40
|
+
:data => {:insert => {:remove => "#{field.name}_new_nested_index_attributes"}} %>
|
41
|
+
</li>
|
42
|
+
<% end %>
|
43
|
+
<% end.to_s.strip.gsub("\n", ' ') %>
|
44
|
+
|
45
|
+
<%= link_to t('.add'), '#',
|
46
|
+
:data => {:insert => {:content => new_nested_record, :element => "#{field.name}_nested_attributes"}} %>
|
47
|
+
<% end %>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<h2><%= f.label field %></h2>
|
3
|
+
|
4
|
+
<ul class="nested_attributes" id="<%= "#{field.name}_nested_attributes" %>">
|
5
|
+
<% if f.object.send(field.name) -%>
|
6
|
+
<%= f.fields_for field.name do |nested_builder| %>
|
7
|
+
<li id="<%= "#{field.name}_attributes" %>">
|
8
|
+
<% field.children.each do |field| %>
|
9
|
+
<%= field.render :form, parent_controller, nested_builder.object, :builder => nested_builder %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% destroy_nested_record = capture do %>
|
13
|
+
<%= nested_builder.hidden_field :_destroy, :value => true %>
|
14
|
+
<%= nested_builder.hidden_field :id %>
|
15
|
+
<% end.to_s.strip.gsub("\n", ' ') %>
|
16
|
+
|
17
|
+
<%= link_to t('.destroy'), '#',
|
18
|
+
:data => {:insert => {
|
19
|
+
:content => destroy_nested_record,
|
20
|
+
:element => "#{field.name}_marked_for_destroy",
|
21
|
+
:remove => "#{field.name}_attributes",
|
22
|
+
:show => "#{field.name}_attributes_add"
|
23
|
+
}} %>
|
24
|
+
</li>
|
25
|
+
<% end %>
|
26
|
+
<% end -%>
|
27
|
+
</ul>
|
28
|
+
|
29
|
+
<div id="<%= field.name %>_marked_for_destroy" style="display: none">
|
30
|
+
</div>
|
31
|
+
|
32
|
+
<% new_nested_record = capture do %>
|
33
|
+
<%= f.fields_for field.name, field.reflection.klass.new do |nested_builder| %>
|
34
|
+
<li id="<%= "#{field.name}_attributes" %>">
|
35
|
+
<% field.children.each do |field| %>
|
36
|
+
<%= field.render :form, parent_controller, nested_builder.object, :builder => nested_builder %>
|
37
|
+
<% end %>
|
38
|
+
|
39
|
+
<%= link_to t('.destroy'), '#',
|
40
|
+
:data => {:insert => {:remove => "#{field.name}_attributes", :show => "#{field.name}_attributes_add"}} %>
|
41
|
+
</li>
|
42
|
+
<% end %>
|
43
|
+
<% end.to_s.strip.gsub("\n", ' ') %>
|
44
|
+
|
45
|
+
<%= link_to t('.add'), '#',
|
46
|
+
:style => ('display: none' if f.object.send(field.name)), :id => "#{field.name}_attributes_add",
|
47
|
+
:data => {:insert => {:content => new_nested_record, :element => "#{field.name}_nested_attributes", :hide => "#{field.name}_attributes_add"}} %>
|
48
|
+
<% end %>
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<div class="label">
|
3
|
+
<%= f.label field %>
|
4
|
+
<div class="field_error">
|
5
|
+
<%= @record.errors[field.name.to_sym].first %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= f.password_field field, field.input_options %>
|
3
9
|
<% end %>
|
4
|
-
|
5
|
-
<%= render :file => 'base/form' %>
|
@@ -1 +1 @@
|
|
1
|
-
<%= link_to field.human, resource.children_hash[field.name].collection_path %>
|
1
|
+
<%= link_to "#{field.human} (#{@record.send(field.to_s).size})", resource.children_hash[field.name].collection_path %>
|
@@ -5,5 +5,5 @@
|
|
5
5
|
<div id="paginator"></div>
|
6
6
|
|
7
7
|
<%= javascript_tag do %>
|
8
|
-
new Paginator({total: <%= records.num_pages %>, current: <%= params[:page] || 1 %>, link: {'data-dialog-uri': '<%= event_path(:choose, :page => '%{page}') %>'}}).insertTo('paginator', 'instead');
|
8
|
+
new Paginator({total: <%= @records.num_pages %>, current: <%= params[:page] || 1 %>, link: {'data-dialog-uri': '<%= event_path(:choose, :page => '%{page}') %>'}}).insertTo('paginator', 'instead');
|
9
9
|
<% end %>
|
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<div class="label">
|
3
|
+
<%= f.label field %>
|
4
|
+
<div class="field_error">
|
5
|
+
<%= @record.errors[field.reflection.foreign_key.to_sym].first ||
|
6
|
+
@record.errors[field.name.to_sym].first.presence %>
|
7
|
+
</div>
|
8
|
+
</div>
|
9
|
+
<%#= f.hidden_field field, field.input_options %>
|
10
|
+
<%= link_to "Choose", '#', :data => {"new-dialog-uri" => event_path(:choose)} %>
|
3
11
|
<% end %>
|
4
|
-
|
5
|
-
<% content_for :error do %>
|
6
|
-
<%= opts[:form].object.errors[field.reflection.foreign_key.to_sym].first ||
|
7
|
-
opts[:form].object.errors[field.name.to_sym].first.presence %>
|
8
|
-
<% end %>
|
9
|
-
|
10
|
-
<%= render :file => 'base/form' %>
|
@@ -5,7 +5,6 @@ class ReferencesOneComponent < Puffer::Component::Base
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def choose
|
8
|
-
#@records = field.reflection.klass.includes(field.children.includes).where(field.children.searches(params[:search])).page(params[:page])
|
9
8
|
@records = field.reflection.klass.to_adapter.filter(field.reflection.klass, field.children, :search => params[:puffer_search]).page(params[:page])
|
10
9
|
render
|
11
10
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class RenderComponent < Puffer::Component::Base
|
2
|
+
|
3
|
+
def action_missing name
|
4
|
+
case field.options[:render]
|
5
|
+
when Symbol then
|
6
|
+
view_context.send(field.options[:render])
|
7
|
+
when Proc then
|
8
|
+
field.options[:render].bind(view_context).call
|
9
|
+
else ''
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -1,2 +1,4 @@
|
|
1
|
-
|
2
|
-
<
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<dt><%= f.label field.field_name %></dt>
|
3
|
+
<dd><%= f.select field.field_name, @options, :include_blank => true %></dd>
|
4
|
+
<% end %>
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<div class="label">
|
3
|
+
<%= f.label field %>
|
4
|
+
<div class="field_error">
|
5
|
+
<%= @record.errors[field.name.to_sym].first %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= f.select field, @options, {:include_blank => field.options.key?(:include_blank) ? field.options[:include_blank] : true }, field.input_options %>
|
3
9
|
<% end %>
|
4
|
-
|
5
|
-
<%= render :file => 'base/form' %>
|
@@ -1,5 +1,9 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<%= component_fields_for @record do |f| %>
|
2
|
+
<div class="label">
|
3
|
+
<%= f.label field %>
|
4
|
+
<div class="field_error">
|
5
|
+
<%= @record.errors[field.name.to_sym].first %>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
<%= f.text_area field, field.input_options %>
|
3
9
|
<% end %>
|
4
|
-
|
5
|
-
<%= render :file => 'base/form' %>
|
@@ -1,26 +1,6 @@
|
|
1
1
|
# Implemented basic rails auth with custom PufferUser model.
|
2
2
|
# Admin::SessionsController could be redefined in application.
|
3
3
|
# See Puffer::SessionsBase docs for additional info.
|
4
|
-
class Admin::SessionsController < Puffer::
|
5
|
-
|
6
|
-
def new
|
7
|
-
@record = PufferUser.new
|
8
|
-
end
|
9
|
-
|
10
|
-
def create
|
11
|
-
@record = PufferUser.to_adapter.find_first(:conditions => {:email => params[:puffer_user][:email]})
|
12
|
-
if @record && @record.authenticate(params[:puffer_user][:password])
|
13
|
-
session[:puffer_user_id] = @record.id
|
14
|
-
redirect_to admin_root_url
|
15
|
-
else
|
16
|
-
@record = PufferUser.new :email => params[:puffer_user][:email]
|
17
|
-
render 'new'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def destroy
|
22
|
-
session.delete(:puffer_user_id)
|
23
|
-
redirect_to new_admin_session_url
|
24
|
-
end
|
4
|
+
class Admin::SessionsController < Puffer::Sessions::Simple
|
25
5
|
|
26
6
|
end
|
@@ -8,23 +8,30 @@ module Puffer
|
|
8
8
|
define_fieldset :index, :form
|
9
9
|
define_fieldset :show, :fallbacks => :index
|
10
10
|
define_fieldset :create, :update, :fallbacks => :form
|
11
|
+
define_fieldset :filter, :fallbacks => :index
|
12
|
+
|
13
|
+
layout 'puffer'
|
11
14
|
|
12
15
|
respond_to :html, :js
|
13
16
|
|
14
17
|
def index
|
15
18
|
@records = resource.collection.page(params[:page])
|
19
|
+
respond_with @records
|
16
20
|
end
|
17
21
|
|
18
22
|
def show
|
19
23
|
@record = resource.member
|
24
|
+
respond_with @record
|
20
25
|
end
|
21
26
|
|
22
27
|
def new
|
23
28
|
@record = resource.new_member
|
29
|
+
respond_with @record
|
24
30
|
end
|
25
31
|
|
26
32
|
def edit
|
27
33
|
@record = resource.member
|
34
|
+
respond_with @record
|
28
35
|
end
|
29
36
|
|
30
37
|
def create
|
@@ -42,17 +49,17 @@ module Puffer
|
|
42
49
|
def destroy
|
43
50
|
@record = resource.member
|
44
51
|
@record.destroy
|
45
|
-
|
52
|
+
respond_with @records, :location => (request.referrer || resource.collection_path)
|
46
53
|
end
|
47
54
|
|
48
55
|
def event
|
49
|
-
render :text => fields(params[:fieldset])[params[:field]].render(
|
56
|
+
render :text => fields(params[:fieldset])[params[:field]].render(params[:event], self)
|
50
57
|
end
|
51
58
|
|
52
59
|
private
|
53
60
|
|
54
61
|
def puffer_saving_location
|
55
|
-
params[:commit] == t('puffer.save') ? resource.edit_path(record) : resource.collection_path
|
62
|
+
@record.persisted? && params[:commit] == t('puffer.save') ? resource.edit_path(record) : resource.collection_path
|
56
63
|
end
|
57
64
|
|
58
65
|
end
|
@@ -1,31 +1,35 @@
|
|
1
1
|
# Puffer::SessionsBase is a base class for any Admin::SessionsController
|
2
2
|
# implementation by default implemented basic auth through PufferUser.
|
3
3
|
# See Puffer::SessionsDeviseBase for alternative implementation example.
|
4
|
-
class Puffer::
|
4
|
+
class Puffer::Sessions::Base < ApplicationController
|
5
5
|
unloadable
|
6
6
|
pufferize!
|
7
7
|
|
8
8
|
before_filter :require_puffer_user, :only => :destroy
|
9
9
|
|
10
|
-
define_fieldset :create
|
10
|
+
define_fieldset :create, :fallbacks => :form
|
11
11
|
|
12
12
|
layout 'puffer_sessions'
|
13
13
|
|
14
14
|
respond_to :html
|
15
15
|
|
16
|
+
setup do
|
17
|
+
group nil
|
18
|
+
end
|
19
|
+
|
16
20
|
create do
|
17
21
|
field :email, :type => :string
|
18
22
|
field :password, :type => :password
|
19
23
|
end
|
20
24
|
|
21
25
|
def new
|
22
|
-
# @record =
|
26
|
+
# @record = resource.new_member
|
23
27
|
end
|
24
28
|
|
25
29
|
def create
|
26
|
-
# @record =
|
30
|
+
# @record = resource.new_member
|
27
31
|
# if @record.save
|
28
|
-
#
|
32
|
+
# redirect_back_or admin_root_url
|
29
33
|
# else
|
30
34
|
# render 'new'
|
31
35
|
# end
|
@@ -33,7 +37,6 @@ class Puffer::SessionsBase < ApplicationController
|
|
33
37
|
|
34
38
|
def destroy
|
35
39
|
# current_user_session.destroy
|
36
|
-
# redirect_to
|
40
|
+
# redirect_to new_admin_session_url
|
37
41
|
end
|
38
|
-
|
39
42
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Puffer::Sessions::Clearance integrates Puffer admin interface
|
2
|
+
# builder with the Clearance authentication & authorization solution.
|
3
|
+
class Puffer::Sessions::Clearance < Puffer::Sessions::Base
|
4
|
+
|
5
|
+
setup do
|
6
|
+
model_name :user
|
7
|
+
end
|
8
|
+
|
9
|
+
def new
|
10
|
+
@record = resource.new_member
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
# I used to follow the Clearance conventions
|
15
|
+
params[:session] = params.delete resource.attributes_key
|
16
|
+
|
17
|
+
if @record = authenticate(params) and sign_in(@record)
|
18
|
+
redirect_back_or admin_root_url
|
19
|
+
else
|
20
|
+
@record = resource.new_member :email => params[:session][:email]
|
21
|
+
render 'new'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def destroy
|
26
|
+
sign_out
|
27
|
+
redirect_to new_admin_session_url
|
28
|
+
end
|
29
|
+
end
|