govuk_navigation_helpers 7.3.0 → 7.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,262 @@
1
+ {
2
+ "title": "Learn to drive a car: step by step",
3
+ "base_path": "/learn-to-drive-a-car",
4
+ "description": "<p>Check what you need to do to learn to drive.</p>",
5
+ "links": {
6
+ "breadcrumbs": [
7
+ { "title": "Home", "url": "/" },
8
+ { "title": "Driving and transport", "url": "/browse/driving"},
9
+ { "title": "Learning to drive", "url": "/browse/driving/learning-to-drive"}
10
+ ]
11
+ },
12
+ "ab_test_prefix": "",
13
+ "related_paths": [
14
+ "/apply-for-your-full-driving-licence",
15
+ "/automatic-driving-licence-to-manual",
16
+ "/complain-about-a-driving-instructor",
17
+ "/driving-licence-fees",
18
+ "/driving-test-cost",
19
+ "/dvlaforms",
20
+ "/find-theory-test-pass-number",
21
+ "/government/publications/application-for-refunding-out-of-pocket-expenses",
22
+ "/government/publications/drivers-record-for-learner-drivers",
23
+ "/government/publications/driving-instructor-grades-explained",
24
+ "/government/publications/know-your-traffic-signs",
25
+ "/government/publications/l-plate-size-rules",
26
+ "/guidance/rules-for-observing-driving-tests",
27
+ "/report-an-illegal-driving-instructor",
28
+ "/report-driving-medical-condition",
29
+ "/report-driving-test-impersonation",
30
+ "/seat-belts-law",
31
+ "/speed-limits",
32
+ "/track-your-driving-licence-application",
33
+ "/vehicle-insurance",
34
+ "/driving-lessons-learning-to-drive/practising-with-family-or-friends",
35
+ "/driving-lessons-learning-to-drive/taking-driving-lessons",
36
+ "/driving-lessons-learning-to-drive/using-l-and-p-plates",
37
+ "/driving-test",
38
+ "/driving-test/changes-december-2017",
39
+ "/driving-test/disability-health-condition-or-learning-difficulty",
40
+ "/driving-test/driving-test-faults-result",
41
+ "/driving-test/test-cancelled-bad-weather",
42
+ "/driving-test/using-your-own-car",
43
+ "/driving-test/what-happens-during-test",
44
+ "/pass-plus/apply-for-a-pass-plus-certificate",
45
+ "/pass-plus/booking-pass-plus",
46
+ "/pass-plus/car-insurance-discounts",
47
+ "/pass-plus/local-councils-offering-discounts",
48
+ "/pass-plus/how-pass-plus-training-works",
49
+ "/theory-test",
50
+ "/theory-test/hazard-perception-test",
51
+ "/theory-test/if-you-have-safe-road-user-award",
52
+ "/theory-test/multiple-choice-questions",
53
+ "/theory-test/pass-mark-and-result",
54
+ "/theory-test/reading-difficulty-disability-or-health-condition"
55
+ ],
56
+ "tasklist": {
57
+ "groups": [
58
+ [
59
+ {
60
+ "title": "Check you're allowed to drive",
61
+ "contents": [
62
+ {
63
+ "type": "paragraph",
64
+ "text": "Most people can start learning to drive when they’re 17."
65
+ },
66
+ {
67
+ "type": "list",
68
+ "style": "required",
69
+ "contents": [
70
+ {
71
+ "href": "/vehicles-can-drive",
72
+ "text": "Check what age you can drive"
73
+ },
74
+ {
75
+ "href": "/legal-obligations-drivers-riders",
76
+ "text": "Requirements for driving legally"
77
+ },
78
+ {
79
+ "href": "/driving-eyesight-rules",
80
+ "text": "Driving eyesight rules"
81
+ }
82
+ ]
83
+ }
84
+ ]
85
+ }
86
+ ],
87
+ [
88
+ {
89
+ "title": "Get a provisional driving licence",
90
+ "contents": [
91
+ {
92
+ "type": "list",
93
+ "style": "required",
94
+ "contents": [
95
+ {
96
+ "href": "/apply-first-provisional-driving-licence",
97
+ "text": "Apply for your first provisional driving licence"
98
+ }
99
+ ]
100
+ }
101
+ ]
102
+ }
103
+ ],
104
+ [
105
+ {
106
+ "title": "Driving lessons and practice",
107
+ "contents": [
108
+ {
109
+ "type": "paragraph",
110
+ "text": "You need a provisional driving licence to take lessons or practice."
111
+ },
112
+ {
113
+ "type": "list",
114
+ "style": "required",
115
+ "contents": [
116
+ {
117
+ "href": "/guidance/the-highway-code",
118
+ "text": "The Highway Code"
119
+ },
120
+ {
121
+ "href": "/driving-lessons-learning-to-drive",
122
+ "text": "Taking driving lessons"
123
+ },
124
+ {
125
+ "href": "/find-driving-schools-and-lessons",
126
+ "text": "Find driving schools, lessons and instructors"
127
+ },
128
+ {
129
+ "href": "/government/publications/car-show-me-tell-me-vehicle-safety-questions",
130
+ "text": "Practise vehicle safety questions"
131
+ }
132
+ ]
133
+ }
134
+ ]
135
+ },
136
+ {
137
+ "title": "Prepare for your theory test",
138
+ "contents": [
139
+ {
140
+ "type": "list",
141
+ "style": "required",
142
+ "contents": [
143
+ {
144
+ "href": "/theory-test/revision-and-practice",
145
+ "text": "Theory test revision and practice"
146
+ },
147
+ {
148
+ "href": "/take-practice-theory-test",
149
+ "text": "Take a practice theory test"
150
+ },
151
+ {
152
+ "href": "https://www.safedrivingforlife.info/shop/product/official-dvsa-theory-test-kit-app-app",
153
+ "text": "Theory and hazard perception test app"
154
+ }
155
+ ]
156
+ }
157
+ ]
158
+ }
159
+ ],
160
+ [
161
+ {
162
+ "title": "Book and manage your theory test",
163
+ "contents": [
164
+ {
165
+ "type": "paragraph",
166
+ "text": "You need a provisional driving licence to book your theory test."
167
+ },
168
+ {
169
+ "type": "list",
170
+ "style": "required",
171
+ "contents": [
172
+ {
173
+ "href": "/book-theory-test",
174
+ "text": "Book your theory test"
175
+ },
176
+ {
177
+ "href": "/theory-test/what-to-take",
178
+ "text": "What to take to your test"
179
+ },
180
+ {
181
+ "href": "/change-theory-test",
182
+ "text": "Change your theory test appointment"
183
+ },
184
+ {
185
+ "href": "/check-theory-test",
186
+ "text": "Check your theory test appointment details"
187
+ },
188
+ {
189
+ "href": "/cancel-theory-test",
190
+ "text": "Cancel your theory test"
191
+ }
192
+ ]
193
+ }
194
+ ]
195
+ }
196
+ ],
197
+ [
198
+ {
199
+ "title": "Book and manage your driving test",
200
+ "contents": [
201
+ {
202
+ "type": "paragraph",
203
+ "text": "You must pass your theory test before you can book your driving test."
204
+ },
205
+ {
206
+ "type": "list",
207
+ "style": "required",
208
+ "contents": [
209
+ {
210
+ "href": "/book-driving-test",
211
+ "text": "Book your driving test"
212
+ },
213
+ {
214
+ "href": "/driving-test/what-to-take",
215
+ "text": "What to take to your test"
216
+ },
217
+ {
218
+ "href": "/change-driving-test",
219
+ "text": "Change your driving test appointment"
220
+ },
221
+ {
222
+ "href": "/check-driving-test",
223
+ "text": "Check your driving test appointment details"
224
+ },
225
+ {
226
+ "href": "/cancel-driving-test",
227
+ "text": "Cancel your driving test"
228
+ }
229
+ ]
230
+ }
231
+ ]
232
+ }
233
+ ],
234
+ [
235
+ {
236
+ "title": "When you pass",
237
+ "contents": [
238
+ {
239
+ "type": "paragraph",
240
+ "text": "You can start driving as soon as you pass your driving test."
241
+ },
242
+ {
243
+ "type": "paragraph",
244
+ "text": "You must have an insurance policy that allows you to drive without supervision."
245
+ },
246
+ {
247
+ "type": "list",
248
+ "style": "required",
249
+ "style": "required",
250
+ "contents": [
251
+ {
252
+ "href": "/pass-plus",
253
+ "text": "Find out about Pass Plus training courses"
254
+ }
255
+ ]
256
+ }
257
+ ]
258
+ }
259
+ ]
260
+ ]
261
+ }
262
+ }
@@ -19,6 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency "gds-api-adapters", ">= 43.0"
22
+ spec.add_runtime_dependency 'govuk_ab_testing', '~> 2.4'
23
+ spec.add_runtime_dependency 'activesupport', '~> 5.1'
22
24
 
