doop 0.0.3.1 → 0.0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/images/nino-icon.png +0 -0
  3. data/app/assets/images/passport-icon.png +0 -0
  4. data/app/assets/images/time-icon.png +0 -0
  5. data/app/helpers/doop_helper.rb +14 -7
  6. data/doop.gemspec +4 -2
  7. data/lib/doop-rspec.rb +82 -0
  8. data/lib/doop.rb +3 -1
  9. data/lib/doop/version.rb +1 -1
  10. data/lib/doop_controller.rb +14 -9
  11. data/lib/generators/doopgovuk/doopgovuk_generator.rb +3 -0
  12. data/lib/generators/doopgovuk/templates/app/assets/javascripts/demo.js.coffee +7 -0
  13. data/lib/generators/doopgovuk/templates/app/assets/javascripts/demo/application.js +2 -0
  14. data/lib/generators/doopgovuk/templates/app/assets/stylesheets/demo.css.scss +50 -8
  15. data/lib/generators/doopgovuk/templates/app/assets/stylesheets/demo/application.css +3 -0
  16. data/lib/generators/doopgovuk/templates/app/controllers/demo_controller.rb +202 -68
  17. data/lib/generators/doopgovuk/templates/app/views/demo/_about_you.html.erb +84 -0
  18. data/lib/generators/doopgovuk/templates/app/views/demo/_before_you_begin.html.erb +56 -0
  19. data/lib/generators/doopgovuk/templates/app/views/demo/_children.html.erb +64 -0
  20. data/lib/generators/doopgovuk/templates/app/views/demo/_declaration.html.erb +32 -0
  21. data/lib/generators/doopgovuk/templates/app/views/demo/_preamble.html.erb +36 -27
  22. data/lib/generators/doopgovuk/templates/app/views/demo/harness.html.erb +1 -1
  23. data/lib/generators/doopgovuk/templates/app/views/demo/index.html.erb +6 -0
  24. data/lib/generators/doopgovuk/templates/app/views/demo/index.js.erb +1 -1
  25. data/lib/generators/doopgovuk/templates/app/views/doop/_change_answer_tooltip.html.erb +1 -1
  26. data/lib/generators/doopgovuk/templates/app/views/doop/_debug.html.erb +4 -0
  27. data/lib/generators/doopgovuk/templates/app/views/doop/_error.html.erb +1 -3
  28. data/lib/generators/doopgovuk/templates/app/views/doop/_navbar.html.erb +4 -3
  29. data/lib/generators/doopgovuk/templates/app/views/doop/_question.html.erb +11 -7
  30. data/lib/generators/doopgovuk/templates/app/views/doop/_question_form.html.erb +5 -6
  31. data/lib/generators/doopgovuk/templates/app/views/doop/_textfield.html.erb +14 -0
  32. data/lib/generators/doopgovuk/templates/app/views/doop/_tooltip.html.erb +1 -1
  33. data/lib/generators/doopgovuk/templates/spec/features/demo_spec.rb +121 -48
  34. data/lib/generators/doopgovuk/templates/spec/rails_helper.rb +4 -73
  35. data/spec/doop_spec.rb +47 -0
  36. metadata +22 -12
  37. data/lib/generators/doopgovuk/templates/app/views/demo/_summary.html.erb +0 -10
  38. data/lib/generators/doopgovuk/templates/app/views/demo/_your_details.html.erb +0 -55
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YTJlNzA0M2EyMWRkMGNhNjIwMzc5YWM2ZmQzNTBiYWFhOGFiYjE4ZA==
4
+ YThjZGUzODA4ZDUzMzM2YWYyMTI5NDk0Yjc1NDUwZWZhYmYzMGYyMQ==
5
5
  data.tar.gz: !binary |-
