puffer 0.0.32 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +1 -26
  3. data/Gemfile.lock +66 -64
  4. data/README.md +34 -23
  5. data/Rakefile +1 -11
  6. data/VERSION +1 -1
  7. data/app/assets/javascripts/puffer/application.js +6 -1
  8. data/app/assets/javascripts/puffer/associations.js +18 -0
  9. data/app/assets/javascripts/puffer/puffer.js +7 -0
  10. data/app/assets/javascripts/puffer/right-calendar-src.js +19 -3
  11. data/app/assets/javascripts/puffer/right-dnd-src.js +591 -0
  12. data/app/assets/javascripts/puffer/right-in-edit-src.js +373 -0
  13. data/app/assets/javascripts/puffer/right-keys-src.js +87 -0
  14. data/app/assets/javascripts/puffer/{paginator.js → right-paginator-src.js} +0 -0
  15. data/app/assets/javascripts/puffer/right-slider-src.js +29 -32
  16. data/app/assets/javascripts/puffer/right-sortable-src.js +430 -0
  17. data/app/assets/javascripts/puffer/right-src.js +358 -99
  18. data/app/assets/stylesheets/puffer/puffer.css +29 -4
  19. data/app/components/base/form.html.erb +8 -14
  20. data/app/components/base_component.rb +1 -1
  21. data/app/components/boolean/form.html.erb +5 -3
  22. data/app/components/boolean/index.html.erb +6 -2
  23. data/app/components/boolean_component.rb +2 -2
  24. data/app/components/date_time/filter.html.erb +9 -0
  25. data/app/components/date_time/form.html.erb +8 -4
  26. data/app/components/date_time_component.rb +21 -5
  27. data/app/components/file/form.html.erb +8 -4
  28. data/app/components/hidden/form.html.erb +3 -1
  29. data/app/components/nested_attributes_many/form.html.erb +47 -0
  30. data/app/components/nested_attributes_many_component.rb +7 -0
  31. data/app/components/nested_attributes_one/form.html.erb +48 -0
  32. data/app/components/nested_attributes_one_component.rb +7 -0
  33. data/app/components/password/form.html.erb +8 -4
  34. data/app/components/password_component.rb +1 -1
  35. data/app/components/references_many/index.html.erb +1 -1
  36. data/app/components/references_one/choose.html.erb +1 -1
  37. data/app/components/references_one/form.html.erb +10 -9
  38. data/app/components/references_one_component.rb +0 -1
  39. data/app/components/render_component.rb +13 -0
  40. data/app/components/select/filter.html.erb +4 -2
  41. data/app/components/select/form.html.erb +8 -4
  42. data/app/components/text/form.html.erb +8 -4
  43. data/app/controllers/admin/sessions_controller.rb +1 -21
  44. data/app/controllers/puffer/base.rb +10 -3
  45. data/app/controllers/puffer/dashboard_base.rb +7 -1
  46. data/app/controllers/puffer/{sessions_base.rb → sessions/base.rb} +10 -7
  47. data/app/controllers/puffer/sessions/clearance.rb +29 -0
  48. data/app/controllers/puffer/{sessions_devise_base.rb → sessions/devise.rb} +1 -1
  49. data/app/controllers/puffer/sessions/simple.rb +28 -0
  50. data/app/controllers/puffer/tree_base.rb +1 -1
  51. data/app/models/puffer_user.rb +3 -0
  52. data/app/views/layouts/puffer.html.erb +3 -3
  53. data/app/views/puffer/base/_edit.html.erb +15 -0
  54. data/app/views/puffer/base/_index.html.erb +26 -0
  55. data/app/views/puffer/base/_show.html.erb +13 -0
  56. data/app/views/puffer/base/_table.html.erb +1 -1
  57. data/app/views/puffer/base/edit.html.erb +1 -15
  58. data/app/views/puffer/base/edit.js.erb +1 -0
  59. data/app/views/puffer/base/index.html.erb +1 -20
  60. data/app/views/puffer/base/index.js.erb +1 -0
  61. data/app/views/puffer/base/new.html.erb +1 -1
  62. data/app/views/puffer/base/show.html.erb +1 -22
  63. data/app/views/puffer/base/show.js.erb +1 -0
  64. data/app/views/puffer/base/update.js.erb +1 -0
  65. data/app/views/puffer/sessions/base/new.html.erb +11 -0
  66. data/app/views/puffer/tree_base/_record.html.erb +1 -1
  67. data/lib/puffer/component.rb +14 -47
  68. data/lib/puffer/controller/auth.rb +13 -9
  69. data/lib/puffer/controller/config.rb +18 -0
  70. data/lib/puffer/controller/mutate.rb +8 -8
  71. data/lib/puffer/engine.rb +5 -0
  72. data/lib/puffer/field.rb +5 -11
  73. data/lib/puffer/filters.rb +86 -56
  74. data/lib/puffer/helpers/component_helper.rb +24 -0
  75. data/lib/puffer/helpers/puffer_helper.rb +65 -0
  76. data/lib/puffer/helpers/puffer_tree_helper.rb +19 -0
  77. data/lib/puffer/orm_adapter/active_record.rb +40 -11
  78. data/lib/puffer/orm_adapter/base.rb +9 -0
  79. data/lib/puffer/orm_adapter/mongoid.rb +32 -9
  80. data/lib/puffer/resource/node.rb +2 -2
  81. data/lib/puffer/resource/routing.rb +30 -16
  82. data/lib/puffer/resource.rb +20 -20
  83. data/lib/puffer/version.rb +3 -0
  84. data/lib/puffer.rb +26 -5
  85. data/puffer.gemspec +34 -296
  86. data/spec/app/components/base_component_spec.rb +1 -1
  87. data/spec/app/components/boolean_component_spec.rb +2 -0
  88. data/spec/app/components/date_time_component_spec.rb +1 -0
  89. data/spec/app/components/file_component_spec.rb +1 -0
  90. data/spec/app/components/hidden_component_spec.rb +1 -0
  91. data/spec/app/components/password_component_spec.rb +2 -0
  92. data/spec/app/components/select_component_spec.rb +1 -0
  93. data/spec/app/components/string_component_spec.rb +1 -0
  94. data/spec/app/components/text_component_spec.rb +1 -0
  95. data/spec/dummy/app/controllers/admin/news_controller.rb +2 -0
  96. data/spec/dummy/app/controllers/admin/profiles_controller.rb +1 -1
  97. data/spec/dummy/app/controllers/admin/users_controller.rb +2 -0
  98. data/spec/dummy/app/controllers/orms/active_record_orm_primals_controller.rb +8 -0
  99. data/spec/dummy/app/helpers/news_helper.rb +7 -0
  100. data/spec/dummy/app/models/active_record_orm/has_many_reference.rb +5 -0
  101. data/spec/dummy/app/models/active_record_orm/has_one_reference.rb +5 -0
  102. data/spec/dummy/app/models/active_record_orm/primal.rb +4 -0
  103. data/spec/dummy/config/environments/development.rb +1 -1
  104. data/spec/dummy/db/migrate/20111120144025_create_active_record_orm_has_one_references.rb +10 -0
  105. data/spec/dummy/db/migrate/20111122203304_create_active_record_orm_has_many_references.rb +10 -0
  106. data/spec/dummy/db/schema.rb +15 -1
  107. data/spec/helpers/puffer_helper_spec.rb +1 -1
  108. data/spec/lib/fields_spec.rb +0 -9
  109. data/spec/lib/filters_spec.rb +4 -8
  110. data/spec/lib/orm_adapter/base_shared.rb +22 -0
  111. data/spec/spec_helper.rb +1 -1
  112. metadata +89 -60
  113. data/app/components/string/form.html.erb +0 -5
  114. data/app/helpers/puffer_helper.rb +0 -51
  115. data/app/helpers/puffer_tree_helper.rb +0 -15
  116. data/app/views/puffer/sessions_base/new.html.erb +0 -11
  117. 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
