metadata_presenter 2.16.12 → 2.17.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ed9df3a1d56df6ff57746e7976d578741de8df0214f1080fbc661a087753bea
4
- data.tar.gz: 85783ae10996111d01c523cff076ca0b82634cac855dfdf32f88665c5187a6d7
3
+ metadata.gz: 69339189940b628d7be7e2a6515c4382cc44d5726d3ecac9adb86b975cd1d5d8
4
+ data.tar.gz: 1d5724fabda8bf28f79d6d31b28f348d9c144f63f49b3ac945e9f4f7a372bd61
5
5
  SHA512:
6
- metadata.gz: 9c9fc79586eef3d60144b6bdb0093adf3a0ea07db6833a504d65a0bd96c474a66009a1900d071d51370db0857231430b7e18d2777bb7748d216b708f13bd5702
7
- data.tar.gz: 27b1519b719d9f0c845271523e4afe4f89366e373868e2b18b10dd3d5360b49b22ba384789dd6a8c3cca46dab4599114a5845a8ecd47d833af8a832c1fcf1f7e
6
+ metadata.gz: 768d25f256f70733fb563fc75604e90690c36e78d7a8191b8d468c1b678e17d7e158e88bcfda50f028c40e21aeb6de3ca509650e21f1323965a3a01923460eff
7
+ data.tar.gz: 026c6ba54417b041a173a8523b11baadb3e15a18eaaab57ace3db3376bf47c6b46059ea6706900940deaeaf4edb61f9959ee6d7b9c2b098a61697739845dfda8
@@ -35,6 +35,21 @@ module MetadataPresenter
35
35
  end
36
36
  helper_method :answered?
37
37
 
38
+ def analytics_cookie_name
39
+ @analytics_cookie_name ||= "analytics-#{service.service_name.parameterize}"
40
+ end
41
+ helper_method :analytics_cookie_name
42
+
43
+ def allow_analytics?
44
+ no_analytics_cookie? || cookies[analytics_cookie_name] == 'accepted'
45
+ end
46
+ helper_method :allow_analytics?
47
+
48
+ def show_cookie_banner?
49
+ no_analytics_cookie? && analytics_tags_present?
50
+ end
51
+ helper_method :show_cookie_banner?
52
+
38
53
  private
39
54
 
40
55
  def not_found
@@ -44,5 +59,15 @@ module MetadataPresenter
44
59
  def redirect_to_page(url)
45
60
  redirect_to File.join(request.script_name, url)
46
61
  end
62
+
63
+ def analytics_tags_present?
64
+ Rails.application.config.supported_analytics.values.flatten.any? do |analytic|
65
+ ENV[analytic].present?
66
+ end
67
+ end
68
+
69
+ def no_analytics_cookie?
70
+ cookies[analytics_cookie_name].blank?
71
+ end
47
72
  end
48
73
  end
@@ -34,7 +34,7 @@ class MetadataPresenter::Service < MetadataPresenter::Metadata
34
34
  end
35
35
 
36
36
  def start_page
37
- pages.first
37
+ pages.find { |page| page.type == 'page.start' }
38
38
  end
39
39
 
40
40
  def service_slug
@@ -6,41 +6,42 @@ module MetadataPresenter
6
6
  @service = service
7
7
  @user_data = user_data
8
8
  @pages = [service.start_page]
9
- @current_page = current_page || service.pages[-1]
9
+ @current_page = current_page
10
10
  end
11
11
 
12
12
  delegate :last, to: :all
13
13
 
14
14
  def all
15
- page_uuid = service.start_page.uuid
15
+ next_object = service.start_page
16
16
 
17
17
  service.flow.size.times do
18
- break if page_uuid == current_page.uuid
19
-
20
- flow_object = service.flow_object(page_uuid)
21
-
22
- if flow_object.branch?
23
- page = EvaluateConditionals.new(
24
- service: service,
25
- flow: flow_object,
26
- user_data: user_data
27
- ).page
28
- page_uuid = page.uuid
29
- else
30
- page_uuid = flow_object.default_next
31
- page = service.find_page_by_uuid(page_uuid)
32
- end
33
-
34
- @pages.push(page) if page && page.uuid != current_page.uuid
18
+ break if next_object.blank? || next_object.uuid == current_page&.uuid
19
+
20
+ flow_object = service.flow_object(next_object.uuid)
21
+ next_object = flow_object.branch? ? evaluated_page(flow_object) : next_flow_object(flow_object.default_next)
22
+ @pages.push(next_object) if page_in_flow?(next_object)
35
23
  end
36
24
 
37
25
  @pages
38
26
  end
39
27
 