23
25
  spec.add_development_dependency "bundler", "~> 1.6"
24
26
  spec.add_development_dependency "rake", "~> 10.0"
@@ -1,11 +1,20 @@
1
- require "govuk_navigation_helpers/version"
2
- require "govuk_navigation_helpers/breadcrumbs"
3
- require "govuk_navigation_helpers/related_items"
4
- require "govuk_navigation_helpers/taxon_breadcrumbs"
5
- require "govuk_navigation_helpers/taxonomy_sidebar"
6
- require "govuk_navigation_helpers/related_navigation_sidebar"
7
- require "govuk_navigation_helpers/rummager_taxonomy_sidebar_links"
8
- require "govuk_navigation_helpers/curated_taxonomy_sidebar_links"
1
+ require 'active_support'
2
+ require 'active_support/core_ext/hash/keys'
3
+ require 'active_support/core_ext/object/blank'
4
+
5
+ require 'govuk_ab_testing'
6
+
7
+ require_relative "govuk_navigation_helpers/version"
8
+ require_relative "govuk_navigation_helpers/breadcrumbs"
9
+ require_relative "govuk_navigation_helpers/related_items"
10
+ require_relative "govuk_navigation_helpers/taxon_breadcrumbs"
11
+ require_relative "govuk_navigation_helpers/taxonomy_sidebar"
12
+ require_relative "govuk_navigation_helpers/related_navigation_sidebar"
13
+ require_relative "govuk_navigation_helpers/rummager_taxonomy_sidebar_links"
14
+ require_relative "govuk_navigation_helpers/curated_taxonomy_sidebar_links"
15
+
16
+ require_relative "govuk_navigation_helpers/tasklist_content"
17
+ require_relative "govuk_navigation_helpers/current_tasklist_ab_test"
9
18
 