6
- NWMzODdlOWE2ZWMyMWJiZmEwODg2Zjk4MzM3NDNiZjk1NTdmOTM4ZA==
6
+ Yjc2YTZjMDU0ZWQ1NjU0ZWI1ODVhZTQ5MDQyOThiMzI5ZGFmOTZhZQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YmVhODM2ZjRmNDJiMTllYjM4MjQyMzZkM2ViMGVmYmQzZjE1MzQ3YzA5NjVj
10
- MjYzZjAxYTEwNTJkZTc0N2VmNzliYmMwNDRkMDY0MjM0YjgzZTFiOTI3Mjc0
11
- YjI5N2JhZjgwYjMyZjQ2NThkZDI1MTA0ZTNiZWVhYWUxM2YwZjg=
9
+ YTYwNGJjYzkxOTAzYjQzMGI0OGE5MzdiZTI1ZjQzMmNmN2YxYzUyMmNmOWFi
10
+ M2Y3MGVlNGM4ZWNlM2Q3MWQzZThmOTU1NzA5MWU2MjA3NDAyZTZiZjAzN2U4
11
+ ZDcyYTBiZDJlNWE5NjI1ZmY2MDM2MjEyMDNmNTJmMjQ1NDI2YWE=
12
12
  data.tar.gz: !binary |-
13
- MDZmNzBlYzBjMDk0Zjk4OGI2OGExMjEwMDQ0MDIxNjkzOGM1MjlmMzNmMzYx
14
- NDlmZDRmOGRlZTQ0YTdhY2MwMjRkZWI0OTA5YjUwNDI0OTIzYThhOTAwY2E0
15
- NDE2NWMxODFlNTA4NzNmMzk2YWViM2Y4ZTg5YTg0MjMwZDVmYjU=
13
+ YTAxMDk5MzBkMTM4NjBkNmFlOGZlYzI0MjhlMDNhNTBiYjc0OWM1ZGM5NTQ2
14
+ ZjQ5Y2U5ZTI4ZTg5ZWRmNjQ5NmQ3NTI0ZGViZTAwNTRmNWY5ZWFhNjkzOGJm
15
+ YzYyNzc5ZWM4Yzg0YWY0ODEwYTA3NGVmOTVkZWQyM2Q4ODg3NDU=
@@ -23,7 +23,7 @@ module DoopHelper
23
23
  root = doop[path]
24
24
  s = ""
25
25
  if question_visible? path
26
- s = render( "doop/question", :content => block, :root => root, :path => path, :answer => root["_answer"], :title => opts[:title], :indent => opts[:indent] )
26
+ s = render( "doop/question", :content => block, :root => root, :path => path, :answer => root["_answer"], :title => opts[:title], :indent => opts[:indent], :id => question_id(path) )
27
27
  end
28
28
  s
29
29
  end
@@ -53,23 +53,30 @@ module DoopHelper
53
53
  if options.include? :last_answered
54
54
  path = options[:last_answered]
55
55
  if doop.last_answered == path
56
- block.call doop[path]["_answer"]
56
+ block.call doop[path]["_answer"], question_id(path)
57
57
  end
58
58
  elsif options.include? :changed
59
59
  path = options[:changed]
60
60
  if doop.is_being_changed(path)
61
- block.call doop[path]["_answer"]
61
+ block.call doop[path]["_answer"], question_id(path)
62
62
  end
63
63
  end
64
64
  end
65
65
 
66
- def tooltip &block
67
- render( "doop/tooltip", :content => block )
66
+ def tooltip id, &block
67
+ render( "doop/tooltip", :content => block, :id => id )
68
68
  end
69
69
 
70
- def change_answer_tooltip &block
71
- render( "doop/change_answer_tooltip", :content => block )
70
+ def change_answer_tooltip id, &block
71
+ render( "doop/change_answer_tooltip", :content => block, :id => id )
72
72
  end
73
73
 
74
+ def question_id path
75
+ path.split("/").last
76
+ end
77
+
78
+ def doop_textfield name, answer, res, options = {}
79
+ s = render "doop/textfield", :answer => answer, :name => name, :res => res, :label => options[:label]
80
+ end
74
81
 
75
82
  end
@@ -8,7 +8,9 @@ require 'fileutils'
8
8
  if !Dir['doop_demo/*'].empty?
9
9
  dest = "lib/generators/doopgovuk/templates"
10
10
  FileUtils.cp "doop_demo/app/assets/stylesheets/demo.css.scss", "#{dest}/app/assets/stylesheets/demo.css.scss"
11
+ FileUtils.cp "doop_demo/app/assets/stylesheets/demo/application.css", "#{dest}/app/assets/stylesheets/demo/application.css"
11
12
  FileUtils.cp "doop_demo/app/assets/javascripts/demo.js.coffee", "#{dest}/app/assets/javascripts/demo.js.coffee"
