govuk_publishing_components 5.7.0 → 6.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (21) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/stylesheets/govuk_publishing_components/components/_feedback.scss +4 -0
  3. data/app/assets/stylesheets/govuk_publishing_components/components/_input.scss +6 -19
  4. data/app/assets/stylesheets/govuk_publishing_components/components/_label.scss +7 -0
  5. data/app/views/govuk_publishing_components/components/_input.html.erb +1 -1
  6. data/app/views/govuk_publishing_components/components/docs/input.yml +2 -0
  7. data/app/views/govuk_publishing_components/components/docs/label.yml +10 -2
  8. data/lib/govuk_publishing_components.rb +11 -6
  9. data/lib/govuk_publishing_components/app_helpers/taxon_breadcrumbs.rb +81 -0
  10. data/lib/govuk_publishing_components/presenters/breadcrumbs.rb +39 -0
  11. data/lib/govuk_publishing_components/presenters/content_item.rb +156 -0
  12. data/lib/govuk_publishing_components/presenters/contextual_navigation.rb +5 -13
  13. data/lib/govuk_publishing_components/presenters/curated_taxonomy_sidebar_links.rb +99 -0
  14. data/lib/govuk_publishing_components/presenters/rummager_taxonomy_sidebar_links.rb +62 -0
  15. data/lib/govuk_publishing_components/presenters/services.rb +12 -0
  16. data/lib/govuk_publishing_components/{app_helpers → presenters}/step_nav_helper.rb +35 -2
  17. data/lib/govuk_publishing_components/presenters/taxon_breadcrumbs.rb +46 -0
  18. data/lib/govuk_publishing_components/presenters/taxonomy_sidebar.rb +47 -0
  19. data/lib/govuk_publishing_components/version.rb +1 -1
  20. metadata +25 -18
  21. data/lib/govuk_publishing_components/app_helpers/step_nav.rb +0 -33
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce80409c0f807cc7819ef704621d4ea7fba120eb3c236cfdb0f08416989273fb
4
- data.tar.gz: 3f80608cb59362aac2d3be655530e0da2c985847f93c4a50ef5413d5d4b5c7af
3
+ metadata.gz: e25ba48b6617e7a2bdabcb5bdc0e4619f722377f6e0746e3427f0494bfed2d91
4
+ data.tar.gz: e7f00227e7eb544f5a8361ecb0c2f5d5f52440d79ec346ef72f019c6dfb3c6fb
5
5
  SHA512:
6
- metadata.gz: 5e9a0fd1f8c25254e8d945c05cda605ebbdbad784916ca5544e9f77e9eb6c0f86f8e94f6f507dd366840d1935374c6cfbe6f8d92498eaa25dc4a43c2df6d53d1
7
- data.tar.gz: 1f81579d4f44e2e62be07291827ca3ace6ab1ca1002a2f54467a961a3ecf1721a45fd27b7b54daeaf2da6fb42e1e588f14c3c551d692e14b450d0054b6e4da6c
6
+ metadata.gz: 1dc324718d91df1fa4d7ab6bafcf56ee93c542f0535b2ec736af19a24fead4564b6aa23275d7d70a3a3b5e70ffd346a209da2e5655f9b01407a85eccbf6e1c64
7
+ data.tar.gz: ab26b2dec0f31316062ffe67964b8cbcdf1b9274b2349895cf7314505fd61c7977fc35d7a0120a4373fae15a0c729fd14e41da4f178be1030b39239ed8a1ba1a
@@ -77,6 +77,10 @@
77
77
  .gem-c-feedback__prompt-link:link,
78
78
  .gem-c-feedback__prompt-link:visited {
79
79
  color: $white;
80
+
81
+ &:focus {
82
+ color: $link-colour;
83
+ }
80
84
  }
81
85
 