40
- def latest_pages
41
- index = service.pages.index(current_page).to_i - 1
28
+ private
29
+
30
+ def evaluated_page(flow_object)
31
+ EvaluateConditionals.new(
32
+ service: service,
33
+ flow: flow_object,
34
+ user_data: user_data
35
+ ).page
36
+ end
37
+
38
+ def next_flow_object(uuid)
39
+ obj = service.flow_object(uuid)
40
+ obj.branch? ? obj : service.find_page_by_uuid(uuid)
41
+ end
42
42
 
43
- service.pages[0..index]
43
+ def page_in_flow?(obj)
44
+ obj.is_a?(MetadataPresenter::Page) && obj.uuid != current_page&.uuid
44
45
  end
45
46
  end
46
47
  end
@@ -4,7 +4,7 @@
4
4
  <title><%= service.service_name %></title>
5
5
  <%= csrf_meta_tags %>
6
6
  <%= csp_meta_tag %>
7
-
7
+
8
8
  <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
9
9
  <link rel="shortcut icon" sizes="16x16 32x32 48x48" href="<%= asset_pack_url('media/images/favicon.ico') %>" type="image/x-icon" />
10
10
  <link rel="mask-icon" href="<%= asset_pack_url('media/images/govuk-mask-icon.svg') %>" color="blue">
@@ -15,9 +15,17 @@
15
15
 
16
16
  <%= stylesheet_pack_tag 'govuk' %>
17
17
  <%= stylesheet_link_tag 'application', media: 'all' %>
18
+
19
+ <% if allow_analytics? %>
20
+ <%= render template: 'metadata_presenter/analytics/analytics' %>
21
+ <% end %>
18
22
  </head>
19
23
 
20
24
  <body class="govuk-template__body">
25
+ <% if show_cookie_banner? %>
26
+ <%= render partial: 'metadata_presenter/analytics/cookie_banner' %>
27
+ <% end %>
28
+
21
29
  <%= render template: 'metadata_presenter/header/show' %>
22
30
  <div class="govuk-width-container govuk-body-m">
23
31
  <main class="govuk-main-wrapper govuk-main-wrapper--auto-spacing" id="main-content" role="main">