10
19
  module GovukNavigationHelpers
11
20
  class NavigationHelper
@@ -0,0 +1,70 @@
1
+ module GovukNavigationHelpers
2
+ class CurrentTasklistAbTest
3
+ TASKLIST_HEADER_DIMENSION = 44
4
+ TASKLIST_SIDEBAR_DIMENSION = 66
5
+ PUBLICATION_PAGE = "/government/publications/car-show-me-tell-me-vehicle-safety-questions".freeze
6
+
7
+ def initialize(current_tasklist:, request:)
8
+ @current_tasklist = current_tasklist
9
+ @ab_test_prefix = current_tasklist.ab_test_prefix if current_tasklist
10
+ @request = request
11
+ end
12
+
13
+ def eligible?
14
+ !! current_tasklist
15
+ end
16
+
17
+ def header
18
+ @header ||= set_ab_test(
19
+ name: "#{ab_test_prefix}TaskListHeader",
20
+ dimension: TASKLIST_HEADER_DIMENSION
21
+ )
22
+ end
23
+
24
+ def sidebar
25
+ @sidebar ||= set_ab_test(
26
+ name: "#{ab_test_prefix}TaskListSidebar",
27
+ dimension: TASKLIST_SIDEBAR_DIMENSION
28
+ )
29
+ end
30
+
31
+ def sidebar_variant
32
+ @sidebar_variant ||=
33
+ sidebar.requested_variant(request.headers)
34
+ end
35
+
36
+ def header_variant
37
+ @header_variant ||=
38
+ header.requested_variant(request.headers)
39
+ end
40
+
41
+ def show_tasklist_sidebar?
42
+ sidebar_variant.variant?('B')
43
+ end
44
+
45
+ def show_tasklist_header?
46
+ header_variant.variant?('B')
47
+ end
48
+
49
+ def set_response_header(response)
50
+ sidebar_variant.configure_response(response) if show_tasklist_sidebar?
51
+ header_variant.configure_response(response) if show_tasklist_header?
52
+ end
53
+
54
+ def publication_with_sidebar?
55
+ show_tasklist_sidebar? && request.path == PUBLICATION_PAGE
56
+ end
57
+
58
+ def publication_with_sidebar_template_name
59
+ "publication_with_tasklist_sidebar"
60
+ end
61
+
62
+ private
63
+
64
+ attr_reader :current_tasklist, :ab_test_prefix, :request
65
+
66
+ def set_ab_test(name:, dimension:)
67
+ GovukAbTesting::AbTest.new(name, dimension: dimension)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,120 @@
1
+ module GovukNavigationHelpers
2
+ class TasklistContent
3
+ TASKLIST_NAMES = %w(
4
+ get-a-divorce
5
+ end-a-civil-partnership
6
+ learn-to-drive-a-car
7
+ ).freeze
8
+
9
+ def self.current_tasklist(path)
10
+ TASKLIST_NAMES.each do |tasklist_name|
11
+ tasklist = new(file_name: tasklist_name, path: path)
12
+ return tasklist if tasklist.current?
13
+ end
14
+ nil
15
+ end
16
+
17
+ def initialize(file_name: nil, path: nil)
18
+ @file_name = file_name
19
+ @path = path
20
+ end
21
+
22
+ def title
23
+ parsed_file.dig(:title)
24
+ end
25
+
26
+ def base_path
27
+ parsed_file.dig(:base_path)
28
+ end
29
+
30
+ def tasklist
31
+ parsed_file.dig(:tasklist)
32
+ end
33
+
34
+ def ab_test_prefix
35
+ parsed_file.dig(:ab_test_prefix)
36
+ end
37
+
38
+ def skip_link
39
+ "##{groups.flatten.first[:title].downcase.tr(' ', '-')}"
40
+ end
41
+
42
+ def primary_paths
43
+ primary_content.map { |content|
44
+ content[:href] unless content[:href].start_with?('http')
45
+ }.select(&:present?)
46
+ end
47
+
48
+ def groups
49
+ tasklist.dig(:groups)
50
+ end
51
+
52
+ def related_paths
53
+ parsed_file.dig(:related_paths)
54
+ end
55
+
56
+ def set_current_task
57
+ set_task_as_active_if_current_page
58
+ end
59
+
60
+ def is_page_included_in_ab_test?
61
+ primary_paths.include?(path) ||
62
+ related_paths.include?(path)
63
+ end
64
+
65
+ def current?
66
+ primary_paths.include?(path) ||
67
+ related_paths.include?(path)
68
+ end
69
+
70
+ private
71
+
72
+ attr_reader :file_name, :file, :path
73
+
74
+ def set_task_as_active_if_current_page
75
+ counter = 0
76
+
77
+ groups.each_with_index.each do |grouped_steps, group_index|
78
+ grouped_steps.each do |step|
79
+ counter += 1
80
+
81
+ step[:contents].each do |content|
82
+ next unless content[:contents]
83
+
84
+ content[:contents].each do |link|
85
+ if link[:href] == path
86
+ link[:active] = true
87
+ tasklist[:show_step] = counter
88
+ tasklist[:highlight_group] = group_index + 1
89
+ return tasklist
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ tasklist
97
+ end
98
+
99
+ def primary_content
100
+ primary_content = groups.flat_map do |grouped_steps|
101
+ grouped_steps.flat_map do |group|
102
+ group[:contents].select { |content| content[:contents] }
103
+ end
104
+ end
105
+
106
+ primary_content.flat_map { |hash| hash[:contents] }
107
+ end
108
+
109
+ def parsed_file
110
+ @parsed_file ||=
111
+ JSON.parse(
112
+ File.read(
113
+ File.join(File.dirname(__FILE__), "../../", "config", "tasklists", "#{file_name}.json")
114
+ )
115
+ ).deep_symbolize_keys.tap do |json_file|
116
+ json_file[:tasklist].merge!(small: true, heading_level: 3)
117
+ end
118
+ end
119
+ end
120
+ end