82
86
  .gem-c-feedback__prompt-link--wrong {
@@ -22,26 +22,13 @@ input[type=text].gem-c-input {
22
22
 
23
23
  // Disable inner shadow and remove rounded corners
24
24
  appearance: none;
25
- }
26
- // scss-lint:enable QualifyingElement
27
25
 
28
- @media (min-width: 40.0625em) {
29
- .govuk-c-input {
30
- margin-bottom: 30px;
26
+ &.gem-c-input:focus {
27
+ outline: $gem-focus-width solid $gem-focus-colour;
31
28
  }
32
- }
33
-
34
- .gem-c-input:focus {
35
- outline: $gem-focus-width solid $gem-focus-colour;
36
- }
37
29
 
38
- .gem-c-input--error {
39
- border: $gem-border-width-error solid $gem-error-colour;
40
- }
41
-
42
- // Replace this with the error message component.
43
- .gem-c-input__label-error {
44
- font-weight: bold;
45
- color: $gem-error-colour;
46
- padding-top: 4px;
30
+ &.gem-c-input--error {
31
+ border: $gem-border-width-error solid $gem-error-colour;
32
+ }
47
33
  }
34
+ // scss-lint:enable QualifyingElement
@@ -16,3 +16,10 @@
16
16
  color: $gem-secondary-text-colour;
17
17
  font-weight: 400;
18
18
  }
19
+
20
+ // TODO: Replace this with the error message component.
21
+ .gem-c-label__error {
22
+ font-weight: bold;
23
+ color: $gem-error-colour;
24
+ padding-top: 4px;
25
+ }
@@ -12,7 +12,7 @@
12
12
  text: label[:text],
13
13
  html_for: id,
14
14
  hint_text: error_message,
15
- hint_text_classes: "gem-c-input__label-error",
15
+ hint_text_classes: "gem-c-label__error",
16
16
  hint_id: hint_id,
17
17
  bold: error_message ? true : false,
18
18
  } %>
@@ -13,6 +13,8 @@ accessibility_criteria: |
13
13
  * be recognisable as form input elements
14
14
  * have correctly associated labels
15
15
  * be of the appropriate type for their use, e.g. password inputs should be of type 'password'
16
+
17
+ Labels use the [label component](/component-guide/label).
16
18
  examples:
17
19
  default:
18
20
  data:
@@ -5,9 +5,17 @@ body: |
5
5
 