@@ -0,0 +1,63 @@
1
+ <div class="govuk-cookie-banner" id="govuk-cookie-banner" data-nosnippet role="region" aria-label="<%= t('analytics.heading', service_name: service.service_name) %>">
2
+ <div class="govuk-cookie-banner__message govuk-width-container" id="govuk-cookie-banner-message">
3
+
4
+ <div class="govuk-grid-row">
5
+ <div class="govuk-grid-column-two-thirds">
6
+ <h2 class="govuk-cookie-banner__heading govuk-heading-m">
7
+ <%= t('analytics.heading', service_name: service.service_name) %>
8
+ </h2>
9
+
10
+ <div class="govuk-cookie-banner__content">
11
+ <p class="govuk-body"><%= t('analytics.body_1') %></p>
12
+ <p class="govuk-body"><%= t('analytics.body_2') %></p>
13
+ </div>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="govuk-button-group">
18
+ <button type="button" class="govuk-button" data-module="govuk-button" onclick='analytics.accept("<%= analytics_cookie_name %>")'>
19
+ <%= t('analytics.accept') %>
20
+ </button>
21
+ <button type="button" class="govuk-button" data-module="govuk-button" onclick='analytics.reject("<%= analytics_cookie_name %>")'>
22
+ <%= t('analytics.reject') %>
23
+ </button>
24
+ <a class="govuk-link" href="/cookies"><%= t('analytics.view_cookies') %></a>
25
+ </div>
26
+ </div>
27
+
28
+ <div class="govuk-cookie-banner__message govuk-width-container" id="govuk-cookie-banner-message-accepted" role="alert" style="display: none;">
29
+ <div class="govuk-grid-row">
30
+ <div class="govuk-grid-column-two-thirds">
31
+ <div class="govuk-cookie-banner__content">
32
+ <p class="govuk-body">
33
+ <%= t('analytics.confirmation', action: t('analytics.accepted')) %>
34
+ </p>
35
+ </div>
36
+ </div>
37
+ </div>
38
+
39
+ <div class="govuk-button-group">
40
+ <button class="govuk-button" data-module="govuk-button" onclick="analytics.hideCookieBanner()">
41
+ <%= t('analytics.hide') %>
42
+ </button>
43
+ </div>
44
+ </div>
45
+
46
+ <div class="govuk-cookie-banner__message govuk-width-container" id="govuk-cookie-banner-message-rejected" role="alert" style="display: none;">
47
+ <div class="govuk-grid-row">
48
+ <div class="govuk-grid-column-two-thirds">
49
+ <div class="govuk-cookie-banner__content">
50
+ <p class="govuk-body">
51
+ <%= t('analytics.confirmation', action: t('analytics.rejected')) %>
52
+ </p>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="govuk-button-group">
58
+ <button class="govuk-button" data-module="govuk-button" onclick="analytics.hideCookieBanner()">
59
+ <%= t('analytics.hide') %>
60
+ </button>
61
+ </div>
62
+ </div>
63
+ </div>
@@ -0,0 +1,10 @@
1
+ <!-- Global site tag (gtag.js) - Google Analytics -->
2
+ <script async src="https://www.googletagmanager.com/gtag/js?id=<%= analytic_tag %>"></script>
3
+ <script>
4
+ window.dataLayer = window.dataLayer || [];
5
+ function gtag(){dataLayer.push(arguments);}
6
+ gtag('js', new Date());
7
+
8
+ gtag('config', '<%= analytic_tag %>');
9
+ </script>
10
+ <!-- End Global site tag (gtag.js) - Google Analytics -->
@@ -0,0 +1,5 @@
1
+ <% analytics.each do |analytic| %>
2
+ <% if ENV[analytic].present? %>
3
+ <%= render partial: "metadata_presenter/analytics/#{analytic.downcase}", locals: { analytic_tag: ENV[analytic] } %>
4
+ <% end %>
5
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <!-- Google Tag Manager -->
2
+ <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
3
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
4
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
5
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
6
+ })(window,document,'script','dataLayer','<%= analytic_tag %>');</script>
7
+ <!-- End Google Tag Manager -->
@@ -0,0 +1,11 @@
1
+ <!-- Google Universal Analytics -->
2
+ <script>
3
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
4
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
5
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
6
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
7
+
8
+ ga('create', '<%= analytic_tag %>', 'auto');
9
+ ga('send', 'pageview');
10
+ </script>
11
+ <!-- End Google Universal Analytics -->
@@ -0,0 +1,3 @@
1
+ <% Rails.application.config.supported_analytics.each do |provider, analytics| %>
2
+ <%= render partial: "metadata_presenter/analytics/#{provider}", locals: { analytics: analytics } %>
3
+ <% end %>
@@ -0,0 +1 @@
1
+ Rails.application.config.supported_analytics = { google: %w[UA GTM GA4] }
@@ -0,0 +1,12 @@
1
+ en:
2
+ analytics:
3
+ heading: Cookies on %{service_name}
4
+ body_1: We use some essential cookies to make this service work.
5
+ body_2: We'd also like to use analytics cookies so we can understand how you use the service and make improvements.
6
+ accept: Accept analytics cookies
7
+ reject: Reject analytics cookies
8
+ view_cookies: View cookies
9
+ accepted: accepted
10
+ rejected: rejected
11
+ confirmation: You've %{action} analytics cookies.
12
+ hide: Hide this message
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '2.16.12'.freeze
2
+ VERSION = '2.17.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metadata_presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.16.12
4
+ version: 2.17.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoJ Forms
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-01 00:00:00.000000000 Z
11
+ date: 2022-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: govuk_design_system_formbuilder
@@ -333,6 +333,12 @@ files:
333
333
  - app/validators/metadata_presenter/word_count.rb
334
334
  - app/views/errors/404.html
335
335
  - app/views/layouts/metadata_presenter/application.html.erb
336
+ - app/views/metadata_presenter/analytics/_cookie_banner.html.erb
337
+ - app/views/metadata_presenter/analytics/_ga4.html.erb
338
+ - app/views/metadata_presenter/analytics/_google.html.erb
339
+ - app/views/metadata_presenter/analytics/_gtm.html.erb
340
+ - app/views/metadata_presenter/analytics/_ua.html.erb
341
+ - app/views/metadata_presenter/analytics/analytics.html.erb
336
342
  - app/views/metadata_presenter/attribute/_body.html.erb
337
343
  - app/views/metadata_presenter/attribute/_heading.html.erb
338
344
  - app/views/metadata_presenter/attribute/_lede.html.erb
@@ -363,7 +369,9 @@ files:
363
369
  - config/initializers/default_text.rb
364
370
  - config/initializers/inflections.rb
365
371
  - config/initializers/schemas.rb
372
+ - config/initializers/supported_analytics.rb
366
373
  - config/initializers/supported_components.rb
374
+ - config/locales/en.yml
367
375
  - config/routes.rb
368
376
  - default_metadata/component/autocomplete.json
369
377
  - default_metadata/component/checkboxes.json