13
+ FileUtils.cp "doop_demo/app/assets/javascripts/demo/application.js", "#{dest}/app/assets/javascripts/demo/application.js"
12
14
  FileUtils.cp "doop_demo/app/controllers/demo_controller.rb", "#{dest}/app/controllers/demo_controller.rb"
13
15
  FileUtils.cp "doop_demo/app/views/layouts/application.html.erb", "#{dest}/app/views/layouts/application.html.erb"
14
16
  FileUtils.cp_r "doop_demo/app/views/doop", "#{dest}/app/views"
@@ -33,8 +35,8 @@ Gem::Specification.new do |spec|
33
35
 
34
36
  spec.add_development_dependency "bundler", "~> 1.7"
35
37
  spec.add_development_dependency "rake", "~> 10.0"
36
- spec.add_development_dependency "rspec"
38
+ spec.add_development_dependency "rspec", "~> 3.1"
37
39
 
38
- spec.add_runtime_dependency "rails"
40
+ spec.add_runtime_dependency "rails", "~> 4.1"
39
41
  end
40
42
 
@@ -0,0 +1,82 @@
1
+
2
+ RSpec::Matchers.define :be_asked do
3
+ match do |q_title|
4
+ page.find_by_id( "#{q_title}-open" )
5
+ end
6
+
7
+ failure_message do |q_title|
8
+ "Expected question with id #{q_title} to be asked"
9
+ end
10
+
11
+ end
12
+
13
+ RSpec::Matchers.define :be_enabled do
14
+ match do |q_title|
15
+ page.find_by_id( q_title )
16
+ end
17
+ end
18
+
19
+ RSpec::Matchers.define :be_disabled do
20
+ match do |q_title|
21
+ expect(page).to have_no_selector( "##{q_title}" )
22
+ end
23
+ end
24
+
25
+ RSpec::Matchers.define :be_visible do
26
+ match do |id|
27
+ page.find_by_id( id )
28
+ end
29
+ end
30
+
31
+ def question text
32
+ text
33
+ end
34
+
35
+ def change_question q_title, &block
36
+ @q_title = q_title
37
+ page.find_by_id( "#{q_title}-change" ).click
38
+ expect( question q_title ).to be_asked
39
+ yield block
40
+ end
41
+
42
+ def answer_question q_title, &block
43
+ @q_title = q_title
44
+ expect( question q_title ).to be_asked
45
+ yield block
46
+ page.find_by_id( "#{q_title}-closed" )
47
+ end
48
+
49
+ def rollup_text
50
+ page.find_by_id( "#{@q_title}-change" ).text
51
+ end
52
+
53
+ def change_answer_tooltip_for q_id
54
+ "#{q_id}-change-answer-tooltip"
55
+ end
56
+
57
+ def tooltip
58
+ "#{@q_title}-tooltip"
59
+ end
60
+
61
+ def change_answer_tooltip
62
+ "#{@q_title}-change-answer-tooltip"
63
+ end
64
+
65
+ def wait_for_page p_title
66
+ page.find_by_id( "#{p_title}-page" )
67
+ end
68
+
69
+ def page_title
70
+ page.find_by_id( "page_title").text
71
+ end
72
+
73
+ def b_fill_in options = {}
74
+ options.keys.each do |key|
75
+ page.fill_in( "b_#{key}", :with => options[key] )
76
+ end
77
+ end
78
+
79
+ def change_page page_name
80
+ page.find_by_id( "#{page_name}-nav" ).click
81
+ wait_for_page page_name
82
+ end
@@ -117,6 +117,7 @@ module Doop
117
117
  end
118
118
 
119
119
  def each_path_elem(path)
120
+ return if path == nil
120
121
  p = ""
121
122
  path.split("/").select{|r| !r.empty?}.each do |n|
122
123
  p += "/" + n
@@ -163,7 +164,7 @@ module Doop
163
164
  next
164
165
  end
165
166
 
166
- q = path if path.start_with?(q) && root["_answered"] == false
167
+ q = path if path.start_with?("#{q}/") && root["_answered"] == false
167
168
  end
168
169
 
169
170
  each_path_elem( q ) { |n| self[n]["_open"] = true }
@@ -257,6 +258,7 @@ module Doop
257
258
  # open all parent questions
258
259
  each_path_elem_reverse(path) do |p|