6
6
  Forked from the upcoming [GOV.UK Frontend](https://github.com/alphagov/govuk-frontend), when GOV.UK Frontend release we can replace these source files.
7
7
  accessibility_criteria: |
8
- - have a text contrast ratio higher than 4.5:1 against the background colour to meet [WCAG AA](https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast)
8
+ All text must have a contrast ratio higher than 4.5:1 against the background colour to meet [WCAG AA](https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast)
9
+
10
+ Labels must:
11
+
9
12
  - have visible text
10
- - `hint_id` is matched with an `aria-describedby` property on the input your label is associated with.
13
+
14
+ Hint text must:
15
+
16
+ - be associated with an input. The `hint_id` must match the `aria-describedby` property on the input your label is associated with.
17
+
18
+ If hint text is within a label it will be announced in its entirity by screen readers. By putting the hint alongside labels and associating hints with inputs using `aria-describedby`, then screen readers will read the label, describe the type of input (eg radio) and then read additional text. It means users of screen readers can scan and skip options as easy as people making choices with sight. [A discussion of this approach](https://github.com/alphagov/govuk_elements/issues/574).
11
19
  examples:
12
20
  default:
13
21
  data:
@@ -1,14 +1,19 @@
1
1
  require "govuk_publishing_components/config"
2
2
  require "govuk_publishing_components/engine"
3
- require "govuk_publishing_components/presenters/step_by_step_nav_helper"
4
- require "govuk_publishing_components/presenters/related_navigation_helper"
5
3
  require "govuk_publishing_components/presenters/contextual_navigation"
6
4
  require "govuk_publishing_components/presenters/navigation_type"
5
+ require "govuk_publishing_components/presenters/related_navigation_helper"
6
+ require "govuk_publishing_components/presenters/step_by_step_nav_helper"
7
+ require "govuk_publishing_components/presenters/step_nav_helper"
8
+ require "govuk_publishing_components/presenters/breadcrumbs"
9
+ require "govuk_publishing_components/presenters/taxon_breadcrumbs"
10
+ require "govuk_publishing_components/presenters/services"
11
+ require "govuk_publishing_components/presenters/taxonomy_sidebar"
12
+ require "govuk_publishing_components/presenters/rummager_taxonomy_sidebar_links"
13
+ require "govuk_publishing_components/presenters/curated_taxonomy_sidebar_links"
14
+ require "govuk_publishing_components/presenters/content_item"
7
15
 
8
- require "govuk_publishing_components/app_helpers/step_nav"
9
- require "govuk_publishing_components/app_helpers/step_nav_helper"
16
+ require "govuk_publishing_components/app_helpers/taxon_breadcrumbs"
10
17
 
11
18
  module GovukPublishingComponents
12
- StepNavHelper = GovukPublishingComponents::AppHelpers::StepNavHelper
13
- StepNav = GovukPublishingComponents::AppHelpers::StepNav
14
19
  end
@@ -0,0 +1,81 @@
1
+ module GovukPublishingComponents
2
+ module AppHelpers
3
+ class TaxonBreadcrumbs
4
+ # @param content_item A taxon
5
+ def initialize(content_item)
6
+ @content_item = TaxonBreadcrumbs::ContentItem.new(content_item)
7
+ end
8
+
9
+ # Generate a breadcrumb trail for a taxon, using the taxon_parent link field
10
+ #
11
+ # @return [Hash] Payload for the GOV.UK breadcrumbs component
12
+ # @see https://govuk-component-guide.herokuapp.com/components/breadcrumbs
13
+ def breadcrumbs
14
+ ordered_parents = all_parents.map.with_index do |parent, index|
15
+ {
16
+ title: parent.title,
17
+ url: parent.base_path,
18
+ is_page_parent: index.zero?
19
+ }
20
+ end
21
+
22
+ ordered_parents << {
23
+ title: "Home",
24
+ url: "/",
25
+ is_page_parent: ordered_parents.empty?
26
+ }
27
+
28
+ ordered_parents.reverse
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :content_item
34
+
35
+ def all_parents
36
+ parents = []
37
+
38
+ direct_parent = content_item.parent_taxon
39
+ while direct_parent
40
+ parents << direct_parent
41
+ direct_parent = direct_parent.parent_taxon
42
+ end
43
+
44
+ parents
45
+ end
46
+
47
+ class ContentItem
48
+ attr_reader :content_item
49
+
50
+ def initialize(content_item)
51
+ @content_item = content_item
52
+ end
53
+
54
+ def parent_taxon
55
+ parent_taxons.first
56
+ end
57
+
58
+ def parent_taxons
59
+ @_parent_taxons ||= begin
60
+ content_item.dig("links", "parent_taxons")
61
+ .to_a
62
+ .select { |t| phase_is_live?(t) }
63
+ .map { |taxon| ContentItem.new(taxon) }.sort_by(&:title)
64
+ end
65
+ end
66
+
67
+ def phase_is_live?(taxon)
68
+ taxon["phase"] == "live"
69
+ end
70
+
71
+ def title
72
+ content_item.fetch("title")
73
+ end
74
+
75
+ def base_path
76
+ content_item.fetch("base_path")
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,39 @@
1
+ module GovukPublishingComponents
2
+ module Presenters
3
+ # @private
4
+ class Breadcrumbs
5
+ def initialize(content_item)
6
+ @content_item = ContentItem.new(content_item)
7
+ end
8
+
9
+ def breadcrumbs
10
+ ordered_parents = all_parents.map do |parent|
11
+ { title: parent.title, url: parent.base_path }
12
+ end
13
+
14
+ ordered_parents << { title: "Home", url: "/" }
15
+
16
+ {
17
+ breadcrumbs: ordered_parents.reverse
18
+ }
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :content_item
24
+
25
+ def all_parents
26
+ parents = []
27
+
28
+ direct_parent = content_item.parent
29
+ while direct_parent
30
+ parents << direct_parent
31
+
32
+ direct_parent = direct_parent.parent
33
+ end
34
+
35
+ parents
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,156 @@
1
+ module GovukPublishingComponents
2
+ module Presenters
3
+ # Simple wrapper around a content store representation of a content item.
4
+ # Works for both the main content item and the expanded links in the links
5
+ # hash.
6
+ #
7
+ # @private
8
+ class ContentItem
9
+ attr_reader :content_store_response
10
+
11
+ def initialize(content_store_response)
12
+ @content_store_response = content_store_response.to_h
13
+ end
14
+
15
+ def parent
16
+ parent_item = content_store_response.dig("links", "parent", 0)
17
+ return unless parent_item
18
+ ContentItem.new(parent_item)
19
+ end
20
+
21
+ def parent_taxon
22
+ # TODO: Determine what to do when there are multiple taxons/parents. For
23
+ # now just display the first of each.
24
+ parent_taxons.sort_by(&:title).first
25
+ end
26
+
27
+ def parent_taxons
28
+ @_parent_taxons ||= begin
29
+ taxon_links
30
+ .select { |t| phase_is_live?(t) }
31
+ .map { |taxon| ContentItem.new(taxon) }.sort_by(&:title)
32
+ end
33
+ end
34
+
35
+ def phase_is_live?(taxon)
36
+ taxon["phase"] == "live"
37
+ end
38
+
39
+ def mainstream_browse_pages
40
+ content_store_response.dig("links", "mainstream_browse_pages").to_a.map do |link|
41
+ ContentItem.new(link)
42
+ end
43
+ end
44
+
45
+ def title
46
+ content_store_response.fetch("title")
47
+ end
48
+
49
+ def base_path
50
+ content_store_response.fetch("base_path")
51
+ end
52
+
53
+ def description
54
+ content_store_response.fetch("description", "")
55
+ end
56
+
57
+ def content_id
58
+ content_store_response.fetch("content_id")
59
+ end
60
+
61
+ def related_links
62
+ content_store_response.dig("links", "ordered_related_items").to_a.map do |link|
63
+ ContentItem.new(link)
64
+ end
65
+ end
66
+
67
+ def curated_taxonomy_sidebar_links
68
+ content_store_response.dig("links", "ordered_related_items_overrides").to_a.map do |link|
69
+ ContentItem.new(link)
70
+ end
71
+ end
72
+
73
+ def related_ordered_items
74
+ content_store_response.dig("links", "ordered_related_items").to_a
75
+ end
76
+
77
+ def quick_links
78
+ content_store_response.dig("details", "quick_links").to_a
79
+ end
80
+
81
+ def related_collections
82
+ filter_link_type(content_store_response.dig("links", "document_collections").to_a, "document_collection")
83
+ end
84
+
85
+ def related_other_contacts
86
+ filter_link_type(content_store_response.dig("links", "related").to_a, "contact")
87
+ end
88
+
89
+ def related_organisations
90
+ filter_link_type(content_store_response.dig("links", "organisations").to_a, "organisation")
91
+ end
92
+
93
+ def related_policies
94
+ filter_link_type(content_store_response.dig("links", "related_policies").to_a, "policy")
95
+ end
96
+
97
+ def related_statistical_data_sets
98
+ filter_link_type(content_store_response.dig("links", "related_statistical_data_sets").to_a, "statistical_data_set")
99
+ end
100
+
101
+ def related_topics
102
+ filter_link_type(content_store_response.dig("links", "topics").to_a, "topic")
103
+ end
104
+
105
+ def related_topical_events
106
+ filter_link_type(content_store_response.dig("links", "topical_events").to_a, "topical_event")
107
+ end
108
+
109
+ def related_world_locations
110
+ content_store_response.dig("links", "world_locations").to_a
111
+ end
112
+
113
+ def related_worldwide_organisations
114
+ filter_link_type(content_store_response.dig("links", "worldwide_organisations").to_a, "worldwide_organisation")
115
+ end
116
+
117
+ def external_links
118
+ content_store_response.dig("details", "external_related_links").to_a
119
+ end
120
+
121
+ def as_taxonomy_sidebar_link
122
+ {
123
+ title: title,
124
+ link: base_path,
125
+ }
126
+ end
127
+
128
+ def ==(other)
129
+ content_id == other.content_id
130
+ end
131
+
132
+ def hash
133
+ content_id.hash
134
+ end
135
+
136
+ def eql?(other)
137
+ self == other
138
+ end
139
+
140
+ private
141
+
142
+ def taxon_links
143
+ # A normal content item's taxon links are stored in ["links"]["taxons"]
144
+ # whereas a Taxon content item's taxon links are stored in ["links"]["parent_taxons"]
145
+ # so here we cater for both possibilities
146
+ content_store_response.dig("links", "taxons") || content_store_response.dig("links", "parent_taxons") || []
147
+ end
148
+
149
+ def filter_link_type(links, type)
150
+ links.select do |link|
151
+ link["document_type"] == type
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
@@ -1,5 +1,3 @@
1
- require 'govuk_navigation_helpers'
2
-
3
1
  module GovukPublishingComponents
4
2
  module Presenters
5
3
  # @private
@@ -14,11 +12,11 @@ module GovukPublishingComponents
14
12
  end
15
13
 
16
14
  def taxonomy_sidebar
17
- nav_helper.taxonomy_sidebar
15
+ @taxonomy_sidebar ||= TaxonomySidebar.new(content_item).sidebar
18
16
  end
19
17
 
20
18
  def taxon_breadcrumbs
21
- nav_helper.taxon_breadcrumbs
19
+ @taxon_breadcrumbs ||= TaxonBreadcrumbs.new(content_item).breadcrumbs
22
20
  end
23
21
 
24
22
  def breadcrumbs
@@ -37,23 +35,17 @@ module GovukPublishingComponents
37
35
  }
38
36
  ]
