jeffp-wizardly 0.1.8.7 → 0.1.8.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,6 +15,10 @@ Install
15
15
  Examples
16
16
 
17
17
  * http://github.com/jeffp/wizardly-examples
18
+
19
+ == Contributions
20
+
21
+ Thanks for feedback from Roland Schulz, Steve Hoeksema, Morgan Christiansson, Jonathan Clarke
18
22
 
19
23
  == Description
20
24
 
@@ -23,14 +27,13 @@ DRY up the Rails MVC implementation of a wizard. In three easy steps, +wizardly
23
27
  produces the scaffolding and controller of a multi-step wizard.
24
28
 
25
29
  Features include:
26
- * Model-based definition
27
- * Wizard controller macro
28
- * Wizard scaffold generator
29
- * Simple wizard page helpers
30
- * Default and customizable wizard buttons
31
- * Page and wizard callbacks
32
- * High in Convention
33
- * Rich in Configuration
30
+ * Model-based Wizard Definition
31
+ * Wizard Controller Macros
32
+ * Wizard Scaffold Generators
33
+ * Sizard Form Helpers
34
+ * Configurable Buttons
35
+ * Callbacks
36
+ * Paperclip Support
34
37
 
35
38
  == Example
36
39
 
@@ -189,8 +192,8 @@ Here's a list of options for the +act_wizardly_for+ controller macro
189
192
  :cancel => false
190
193
  :guard => false
191
194
  :mask_fields => [:password, :password_confirmation] (by default)
192
- :persist_model => {:once|:per_page}
193
- :form_data => {:sandbox|:session}
195
+ :persist_model => {:per_page|:once}
196
+ :form_data => {:session|:sandbox}
194
197
 
195
198
  Setting the :skip option to +true+ tells the scaffold helpers to include a skip button on each page.
196
199
  The :cancel option set to +false+ removes the 'cancel' button from the wizard views.
@@ -225,7 +228,7 @@ the application needs to navigate away and return to the wizard.
225
228
  The guarding behavior works a little differently depending on the :form_data setting.
226
229
  When :form_data is set to :session (the default behavior), guarding only occurs
227
230
  for the initial entry. Once a user has entered the form and started it, while
228
- form data is being kept, the application may thereafter enter anywhere. On the
231
+ form data is being kept, the application may thereafter enter anywhere. On the
229
232
  contrary, if :form_data is set to :sandbox, entry is always guarded, and once the user
230
233
  leaves the wizard, entry may only occur at the initial page (as the form data has
231
234
  been reset).
@@ -233,13 +236,17 @@ been reset).
233
236
  ==== Persisting The Model
234
237
 
235
238
  The :persist_model option controls how the model is saved, either :once or :per_page.
236
- The default option :once, only saves the model when the wizard is completed, by the
237
- user pressing a :finish button or :next button on the final page. This method
238
- prevents numerous incomplete models and possibly invalid models being saved to the
239
- database.
239
+ The default setting :per_page, saves the model incrementally for each page that
240
+ validates according to its validation group. This setting may result in invalid and
241
+ incomplete records in the database.
242
+
243
+ This problem can be remedied by using the :once setting, in which case, form data is
244
+ kept in the session until the wizard is complete and then saved out to the database.
240
245
 
241
- The other option setting, :per_page, saves the model incrementally for each time
242
- the form data validates as the user moves through the pages.
246
+ The :once option does not work in all cases, particularly for any attribute that
247
+ can not be marshalled and dumped in the session. In particular, this will not work
248
+ for forms with file uploads like any forms using Paperclip. When using Paperclip, use
249
+ the :per_page setting.
243
250
 
244
251
 
245
252
  === Buttons
@@ -77,12 +77,17 @@ module ValidationGroup
77
77
  # jeffp: delete fields
78
78
  @current_validation_fields = nil
79
79
  end
80
+
81
+ def reject_non_validation_group_errors
82
+ return unless validation_group_enabled?
83
+ self.errors.remove_on(@current_validation_fields)
84
+ end
80
85
 
81
86
  # jeffp: optimizer for someone writing custom :validate method -- no need
82
87
  # to validate fields outside the current validation group note: could also
83
88
  # use in validation modules to improve performance
84
89
  def should_validate?(attribute)
85
- !self.validation_group_enabled? || (@current_validation_fields && @current_validation_fields.include?(attribute.to_sym))
90
+ !self.validation_group_enabled? || (@current_validation_fields && @current_validation_fields.include?(attribute.to_sym))
86
91
  end
87
92
 
88
93
  def validation_group_enabled?
@@ -105,6 +110,12 @@ module ValidationGroup
105
110
  add_error = @base.respond_to?(:should_validate?) ? @base.should_validate?(attribute.to_sym) : true
106
111
  add_without_validation_group(attribute, msg, *args, &block) if add_error
107
112
  end
113
+
114
+ def remove_on(attributes)
115
+ return unless attributes
116
+ attributes = [attributes] unless attributes.is_a?(Array)
117
+ @errors.reject!{|k,v| !attributes.include?(k.to_sym)}
118
+ end
108
119
 
109
120
  def self.included(base) #:nodoc:
