doop 0.0.3.1 → 0.0.4.1

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