39
37
  else
40
- nav_helper.breadcrumbs[:breadcrumbs]
38
+ Breadcrumbs.new(content_item).breadcrumbs[:breadcrumbs]
41
39
  end
42
40
  end
43
41
 
44
42
  def should_present_taxonomy_navigation?
45
- navigation = GovukPublishingComponents::Presenters::NavigationType.new(content_item)
43
+ navigation = NavigationType.new(content_item)
46
44
  navigation.should_present_taxonomy_navigation?
47
45
  end
48
46
 
49
47
  def step_nav_helper
50
- @step_nav_helper ||= GovukPublishingComponents::AppHelpers::StepNavHelper.new(content_item, request_path)
51
- end
52
-
53
- private
54
-
55
- def nav_helper
56
- @nav_helper ||= GovukNavigationHelpers::NavigationHelper.new(content_item)
48
+ @step_nav_helper ||= StepNavHelper.new(content_item, request_path)
57
49
  end
58
50
  end
59
51
  end
@@ -0,0 +1,99 @@
1
+ require 'set'
2
+
3
+ module GovukPublishingComponents
4
+ module Presenters
5
+ # @private
6
+ class CuratedTaxonomySidebarLinks
7
+ def initialize(content_item)
8
+ @content_item = content_item
9
+ end
10
+
11
+ def related_items
12
+ @related_items ||=
13
+ taxon_links +
14
+ elsewhere_on_gov_uk_links +
15
+ elsewhere_on_the_web_links
16
+ end
17
+
18
+ private
19
+
20
+ def taxon_links
21
+ @content_item.parent_taxons.map do |taxon|
22
+ {
23
+ title: taxon.title,
24
+ url: taxon.base_path,
25
+ description: taxon.description,
26
+ related_content: format_for_sidebar(related_content_by_taxon[taxon]),
27
+ }
28
+ end
29
+ end
30
+
31
+ def elsewhere_on_gov_uk_links
32
+ elsewhere_items = related_content_elsewhere_on_govuk
33
+ return [] if elsewhere_items.empty?
34
+
35
+ [
36
+ {
37
+ title: 'Elsewhere on GOV.UK',
38
+ related_content: format_for_sidebar(elsewhere_items),
39
+ },
40
+ ]
41
+ end
42
+
43
+ def elsewhere_on_the_web_links
44
+ return [] if @content_item.external_links.empty?
45
+
46
+ external_links = @content_item.external_links.map do |link|
47
+ {
48
+ title: link['title'],
49
+ link: link['url'],
50
+ }
51
+ end
52
+
53
+ [
54
+ {
55
+ title: 'Elsewhere on the web',
56
+ related_content: external_links,
57
+ },
58
+ ]
59
+ end
60
+
61
+ def related_content_by_taxon
62
+ @related_items_by_taxon ||= begin
63
+ curated_related_items = @content_item.curated_taxonomy_sidebar_links.to_set
64
+
65
+ @content_item.parent_taxons.each_with_object({}) do |taxon, items_by_taxon|
66
+ items_related_to_taxon = filter_items_by_taxon(curated_related_items, taxon)
67
+ items_by_taxon[taxon] = items_related_to_taxon
68
+ curated_related_items = undisplayed_items(curated_related_items, items_related_to_taxon)
69
+ end
70
+ end
71
+ end
72
+
73
+ def related_content_elsewhere_on_govuk
74
+ @related_content_elsewhere_on_govuk ||= begin
75
+ related_content = @content_item.curated_taxonomy_sidebar_links.to_set
76
+ related_taxon_content = related_content_by_taxon.values.flatten.to_set
77
+ related_content - related_taxon_content
78
+ end
79
+ end
80
+
81
+ def filter_items_by_taxon(items, taxon)
82
+ items.select do |item|
83
+ item.parent_taxons.include?(taxon)
84
+ end
85
+ end
86
+
87
+ def undisplayed_items(all_items, displayed_items)
88
+ all_items - displayed_items
89
+ end
90
+
91
+ def format_for_sidebar(collection)
92
+ collection
93
+ .to_a
94
+ .sort_by(&:title)
95
+ .map(&:as_taxonomy_sidebar_link)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,62 @@
1
+ require 'govuk_app_config'
2
+
3
+ module GovukPublishingComponents
4
+ module Presenters
5
+ # @private
6
+ class RummagerTaxonomySidebarLinks
7
+ def initialize(content_item)
8
+ @content_item = content_item
9
+ end
10
+
11
+ def related_items
12
+ parent_taxons = @content_item.parent_taxons
13
+ used_related_links = Set.new
14
+
15
+ parent_taxons.each_with_index.map do |parent_taxon, index|
16
+ related_content = index < 2 ? content_related_to(parent_taxon, used_related_links) : []
17
+
18
+ used_related_links.merge(
19
+ related_content.map { |content| content[:link] }
20
+ )
21
+
22
+ {
23
+ title: parent_taxon.title,
24
+ url: parent_taxon.base_path,
25
+ description: parent_taxon.description,
26
+ related_content: related_content,
27
+ }
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ # This method will fetch content related to content_item, and tagged to taxon. This is a
34
+ # temporary method that uses search to achieve this. This behaviour is to be moved into
35
+ # the content store
36
+ def content_related_to(taxon, used_related_links)
37
+ GovukStatsd.time(:taxonomy_sidebar_search_time) do
38
+ begin
39
+ results = Services.rummager.search(
40
+ similar_to: @content_item.base_path,
41
+ start: 0,
42
+ count: 3,
43
+ filter_taxons: [taxon.content_id],
44
+ filter_navigation_document_supertype: 'guidance',
45
+ reject_link: used_related_links.to_a,
46
+ fields: %w[title link],
47
+ )['results']
48
+
49
+ GovukStatsd.increment(:taxonomy_sidebar_searches)
50
+
51
+ results
52
+ .map { |result| { title: result['title'], link: result['link'], } }
53
+ .sort_by { |result| result[:title] }
54
+ rescue StandardError => e
55
+ GovukError.notify(e)
56
+ []
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,12 @@
1
+ require 'gds_api/rummager'
2
+
3
+ module GovukPublishingComponents
4
+ module Presenters
5
+ # @private
6
+ module Services
7
+ def self.rummager
8
+ @rummager ||= GdsApi::Rummager.new(Plek.find('rummager'))
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,7 @@
1
1
  module GovukPublishingComponents