- <% content_for :label do %>
2
- <%= opts[:form].label field %>
3
- <% end unless content_for? :label %>
4
-
5
- <% content_for :error do %>
6
- <%= opts[:form].object.errors[field.name.to_sym].first %>
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
- </div>
15
- <%= yield :input %>
8
+ <%= f.text_field field, field.input_options %>
9
+ <% end %>
@@ -1,7 +1,7 @@
1
1
  class BaseComponent < Puffer::Component::Base
2
2
 
3
3
  def index
4
- opts[:record].call_chain(field.to_s)
4
+ @record.call_chain(field.to_s)
5
5
  end
6
6
 
7
7
  def form
@@ -1,3 +1,5 @@
1
- <%= opts[:form].check_box field, field.input_options %>
2
- <%= opts[:form].label field %>
3
- <%= opts[:form].object.errors[field.name.to_sym].first %>
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
- <%= component_wrap do %>
2
- <%= link_to opts[:record].call_chain(field.to_s) ? 'True' : 'False', event_path(:change, :id => opts[:record].to_param), :remote => true %>
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
- opts[:record] = resource.member
9
- opts[:record].update_attributes field.to_s => !opts[:record].call_chain(field.to_s)
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
- <% content_for :input do %>
2
- <%= opts[:form].text_field field, field.input_options.merge("data-calendar" => "{showButtons: true, listYears: true, format: '#{@format}'}", :autocomplete => :off) %>
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 = case field.type
5
- when :date then '%Y-%m-%d'
6
- when :time then '%H:%M:%S'
7
- when :datetime, :timestamp then '%Y-%m-%d %H:%M:%S'
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
- <% content_for :input do %>
2
- <%= opts[:form].file_field field, field.input_options %>
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' %>
@@ -1 +1,3 @@
1
- <%= opts[:form].hidden_field field, field.input_options %>
1
+ <%= component_fields_for @record do |f| %>
2
+ <%= f.hidden_field field, field.input_options %>
3
+ <% end %>
@@ -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,7 @@
1
+ class NestedAttributesManyComponent < BaseComponent
2
+
3
+ def form
4
+ render
5
+ end
6
+
7
+ 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 %>
@@ -0,0 +1,7 @@
1
+ class NestedAttributesOneComponent < BaseComponent
2
+
3
+ def form
4
+ render
5
+ end
6
+
7
+ end
@@ -1,5 +1,9 @@
1
- <% content_for :input do %>
2
- <%= opts[:form].password_field field, field.input_options %>
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,7 +1,7 @@
1
1
  class PasswordComponent < BaseComponent