110
121
  base.class_eval do
@@ -23,7 +23,7 @@ module Wizardly
23
23
  @include_cancel_button = opts.key?(:cancel) ? opts[:cancel] : true
24
24
  @guard_entry = opts.key?(:guard) ? opts[:guard] : true
25
25
  @password_fields = opts[:mask_fields] || opts[:mask_passwords] || [:password, :password_confirmation]
26
- @persist_model = opts[:persist_model] || :once
26
+ @persist_model = opts[:persist_model] || :per_page
27
27
  @form_data = opts[:form_data] || :session
28
28
  raise(ArgumentError, ":persist_model option must be one of :once or :per_page", caller) unless [:once, :per_page].include?(@persist_model)
29
29
  raise(ArgumentError, ":form_data option must be one of :sandbox or :session", caller) unless [:sandbox, :session].include?(@form_data)
@@ -85,7 +85,6 @@ EVENTS
85
85
  page = @pages[id]
86
86
  finish_button = self.button_for_function(:finish).id
87
87
  next_button = self.button_for_function(:next).id
88
- model_persist_line = self.persist_model_per_page? ? "@#{self.model}.save_without_validation!" : ''
89
88
 
90
89
  (mb = StringIO.new) << <<-ONE
91
90
  def #{page.name}
@@ -94,8 +93,7 @@ EVENTS
94
93
  @wizard = wizard_config
95
94
  @title = '#{page.title}'
96
95
  @description = '#{page.description}'