2
- module AppHelpers
2
+ module Presenters
3
+ # @private
4
+ # Only used by the step by step component
3
5
  class StepNavHelper
4
6
  def initialize(content_store_response, current_path)
5
7
  @content_item = content_store_response.to_h
@@ -8,7 +10,7 @@ module GovukPublishingComponents
8
10
 
9
11
  def step_navs
10
12
  @step_navs ||= parsed_step_navs.map do |step_nav|
11
- StepNav.new(step_nav)
13
+ StepByStepModel.new(step_nav)
12
14
  end
13
15
  end
14
16
 
@@ -89,5 +91,36 @@ module GovukPublishingComponents
89
91
  step_nav_content
90
92
  end
91
93
  end
94
+
95
+ # @private
96
+ class StepByStepModel
97
+ def initialize(content_item)
98
+ @content_item = content_item.deep_symbolize_keys
99
+ end
100
+
101
+ def title
102
+ content_item[:title]
103
+ end
104
+
105
+ def base_path
106
+ content_item[:base_path]
107
+ end
108
+
109
+ def content_id
110
+ content_item[:content_id]
111
+ end
112
+
113
+ def content
114
+ content_item.dig(:details, :step_by_step_nav)
115
+ end
116
+
117
+ def steps
118
+ content_item.dig(:details, :step_by_step_nav, :steps)
119
+ end
120
+
121
+ private
122
+
123
+ attr_reader :content_item
124
+ end
92
125
  end