2
2
 
3
3
  def index
4
- '*' * opts[:record].call_chain(field.to_s).mb_chars.length
4
+ '*' * @record.call_chain(field.to_s).mb_chars.length
5
5
  end
6
6
 
7
7
  end
@@ -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
- <% content_for :input do %>
2
- <% link_to "Choose", '#', :"data-dialog-uri" => event_path(:choose) %>
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
- <dt><%= opts[:form].label field.field_name %></dt>
2
- <dd><%= opts[:form].select field.field_name, @options, :include_blank => true %></dd>
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
- <% content_for :input do %>
2
- <%= opts[:form].select field, @options, {:include_blank => field.options.key?(:include_blank) ? field.options[:include_blank] : true }, field.input_options %>
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
- <% content_for :input do %>
2
- <%= opts[:form].text_area field, field.input_options %>
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::SessionsBase
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
- redirect_to (request.referrer || resource.collection_path)
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(self, params[:event])
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
@@ -6,8 +6,14 @@ class Puffer::DashboardBase < ApplicationController
6
6
 
7
7
  layout 'puffer_dashboard'
8
8
 
9
- def index
9
+ respond_to :html
10
+
11
+ setup do
12
+ group nil
13
+ end
10
14
 
15
+ def index
16
+
11
17
  end
12
18
 
13
19
  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::SessionsBase < ApplicationController
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 = UserSession.new
26
+ # @record = resource.new_member
23
27
  end
24
28
 
25
29
  def create
26
- # @record = UserSession.new params[:user_session]
30
+ # @record = resource.new_member
27
31
  # if @record.save
28
- # redirect_back_or_default puffer_root_url
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 new_puffer_session_url
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
@@ -1,4 +1,4 @@
1
- class Puffer::SessionsDeviseBase < Puffer::SessionsBase
1
+ class Puffer::Sessions::Devise < Puffer::Sessions::Base
2
2
  # include Devise::Controllers::InternalHelpers
3
3
 
4
4
  # GET /resource/sign_in