puffer 0.0.32 → 0.1.0

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.
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