93
126
  end
@@ -0,0 +1,46 @@
1
+ module GovukPublishingComponents
2
+ module Presenters
3
+ # @private
4
+ class TaxonBreadcrumbs
5
+ def initialize(content_item)
6
+ @content_item = ContentItem.new(content_item)
7
+ end
8
+
9
+ def breadcrumbs
10
+ ordered_parents = all_parents.map.with_index do |parent, index|
11
+ {
12
+ title: parent.title,
13
+ url: parent.base_path,
14
+ is_page_parent: index.zero?
15
+ }
16
+ end
17
+
18
+ ordered_parents << {
19
+ title: "Home",
20
+ url: "/",
21
+ is_page_parent: ordered_parents.empty?
22
+ }
23
+
24
+ {
25
+ breadcrumbs: ordered_parents.reverse
26
+ }
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :content_item
32
+
33
+ def all_parents
34
+ parents = []
35
+
36
+ direct_parent = content_item.parent_taxon
37
+ while direct_parent
38
+ parents << direct_parent
39
+ direct_parent = direct_parent.parent_taxon
40
+ end
41
+
42
+ parents
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,47 @@
1
+ module GovukPublishingComponents
2
+ module Presenters
3
+ # @private
4
+ class TaxonomySidebar
5
+ def initialize(content_item)
6
+ @content_item = ContentItem.new content_item
7
+ end
8
+
9
+ def sidebar
10
+ {
11
+ items: related_items,
12
+ collections: collections,
13
+ }
14
+ end
15
+
16
+ private
17
+
18
+ def there_are_related_item_overrides?
19
+ # TODO: We should check for any external links when we have "new"
20
+ # external links being curated in Content Tagger
21
+ @content_item.curated_taxonomy_sidebar_links.any?
22
+ end
23
+
24
+ def related_items
25
+ related_items_factory.new(@content_item).related_items
26
+ end
27
+
28
+ def related_items_factory
29
+ if there_are_related_item_overrides?
30
+ CuratedTaxonomySidebarLinks
31
+ else
32
+ RummagerTaxonomySidebarLinks
33
+ end
34
+ end
35
+
36
+ def collections
37
+ links = @content_item.related_collections
38
+ links.map do |link|
39
+ {
40
+ path: link["base_path"],
41
+ text: link["title"]
42
+ }
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module GovukPublishingComponents
2
- VERSION = '5.7.0'.freeze
2
+ VERSION = '6.0.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_publishing_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.7.0
4
+ version: 6.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-22 00:00:00.000000000 Z
11
+ date: 2018-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: govuk_app_config
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rails
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -108,20 +122,6 @@ dependencies:
108
122
  - - ">="
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: govuk_navigation_helpers
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: 9.2.1
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: 9.2.1
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: govuk-lint
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -389,15 +389,22 @@ files:
389
389
  - lib/generators/govuk_publishing_components/templates/_component.scss