97
- h = (self.wizard_form_data||{}).merge(params[:#{self.model}] || {})
98
- @#{self.model} = build_wizard_model(h)
96
+ _build_wizard_model
99
97
  if request.post? && callback_performs_action?(:_on_post_#{id}_form)
100
98
  raise CallbackError, "render or redirect not allowed in :on_post(:#{id}) callback", caller
101
99
  end
@@ -128,7 +126,6 @@ EVENTS
128
126
  complete_wizard unless @do_not_complete
129
127
  return
130
128
  end
131
- #{model_persist_line}
132
129
  return if callback_performs_action?(:_on_#{id}_form_#{next_button})
133
130
  redirect_to :action=>:#{self.next_page(id)}
134
131
  THREE
@@ -139,7 +136,6 @@ EVENTS
139
136
  complete_wizard unless @do_not_complete
140
137
  return
141
138
  end
142
- #{model_persist_line}
143
139
  return if callback_performs_action?(:_on_#{id}_form_#{next_button})
144
140
  redirect_to :action=>:#{self.next_page(id)}
145
141
  FOUR
@@ -147,7 +143,7 @@ EVENTS
147
143
 
148
144
  mb << <<-ENSURE
149
145
  ensure
150
- self.wizard_form_data = h.merge(@#{self.model}.attributes) if (@#{self.model} && !@wizard_completed_flag)
146
+ _preserve_wizard_model
151
147
  end
152
148
  end
153
149
  ENSURE
@@ -281,18 +277,36 @@ SANDBOX
281
277
  _on_wizard_#{finish_button}
282
278
  redirect_to(#{Utils.formatted_redirect(self.completed_redirect)}) unless self.performed?
283
279
  end
284
- def build_wizard_model(params)
285
- if (wizard_config.persist_model_per_page? && (model_id = params['id']))
286
- begin
287
- _model = #{self.model_class_name}.find(model_id)
288
- _model.attributes = params
289
- return _model
290
- rescue
280
+ def _build_wizard_model
281
+ if self.wizard_config.persist_model_per_page?
282
+ h = self.wizard_form_data
283
+ if (h && model_id = h['id'])
284
+ _model = #{self.model_class_name}.find(model_id)
285
+ _model.attributes = params[:#{self.model}]||{}
286
+ @#{self.model} = _model
287
+ return
291
288
  end
289
+ @#{self.model} = #{self.model_class_name}.new(params[:#{self.model}])
290
+ else # persist data in session or flash
291
+ h = (self.wizard_form_data||{}).merge(params[:#{self.model}] || {})
292
+ @#{self.model} = #{self.model_class_name}.new(h)
292
293
  end
293
- #{self.model_class_name}.new(params)
294
294
  end
295
- hide_action :build_wizard_model, :save_wizard_model!
295
+ def _preserve_wizard_model
296
+ return unless (@#{self.model} && !@wizard_completed_flag)
297
+ if self.wizard_config.persist_model_per_page?
298
+ @#{self.model}.save_without_validation!
299
+ if request.get?
300
+ @#{self.model}.errors.clear
301
+ else
302
+ @#{self.model}.reject_non_validation_group_errors
303
+ end
304
+ self.wizard_form_data = {'id'=>@#{self.model}.id}
305
+ else
306
+ self.wizard_form_data = @#{self.model}.attributes
307
+ end
308
+ end
309
+ hide_action :_build_wizard_model, :_preserve_wizard_model
296
310
 
297
311
  def initial_referer
298
312
  session[:#{self.initial_referer_key}]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jeffp-wizardly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8.7
4
+ version: 0.1.8.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Patmon
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-31 00:00:00 -07:00
12
+ date: 2009-09-10 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -22,55 +22,56 @@ extensions: []
22
22
  extra_rdoc_files: []
23
23
 
24
24
  files:
25
- - lib/validation_group.rb
25
+ - lib/generators
26
26
  - lib/wizardly.rb
27
+ - lib/validation_group.rb
28
+ - lib/jeffp-wizardly.rb
27
29
  - lib/wizardly
28
- - lib/wizardly/action_controller.rb
30
+ - lib/wizardly/wizard.rb
29
31
  - lib/wizardly/wizard
32
+ - lib/wizardly/wizard/page.rb
30
33
  - lib/wizardly/wizard/configuration.rb
31
34
  - lib/wizardly/wizard/button.rb
35
+ - lib/wizardly/wizard/utils.rb
36
+ - lib/wizardly/wizard/dsl.rb
32
37
  - lib/wizardly/wizard/configuration
33
38
  - lib/wizardly/wizard/configuration/methods.rb
34
39
  - lib/wizardly/wizard/text_helpers.rb
35
- - lib/wizardly/wizard/utils.rb
36
- - lib/wizardly/wizard/page.rb
37
- - lib/wizardly/wizard/dsl.rb
38
- - lib/wizardly/wizard.rb
39
- - lib/jeffp-wizardly.rb
40
- - lib/generators
41
- - rails_generators/wizardly_controller
42
- - rails_generators/wizardly_controller/wizardly_controller_generator.rb
43
- - rails_generators/wizardly_controller/templates
44
- - rails_generators/wizardly_controller/templates/controller.rb.erb
45
- - rails_generators/wizardly_controller/templates/helper.rb.erb
46
- - rails_generators/wizardly_controller/USAGE
40
+ - lib/wizardly/action_controller.rb
47
41
  - rails_generators/wizardly_app
48
- - rails_generators/wizardly_app/templates
49
- - rails_generators/wizardly_app/templates/wizardly.rake
50
42
  - rails_generators/wizardly_app/USAGE
51
43
  - rails_generators/wizardly_app/wizardly_app_generator.rb
44
+ - rails_generators/wizardly_app/templates
45
+ - rails_generators/wizardly_app/templates/wizardly.rake
52
46
  - rails_generators/wizardly_scaffold
53
47
  - rails_generators/wizardly_scaffold/wizardly_scaffold_generator.rb
48
+ - rails_generators/wizardly_scaffold/USAGE
54
49
  - rails_generators/wizardly_scaffold/templates
50
+ - rails_generators/wizardly_scaffold/templates/style.css
51
+ - rails_generators/wizardly_scaffold/templates/form.html.haml.erb
52
+ - rails_generators/wizardly_scaffold/templates/form.html.erb
53
+ - rails_generators/wizardly_scaffold/templates/layout.html.haml.erb
54
+ - rails_generators/wizardly_scaffold/templates/layout.html.erb
55
55
  - rails_generators/wizardly_scaffold/templates/images
56
- - rails_generators/wizardly_scaffold/templates/images/skip.png
57
- - rails_generators/wizardly_scaffold/templates/images/cancel.png
58
- - rails_generators/wizardly_scaffold/templates/images/finish.png
59
56
  - rails_generators/wizardly_scaffold/templates/images/next.png
57
+ - rails_generators/wizardly_scaffold/templates/images/finish.png
60
58
  - rails_generators/wizardly_scaffold/templates/images/back.png
61
- - rails_generators/wizardly_scaffold/templates/form.html.erb
62
- - rails_generators/wizardly_scaffold/templates/form.html.haml.erb
63
- - rails_generators/wizardly_scaffold/templates/style.css
59
+ - rails_generators/wizardly_scaffold/templates/images/cancel.png
60
+ - rails_generators/wizardly_scaffold/templates/images/skip.png
64
61
  - rails_generators/wizardly_scaffold/templates/helper.rb.erb
65
- - rails_generators/wizardly_scaffold/templates/layout.html.haml.erb
66
- - rails_generators/wizardly_scaffold/templates/layout.html.erb
67
- - rails_generators/wizardly_scaffold/USAGE
62
+ - rails_generators/wizardly_controller
63
+ - rails_generators/wizardly_controller/USAGE
64
+ - rails_generators/wizardly_controller/wizardly_controller_generator.rb
65
+ - rails_generators/wizardly_controller/templates
66
+ - rails_generators/wizardly_controller/templates/controller.rb.erb
67
+ - rails_generators/wizardly_controller/templates/helper.rb.erb
68
68
  - CHANGELOG.rdoc
69
69
  - init.rb
70
70
  - LICENSE
71
71
  - README.rdoc
72
72
  has_rdoc: false
73
73
  homepage: http://github.com/jeffp/wizardly/tree/master
74
+ licenses:
74
75
  post_install_message:
75
76
  rdoc_options: []
76
77
 
@@ -91,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
92
  requirements: []
92
93
 
93
94
  rubyforge_project:
94
- rubygems_version: 1.2.0
95
+ rubygems_version: 1.3.5
95
96
  signing_key:
96
97
  specification_version: 3
97
98
  summary: Produces controllers and wizard scaffolding for models with validation_groups