259
260
  self[p + "/_open"] = true
261
+ self[p + "/_answered"] = false if p != path
260
262
  end
261
263
  end
262
264
 
@@ -1,3 +1,3 @@
1
1
  module Doop
2
- VERSION = "0.0.3.1"
2
+ VERSION = "0.0.4.1"
3
3
  end
@@ -12,7 +12,6 @@ module Doop
12
12
  def initialize application_controller, &block
13
13
  @controller = application_controller
14
14
  @block = block
15
- @debug_on_block = nil
16
15
  @current_page_block = method( :default_current_page )
17
16
  @all_pages_block = method( :default_all_pages )
18
17
  end
@@ -25,9 +24,9 @@ module Doop
25
24
  back_val = @controller.params["back_a_page"]
26
25
  nav_path = @controller.params["nav_path"]
27
26
  change_answer_path = @controller.params["change_answer_path"]
28
- return back if back_val != nil && !back_val.empty?
29
- return change_page nav_path if nav_path != nil && !nav_path.empty?
30
- return change change_answer_path if change_answer_path != nil && !change_answer_path.empty?
27
+ return back if back_val != nil
28
+ return change_page nav_path if nav_path != nil
29
+ return change change_answer_path if change_answer_path != nil
31
30
 
32
31
  render_page in_doop { |doop| doop.answer( @controller.params ) }
33
32
  end
@@ -80,11 +79,21 @@ module Doop
80
79
  end
81
80
 
82
81
  def render_page res = {}
82
+
83
+ redirect_url = res[:redirect]
84
+
85
+ if ! redirect_url.nil?
86
+ @controller.respond_to do |format|
87
+ format.js { @controller.render :js => "window.location.href='#{redirect_url}'" }
88
+ format.html { redirect_to redirect_url }
89
+ end
90
+ return
91
+ end
92
+
83
93
  res[:page] = get_page
84
94
  res[:page_path] = get_page_path
85
95
  res[:page_title] = @doop[res[:page_path]]["_nav_name"]
86
96
  res[:all_pages] = get_all_pages
87
- res[:debug_on] = @debug_on_block != nil ? @debug_on_block.call : false
88
97
  @controller.render "index", :locals => { :res => res, :doop => @doop }
89
98
  end
90
99
 
@@ -136,10 +145,6 @@ module Doop
136
145
  @all_pages_block.call
137
146
  end
138
147
 
139
- def debug_on &block
140
- @debug_on_block = block
141
- end
142
-
143
148
  def load_yaml &block
144
149
  @load_yaml_block = block
145
150
  end
@@ -5,7 +5,9 @@ class DoopgovukGenerator < Rails::Generators::Base
5
5
 
6
6
  def generate_layout
7
7
  copy_file "app/assets/stylesheets/demo.css.scss", "app/assets/stylesheets/#{name}.css.scss"
8
+ copy_file "app/assets/stylesheets/demo/application.css", "app/assets/stylesheets/#{name}/application.css"
8
9
  copy_file "app/assets/javascripts/demo.js.coffee", "app/assets/javascripts/#{name}.js.coffee"
10
+ copy_file "app/assets/javascripts/demo/application.js", "app/assets/javascripts/#{name}/application.js"
9
11
  template "app/controllers/demo_controller.rb", "app/controllers/#{name}_controller.rb"
10
12
  copy_file "app/views/layouts/application.html.erb", "app/views/layouts/application.html.erb"
11
13
  directory "app/views/doop"
@@ -25,6 +27,7 @@ class DoopgovukGenerator < Rails::Generators::Base
25
27
 
26
28
  gem 'govuk_frontend_toolkit'
27
29
  gem 'govuk_template'
30
+ gem 'jquery-ui-rails'
28
31
 
29
32
  gem_group :development do
30
33
  gem 'rspec-rails'
@@ -6,4 +6,11 @@ $( () ->
6
6
  history.pushState('back', null, null);
7
7
  $( "#back_a_page" ).val( "pressed" )
8
8
  $( "#back_a_page" ).click()
9
+
10
+ $('#doop_debug').dialog( { autoOpen: false, height: 400, width: 400, position: { my: 'right top', at: 'right top' } })
11
+ $("body").keydown (e) ->
12
+ if e.ctrlKey && e.keyCode == 89
13
+ $('#doop_debug').dialog( "open")
14
+
15
+
9
16
  )