390
390
  - lib/generators/govuk_publishing_components/templates/component.yml.erb
391
391
  - lib/govuk_publishing_components.rb
392
- - lib/govuk_publishing_components/app_helpers/step_nav.rb
393
- - lib/govuk_publishing_components/app_helpers/step_nav_helper.rb
392
+ - lib/govuk_publishing_components/app_helpers/taxon_breadcrumbs.rb
394
393
  - lib/govuk_publishing_components/config.rb
395
394
  - lib/govuk_publishing_components/engine.rb
396
395
  - lib/govuk_publishing_components/minitest/component_guide_test.rb
396
+ - lib/govuk_publishing_components/presenters/breadcrumbs.rb
397
+ - lib/govuk_publishing_components/presenters/content_item.rb
397
398
  - lib/govuk_publishing_components/presenters/contextual_navigation.rb
399
+ - lib/govuk_publishing_components/presenters/curated_taxonomy_sidebar_links.rb
398
400
  - lib/govuk_publishing_components/presenters/navigation_type.rb
399
401
  - lib/govuk_publishing_components/presenters/related_navigation_helper.rb
402
+ - lib/govuk_publishing_components/presenters/rummager_taxonomy_sidebar_links.rb
403
+ - lib/govuk_publishing_components/presenters/services.rb
400
404
  - lib/govuk_publishing_components/presenters/step_by_step_nav_helper.rb
405
+ - lib/govuk_publishing_components/presenters/step_nav_helper.rb
406
+ - lib/govuk_publishing_components/presenters/taxon_breadcrumbs.rb
407
+ - lib/govuk_publishing_components/presenters/taxonomy_sidebar.rb
401
408
  - lib/govuk_publishing_components/version.rb
402
409
  - lib/tasks/govuk_publishing_components_tasks.rake
403
410
  homepage: https://github.com/alphagov/govuk_publishing_components
@@ -1,33 +0,0 @@
1
- module GovukPublishingComponents
2
- module AppHelpers
3
- class StepNav
4
- def initialize(content_item)
5
- @content_item = content_item.deep_symbolize_keys
6
- end
7
-
8
- def title
9
- content_item[:title]
10
- end
11
-
12
- def base_path
13
- content_item[:base_path]
14
- end
15
-
16
- def content_id
17
- content_item[:content_id]
18
- end
19
-
20
- def content
21
- content_item.dig(:details, :step_by_step_nav)
22
- end
23
-
24
- def steps
25
- content_item.dig(:details, :step_by_step_nav, :steps)
26
- end
27
-
28
- private
29
-
30
- attr_reader :content_item
31
- end
32
- end
33
- end