@@ -48,6 +48,10 @@ $question-fg-color: #014c73;
48
48
  margin: 0.75em 0.75em 0.75em 0.75em;
49
49
  }
50
50
 
51
+ li {
52
+ margin: 0.75em 0.75em 0.75em 0.75em;
53
+ }
54
+
51
55
  .info_img {
52
56
  float: right;
53
57
  margin: 10px 10px 10px 10px;
@@ -75,16 +79,14 @@ $question-fg-color: #014c73;
75
79
  .title {
76
80
  padding: 0 0 0 0;
77
81
  display: table-cell;
78
- width: 80%;
79
82
  vertical-align: middle;
80
83
  }
81
84
 
82
85
  .answer {
83
86
  display: table-cell;
84
- max-width: 20%;
85
87
  text-align: right;
86
88
  vertical-align: middle;
87
- .button {
89
+ .button-change-answer {
88
90
  @include button($question-fg-color);
89
91
  margin: 0 0 0 0;
90
92
  }
@@ -144,15 +146,13 @@ button {
144
146
  }
145
147
 
146
148
  .error {
147
- margin: 0 0 10px 0;
148
- span {
149
149
  color: red;
150
150
  border: 1px solid #B01117;
151
151
  background-color: #FFF3CF;
152
- padding: 5px 5px 5px 5px;
152
+ padding: 2px 5px 2px 5px;
153
153
  border-radius: 5px;
154
-
155
- }
154
+ margin: 10px 0 10px 0;
155
+ width: auto;
156
156
  }
157
157
 
158
158
  .navbar {
@@ -234,6 +234,18 @@ button {
234
234
 
235
235
  }
236
236
 
237
+ .summary_box {
238
+ display: block;
239
+ margin: 15px 0 15px 0;
240
+ max-width: 100%;
241
+ min-height: 60px;
242
+ border: solid #d1e4f2 5px;
243
+ box-shadow: 0 0 7px #ccc;
244
+ padding: 0.75em 0.75em 0.75em 0.75em;
245
+ background: #e1effa;
246
+ border-radius: 0.15em;
247
+ }
248
+
237
249
  .change_answer_tooltip {
238
250
  border: 1px solid #F8C830;
239
251
  background-color: #FFF4B5;
@@ -244,4 +256,34 @@ button {
244
256
  }
245
257
 
246
258
 
259
+ .before_you_begin {
260
+
261
+ ul {
262
+ padding: 0;
263
+ margin: 0;
264
+
265
+ }
266
+
267
+ li {
268
+ padding: 32px 0 32px 88px;
269
+ border-bottom: 1px solid #ccc;
270
+ list-style-type: none;
271
+ }
272
+
273
+ li.nino {
274
+ background: url(image_path('nino-icon.png')) left center no-repeat;
275
+ }
276
+
277
+ li.passport {
278
+ background: url(image_path('passport-icon.png')) left center no-repeat;
279
+ }
280
+ li.time {
281
+ background: url(image_path('time-icon.png')) left center no-repeat;
282
+ }
283
+
284
+ }
285
+
286
+ select {
287
+ @include core-16();
288
+ }
247
289
 
@@ -1,6 +1,8 @@
1
+ # encoding: utf-8
1
2
 
2
3
  require 'doop'
3
4
  require 'yaml'
5
+ require 'date'
4
6
 
5
7
  class DemoController < ApplicationController
6
8
 
@@ -13,7 +15,7 @@ class DemoController < ApplicationController
13
15
  load_yaml do
14
16
  data = params["doop_data"]
15
17
  if data != nil
16
- if Rails.env.development? || Rails.env.test?
18
+ if Rails.env.development? || Rails.env.test? || params.include?("harness")
17
19
  next data
18
20
  else
19
21
  next ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base).decrypt_and_verify data if !Rails.env.development?
@@ -22,45 +24,72 @@ class DemoController < ApplicationController
22
24
 
23
25
  <<-EOS
24
26
  page: {
27
+ before_you_begin: {
28
+ _page: "before_you_begin",
29
+ _nav_name: "Before you begin",
30
+ },
25
31
  preamble: {
26
32
  _page: "preamble",
27
- _nav_name: "Apply Online",
33
+ _nav_name: "Preamble",
28
34
 
29
- debug_on: {
30
- _question: "Turn debug on ?",
31
- _answer: "No"
32
- },
33
- enrolled_before: {
34
- _question: "Have you enrolled for this service before ?"
35
- },
36
- year_last_applied: {
37
- _question: "What year did you last apply?"
35
+ income_more_than_50000: {
36
+ _question: "Does you or your partner have an individual income of more than £50,000 a year ?"
38
37
  },
39
- reason_for_applying: {
40
- _question: "Why are you applying?"
38
+ do_you_still_want_to_apply: {
39
+ _question: "Do you still want to apply for child benefit?"
41
40
  }
42
41
  },
43
- your_details: {
44
- _page: "your_details",
45
- _nav_name: "Your Details",
42
+ about_you: {
43
+ _page: "about_you",
44
+ _nav_name: "About You",
46
45
 
47
46
  your_name: {
48
47
  _question: "What is your name?",
49
- _answer: {},
48
+ _answer: {}
49
+ },
50
+ known_by_other_name: {
51
+ _question: "Have you ever been known by another surname ?"
52
+ },
53
+ previous_name: {
54
+ _question: "What name were you previously known by ?"
55
+ },
56
+ dob: {
57
+ _question: "Your date of birth"
58
+ },
59
+ your_address: {
60
+ _question: "Your address",
61
+ _answer: {}
62
+ },
63
+ lived_at_address_for_more_than_12_months: {
64
+ _question: "Have you lived at this address for more than 12 months ?"
65
+ },
66
+ last_address: {
67
+ _question: "What was your last address ?",
68
+ _answer: {}
50
69
  },
51
- address_history: {
52
- _question: "What is your address ?",
53
- address__1: { _answer: {} }
70
+ your_phone_numbers: {
71
+ _question: "What numbers can we contact you on ?",
72
+ _answer: {}
73
+ },
74
+ have_nino: {
75
+ _question: "Do you have a national insurance number ?"
76
+ },
77
+ nino: {
78
+ _question: "What is your national insurance number ?"
54
79
  }
55
80
 
56
81
  },
57
- summary: {
58
- _page: "summary",
59
- _nav_name: "Summary",
60
-
61
- terms_and_conditions: {
62
- _question: "Terms and conditions"
63
- }
82
+ children: {
83
+ _page: "children",
84
+ _nav_name: "Children",
85
+ how_many_birth_certs: {
86
+ _question: "How many birth certificates are you sending us?"
87
+ },
88
+ #{child_yaml}
89
+ },
90
+ declaration: {
91
+ _page: "declaration",
92
+ _nav_name: "Declaration",
64
93
  }
65
94
 
66
95
  }
@@ -68,6 +97,26 @@ class DemoController < ApplicationController
68
97
 
69
98
  end
70
99
 
100
+ def child_yaml
101
+ <<-EOS
102
+ child__1: {
103
+ name: {
104
+ _question: "Child's name",
105
+ _answer: {}
106
+ },
107
+ gender: {
108
+ _question: "Is this child male or female ?"
109
+ },
110
+ dob: {
111
+ _question: "Child's date of birth"
112
+ },
113
+ own_child: {
114
+ _question: "Is this child your own child ?"
115
+ }
116
+ }
117
+ EOS
118
+ end
119
+
71
120
  save_yaml do |yaml|
72
121
  if Rails.env.development? || Rails.env.test?
73
122
  request["doop_data"] = yaml
@@ -78,85 +127,170 @@ class DemoController < ApplicationController
78
127
  end
79
128
  end
80
129
 
81
- debug_on do
82
- doop["/page/preamble/debug_on/_answer"] == "Yes"
130
+
131
+ # PREAMBLE callbacks
132
+
133
+ on_answer "/page/preamble/income_more_than_50000" do |question,path, params, answer|
134
+ answer_with( question, { "_summary" => answer } )
135
+ enable( "/page/preamble/do_you_still_want_to_apply", answer == 'Yes' )
136
+ end
137
+
138
+ on_answer "/page/preamble/do_you_still_want_to_apply" do |question,path, params, answer|
139
+ answer_with( question, { "_summary" => "Yes" } )
83
140
  end
84
141
 
85
- # On answer call backs
86
142
 
87
- on_answer "/page/preamble/debug_on" do |question,path, params, answer|
143
+
144
+ # ABOUT YOU callbacks
145
+
146
+ on_answer "/page/about_you/your_name" do |question,path, params, answer|
147
+ res = validate( answer, ["title", "firstname", "surname"] )
148
+ next res if !res.empty?
149
+
150
+ name = "#{answer['title']} #{answer['firstname']} #{answer['middlenames']} #{answer['surname']}".squish
151
+ formatted_name = name.split( " ").map{ |n| n.capitalize }.join( " ")
152
+ answer_with( question, { "_summary" => formatted_name } )
153
+ end
154
+
155
+ on_answer "/page/about_you/known_by_other_name" do |question,path, params, answer|
88
156
  answer_with( question, { "_summary" => answer } )
157
+ enable( "/page/about_you/previous_name", answer == 'Yes' )
89
158
  end
90
159
 
91
- on_answer "/page/preamble/enrolled_before" do |question,path, params, answer|
160
+ on_answer "/page/about_you/previous_name" do |question,path, params, answer|
161
+ res = validate( answer )
162
+ next res if !res.empty?
92
163
  answer_with( question, { "_summary" => answer } )
93
- enable( "/page/preamble/year_last_applied", answer == "Yes" )
94
164
  end
95
165
 
96
- on_answer "/page/preamble/year_last_applied" do |question,path,params,answer|
166
+ on_answer "/page/about_you/dob" do |question,path, params, answer|
167
+ d = format_date answer
168
+ next { :answer_error => "Date of birth must be formated as dd/mm/yyyy" } if d.nil?
169
+ answer_with( question, { "_summary" => d } )
170
+ end
171
+
172
+ on_answer "/page/about_you/your_address" do |question,path, params, answer|
173
+ res = validate( answer, ["address1", "address2", "address3", "postcode"] )
174
+ next res if !res.empty?
175
+
176
+ a = "#{answer['address1']}, #{answer['postcode']}"
177
+ answer_with( question, { "_summary" => a } )
178
+ end
179
+
180
+ on_answer "/page/about_you/lived_at_address_for_more_than_12_months" do |question, path, params, answer|
97
181
  answer_with( question, { "_summary" => answer } )
182
+ enable( "/page/about_you/last_address", answer == 'No' )
98
183
  end
99
184
 
100
- on_answer "/page/preamble/reason_for_applying" do |question,path,params,answer|
101
- if answer.empty?
102
- next { :reason_for_applying_error => "This can not be blank" }
103
- end
185
+ on_answer "/page/about_you/last_address" do |question,path, params, answer|
186
+ res = validate( answer, ["address1", "address2", "address3", "postcode"] )
187
+ next res if !res.empty?
104
188
 
105
- answer_with( question, { "_summary" => "Provided" } )
189
+ a = "#{answer['address1']}, #{answer['postcode']}"
190
+ answer_with( question, { "_summary" => a } )
106
191
  end
107
192
 
108
- on_answer( "/page/preamble" ) do |question, path, params, answer|
193
+ on_answer "/page/about_you/your_phone_numbers" do |question,path, params, answer|
194
+ res = validate( answer, ["daytime", "evening"] )
195
+ next res if !res.empty?
109
196
  answer_with( question, { "_summary" => "Provided" } )
110
197
  end
111
198
 
112
- on_answer( "/page/your_details/your_name" ) do |question, path, params, answer|
113
- firstname = answer["firstname"].capitalize
114
- surname = answer["surname"].capitalize
115
- answer_with( question, { "_summary" => "#{firstname} #{surname}" } )
199
+ on_answer "/page/about_you/have_nino" do |question, path, params, answer|
200
+ answer_with( question, { "_summary" => answer } )
201
+ enable( "/page/about_you/nino", answer == 'Yes' )
116
202
  end
117
203
 
118
- on_answer( "/page/your_details/address_history/address__(\\d+)" ) do |question, path, params, answer|
204
+ on_answer "/page/about_you/nino" do |question, path, params, answer|
205
+ res = validate( answer )
206
+ next res if !res.empty?
207
+ answer_with( question, { "_summary" => answer } )
208
+ end
119
209
 
120
- if params.include?("remove_address")
121
- remove path
122
- next
123
- end
210
+ on_answer "/page/children/how_many_birth_certs" do |question,path, params, answer|
211
+ res = validate( answer )
212
+ next res if !res.empty?
213
+ next { :answer_error => "Must be a number" } if !is_number answer
124
214
 
125
- address1 = answer["address1"]
126
- address2 = answer["address2"]
127
- address3 = answer["address3"]
128
- postcode = answer["postcode"]
129
- summary = [address1, address2, address3, postcode].select{ |n| !n.empty? }.join( ", ")
130
- answer_with( question, { "_summary" => summary } )
131
215
 
216
+ answer_with( question, { "_summary" => answer } )
132
217
  end
133
218
 
134
- on_answer( "/page/your_details/address_history" ) do |question, path, params, answer|
135
- if params.include?("add_address")
136
- address = YAML.load("{ _answer: {}}")
137
- add( "/page/your_details/address_history/address__99", address )
138
- renumber( "/page/your_details/address_history" )
139
- next
140
- end
219
+ on_answer "/page/children/child__(\\d+)/name" do |question,path, params, answer|
220
+ res = validate( answer, ["firstname", "surname"] )
221
+ next res if !res.empty?
141
222
 
142
- answer_with( question, { "_summary" => "Provided" } )
223
+ name = "#{answer['firstname']} #{answer['middlenames']} #{answer['surname']}".squish
224
+ formatted_name = name.split( " ").map{ |n| n.capitalize }.join( " ")
225
+ answer_with( question, { "_summary" => formatted_name } )
143
226
  end
144
227
 
145
- on_answer( "/page/your_details" ) do |question, path, params, answer|
146
- answer_with( question, { "_summary" => "Provided" } )
228
+ on_answer "/page/children/child__(\\d+)/gender" do |question,path, params, answer|
229
+ answer_with( question, { "_summary" => answer } )
230
+ end
231
+
232
+ on_answer "/page/children/child__(\\d+)/dob" do |question,path, params, answer|
233
+ d = format_date answer
234
+ next { :answer_error => "Date of birth must be formated as dd/mm/yyyy" } if d.nil?
235
+ answer_with( question, { "_summary" => d } )
236
+ end
237
+
238
+ on_answer "/page/children/child__(\\d+)/own_child" do |question,path, params, answer|
239
+ answer_with( question, { "_summary" => answer } )
147
240
  end
148
241
 
149
- on_answer( "/page/your_details" ) do |question, path, params, answer|
242
+ on_answer "/page/children/child__(\\d+)" do |question,path, params, answer|
243
+ if params.include?("remove_child")
244
+ remove path
245
+ renumber "/page/children"
246
+ next
247
+ end
248
+ name = doop["#{path}/name/_answer"]
249
+ answer_with( question, { "_summary" => doop["#{path}/name/_summary"] } )
250
+ end
251
+
252
+ on_answer "/page/children" do |question, path, params, answer|
253
+ if params.include?("add_child")
254
+ add( "/page/children/child__99", YAML.load( child_yaml )["child__1"] )
255
+ renumber( "/page/children" )
256
+ next
257
+ end
150
258
  answer_with( question, { "_summary" => "Provided" } )
151
259
  end
152
260
 
153
- on_answer( "/page/summary/terms_and_conditions" ) do |question, path, params, answer|
154
- answer_with( question, { "_summary" => "Accepted" } )
261
+ on_answer "/page/declaration" do |question, path, params, answer |
262
+ { :redirect => "https://github.com/coder36/doop" }
155
263
  end
156
264
 
157
265
  end
158
266
  end
159
267
 
268
+ end
269
+
160
270
 
271
+ def format_date d
272
+ begin
273
+ return nil if d.length != 10
274
+ Date.strptime( d, "%d/%m/%Y" ).strftime( "%-d %B %Y" )
275
+ rescue
276
+ nil
277
+ end
278
+ end
279
+
280
+ def validate answer,fields=nil
281
+ res = {}
282
+
283
+ if fields == nil
284
+ res["answer_error".to_sym] = "Can not be empty" if answer.squish.empty?
285
+ return res
286
+ end
287
+
288
+ fields.each do |f|
289
+ res["#{f}_error".to_sym] = "Can not be empty" if answer[f].squish.empty?
290
+ end
291
+ res
161
292
  end
162
293
 
294
+ def is_number num
295
+ num =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/
296
+ end