govuk_publishing_components 21.57.1 → 21.60.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -6
  3. data/app/assets/javascripts/component_guide/accessibility-test.js +21 -21
  4. data/app/assets/javascripts/component_guide/filter-components.js +19 -19
  5. data/app/assets/javascripts/component_guide/visual-regression.js +38 -37
  6. data/app/assets/javascripts/govuk_publishing_components/components/checkboxes.js +2 -2
  7. data/app/assets/javascripts/govuk_publishing_components/components/details.js +6 -4
  8. data/app/assets/javascripts/govuk_publishing_components/components/step-by-step-nav.js +4 -4
  9. data/app/assets/javascripts/govuk_publishing_components/lib/auto-track-event.js +31 -0
  10. data/app/assets/javascripts/govuk_publishing_components/lib/cookie-functions.js +24 -24
  11. data/app/assets/javascripts/govuk_publishing_components/lib/govspeak/youtube-link-enhancement.js +17 -17
  12. data/app/assets/stylesheets/component_guide/application.scss +15 -15
  13. data/app/assets/stylesheets/govuk_publishing_components/components/_action-link.scss +0 -8
  14. data/app/assets/stylesheets/govuk_publishing_components/components/_breadcrumbs.scss +1 -1
  15. data/app/assets/stylesheets/govuk_publishing_components/components/_checkboxes.scss +4 -0
  16. data/app/assets/stylesheets/govuk_publishing_components/components/_cookie-banner.scss +1 -8
  17. data/app/assets/stylesheets/govuk_publishing_components/components/_feedback.scss +0 -1
  18. data/app/assets/stylesheets/govuk_publishing_components/components/_govspeak-html-publication.scss +4 -5
  19. data/app/assets/stylesheets/govuk_publishing_components/components/_heading.scss +3 -8
  20. data/app/assets/stylesheets/govuk_publishing_components/components/_image-card.scss +1 -1
  21. data/app/assets/stylesheets/govuk_publishing_components/components/_input.scss +1 -1
  22. data/app/assets/stylesheets/govuk_publishing_components/components/_inverse-header.scss +5 -8
  23. data/app/assets/stylesheets/govuk_publishing_components/components/_list.scss +1 -0
  24. data/app/assets/stylesheets/govuk_publishing_components/components/_radio.scss +4 -0
  25. data/app/assets/stylesheets/govuk_publishing_components/components/_related-navigation.scss +2 -2
  26. data/app/assets/stylesheets/govuk_publishing_components/components/_search.scss +7 -3
  27. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav-header.scss +0 -5
  28. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav-related.scss +1 -4
  29. data/app/assets/stylesheets/govuk_publishing_components/components/_step-by-step-nav.scss +8 -12
  30. data/app/assets/stylesheets/govuk_publishing_components/components/_table.scss +21 -24
  31. data/app/assets/stylesheets/govuk_publishing_components/components/_tabs.scss +4 -8
  32. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_attachment.scss +2 -0
  33. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_button.scss +1 -4
  34. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_charts.scss +6 -6
  35. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_contact.scss +2 -0
  36. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_footnotes.scss +2 -0
  37. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_highlight-answer.scss +2 -0
  38. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_place.scss +1 -1
  39. data/app/assets/stylesheets/govuk_publishing_components/components/govspeak/_typography.scss +2 -0
  40. data/app/assets/stylesheets/govuk_publishing_components/components/helpers/_markdown-typography.scss +1 -1
  41. data/app/assets/stylesheets/govuk_publishing_components/components/print/_govspeak.scss +2 -0
  42. data/app/assets/stylesheets/govuk_publishing_components/components/print/_step-by-step-nav-header.scss +0 -4
  43. data/app/assets/stylesheets/govuk_publishing_components/components/print/_step-by-step-nav.scss +2 -10
  44. data/app/controllers/govuk_publishing_components/audit_controller.rb +52 -0
  45. data/app/controllers/govuk_publishing_components/component_guide_controller.rb +2 -1
  46. data/app/models/govuk_publishing_components/audit_applications.rb +117 -0
  47. data/app/models/govuk_publishing_components/audit_comparer.rb +198 -0
  48. data/app/models/govuk_publishing_components/audit_components.rb +158 -0
  49. data/app/views/govuk_publishing_components/audit/show.html.erb +258 -0
  50. data/app/views/govuk_publishing_components/component_guide/index.html.erb +9 -4
  51. data/app/views/govuk_publishing_components/components/_breadcrumbs.html.erb +1 -1
  52. data/app/views/govuk_publishing_components/components/_image_card.html.erb +1 -1
  53. data/app/views/govuk_publishing_components/components/_list.html.erb +26 -0
  54. data/app/views/govuk_publishing_components/components/_machine_readable_metadata.html.erb +1 -1
  55. data/app/views/govuk_publishing_components/components/_radio.html.erb +13 -5
  56. data/app/views/govuk_publishing_components/components/_step_by_step_nav_header.html.erb +2 -2
  57. data/app/views/govuk_publishing_components/components/docs/checkboxes.yml +4 -0
  58. data/app/views/govuk_publishing_components/components/docs/govspeak.yml +45 -0
  59. data/app/views/govuk_publishing_components/components/docs/heading.yml +6 -3
  60. data/app/views/govuk_publishing_components/components/docs/image_card.yml +13 -1
  61. data/app/views/govuk_publishing_components/components/docs/list.yml +64 -0
  62. data/app/views/govuk_publishing_components/components/docs/radio.yml +4 -0
  63. data/config/routes.rb +1 -0
  64. data/lib/govuk_publishing_components/presenters/checkboxes_helper.rb +15 -7
  65. data/lib/govuk_publishing_components/presenters/heading_helper.rb +21 -1
  66. data/lib/govuk_publishing_components/presenters/image_card_helper.rb +2 -1
  67. data/lib/govuk_publishing_components/version.rb +1 -1
  68. data/node_modules/axe-core/package.json +145 -220
  69. data/node_modules/govuk-frontend/govuk/all.js +160 -57
  70. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js +16 -8
  71. data/node_modules/govuk-frontend/govuk/components/character-count/macro-options.json +6 -0
  72. data/node_modules/govuk-frontend/govuk/components/character-count/template.njk +1 -0
  73. data/node_modules/govuk-frontend/govuk/components/checkboxes/_index.scss +6 -5
  74. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js +68 -21
  75. data/node_modules/govuk-frontend/govuk/components/date-input/macro-options.json +1 -1
  76. data/node_modules/govuk-frontend/govuk/components/file-upload/_index.scss +0 -27
  77. data/node_modules/govuk-frontend/govuk/components/footer/_index.scss +0 -3
  78. data/node_modules/govuk-frontend/govuk/components/footer/template.njk +1 -1
  79. data/node_modules/govuk-frontend/govuk/components/header/template.njk +1 -1
  80. data/node_modules/govuk-frontend/govuk/components/hint/_index.scss +2 -2
  81. data/node_modules/govuk-frontend/govuk/components/hint/template.njk +2 -2
  82. data/node_modules/govuk-frontend/govuk/components/input/_index.scss +0 -3
  83. data/node_modules/govuk-frontend/govuk/components/input/macro-options.json +6 -0
  84. data/node_modules/govuk-frontend/govuk/components/input/template.njk +1 -0
  85. data/node_modules/govuk-frontend/govuk/components/radios/radios.js +76 -28
  86. data/node_modules/govuk-frontend/govuk/components/select/_index.scss +0 -3
  87. data/node_modules/govuk-frontend/govuk/components/skip-link/_index.scss +1 -0
  88. data/node_modules/govuk-frontend/govuk/components/textarea/_index.scss +0 -3
  89. data/node_modules/govuk-frontend/govuk/components/textarea/macro-options.json +6 -0
  90. data/node_modules/govuk-frontend/govuk/components/textarea/template.njk +1 -0
  91. data/node_modules/govuk-frontend/govuk/components/warning-text/_index.scss +4 -2
  92. data/node_modules/govuk-frontend/govuk/helpers/_colour.scss +1 -1
  93. data/node_modules/govuk-frontend/govuk/settings/_colours-applied.scss +2 -2
  94. data/node_modules/govuk-frontend/govuk/settings/_colours-palette.scss +1 -1
  95. data/node_modules/govuk-frontend/govuk/settings/_measurements.scss +4 -1
  96. data/node_modules/govuk-frontend/package.json +14 -81
  97. data/node_modules/jquery/package.json +44 -116
  98. metadata +46 -66
  99. data/Rakefile +0 -32
@@ -0,0 +1,198 @@
1
+ module GovukPublishingComponents
2
+ class AuditComparer
3
+ attr_reader :applications_data, :gem_data
4
+
5
+ def initialize(gem_data, results)
6
+ if gem_data[:gem_found]
7
+ @gem_data = gem_data
8
+ @applications_data = sort_results(results)
9
+ @gem_data[:components_by_application] = get_components_by_application || []
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def prettify_key(key)
16
+ key.to_s.gsub("_", " ").capitalize
17
+ end
18
+
19
+ def sort_results(results)
20
+ data = []
21
+
22
+ results.each do |result|
23
+ if result[:application_found]
24
+ templates = result[:components_found].find { |c| c[:location] == "templates" }
25
+ stylesheets = result[:components_found].find { |c| c[:location] == "stylesheets" }
26
+ print_stylesheets = result[:components_found].find { |c| c[:location] == "print_stylesheets" }
27
+ javascripts = result[:components_found].find { |c| c[:location] == "javascripts" }
28
+ ruby = result[:components_found].find { |c| c[:location] == "ruby" }
29
+
30
+ @all_stylesheets = true if stylesheets[:components].include?("all")
31
+ @all_print_stylesheets = true if print_stylesheets[:components].include?("all")
32
+ @all_javascripts = true if javascripts[:components].include?("all")
33
+
34
+ templates[:components] = include_any_components_within_components(templates[:components])
35
+
36
+ warnings = []
37
+ warnings << warn_about_missing_components(result[:components_found])
38
+ warnings << warn_about_missing_assets(result[:components_found])
39
+ warnings << warn_about_style_overrides(result[:gem_style_references])
40
+ warnings = warnings.flatten
41
+
42
+ data << {
43
+ name: result[:name],
44
+ application_found: result[:application_found],
45
+ summary: [
46
+ {
47
+ name: "Components in templates",
48
+ value: templates[:components].flatten.uniq.sort.join(", "),
49
+ },
50
+ {
51
+ name: "Components in stylesheets",
52
+ value: stylesheets[:components].join(", "),
53
+ },
54
+ {
55
+ name: "Components in print stylesheets",
56
+ value: print_stylesheets[:components].join(", "),
57
+ },
58
+ {
59
+ name: "Components in javascripts",
60
+ value: javascripts[:components].join(", "),
61
+ },
62
+ {
63
+ name: "Components in ruby",
64
+ value: ruby[:components].join(", "),
65
+ },
66
+ ],
67
+ warnings: warnings,
68
+ warning_count: warnings.length,
69
+ gem_style_references: result[:gem_style_references],
70
+ }
71
+ else
72
+ data << {
73
+ name: result[:name],
74
+ application_found: result[:application_found],
75
+ }
76
+ end
77
+ end
78
+
79
+ data
80
+ end
81
+
82
+ def include_any_components_within_components(components)
83
+ @gem_data[:components_containing_components].each do |component|
84
+ components << component[:sub_components] if components.include?(component[:component])
85
+ end
86
+
87
+ components.flatten.uniq.sort
88
+ end
89
+
90
+ def create_warning(component, message)
91
+ {
92
+ component: component,
93
+ message: message,
94
+ }
95
+ end
96
+
97
+ def find_missing_items(first_group, second_group)
98
+ warnings = []
99
+
100
+ first_group.each do |first|
101
+ first_location = first[:location]
102
+
103
+ second_group.each do |second|
104
+ second_location = second[:location]
105
+ second_location = "code" if %w[templates ruby].include?(second_location)
106
+ in_current = find_missing(second[:components].clone, first[:components].clone)
107
+
108
+ next if second[:components].include?("all")
109
+
110
+ in_current.each do |component|
111
+ if @gem_data.include?("component_#{second_location}".to_sym)
112
+ warnings << create_warning(component, "Included in #{first_location} but not #{second_location}") if @gem_data["component_#{second_location}".to_sym].include?(component)
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ warnings
119
+ end
120
+
121
+ def warn_about_missing_assets(components)
122
+ warnings = []
123
+
124
+ code = components.select { |c| c[:location] == "templates" || c[:location] == "ruby" }
125
+ code = [
126
+ {
127
+ location: "code",
128
+ components: code.map { |c| c[:components] }.flatten.uniq.sort,
129
+ },
130
+ ]
131
+ assets = components.select { |c| c[:location] == "stylesheets" || c[:location] == "print_stylesheets" || c[:location] == "javascripts" }
132
+
133
+ warnings << find_missing_items(code, assets)
134
+ warnings << find_missing_items(assets, code)
135
+ warnings.flatten
136
+ end
137
+
138
+ def warn_about_missing_components(results)
139
+ warnings = []
140
+
141
+ results.each do |result|
142
+ location = result[:location]
143
+ result[:components].each do |component|
144
+ warnings << create_warning(component, "Included in #{location} but component does not exist") if component_does_not_exist(component)
145
+ end
146
+ end
147
+
148
+ warnings
149
+ end
150
+
151
+ def component_does_not_exist(component)
152
+ !@gem_data[:component_code].include?(component) unless component == "all"
153
+ end
154
+
155
+ def warn_about_style_overrides(results)
156
+ warnings = []
157
+
158
+ results.each do |result|
159
+ warnings << create_warning("Possible component style override", result) if result.include? ".scss"
160
+ warnings << create_warning("Possible hard coded component markup", result) if [".html", ".rb"].any? { |needle| result.include? needle }
161
+ end
162
+
163
+ warnings
164
+ end
165
+
166
+ def find_missing(needle, haystack)
167
+ (haystack - needle).flatten.sort
168
+ end
169
+
170
+ def get_components_by_application
171
+ results = []
172
+ found_something = false
173
+
174
+ @gem_data[:component_listing].each do |component|
175
+ found_in_applications = []
176
+
177
+ @applications_data.each do |application|
178
+ next unless application[:application_found]
179
+
180
+ name = application[:name]
181
+ found_something = true
182
+
183
+ application[:summary].each do |item|
184
+ found_in_applications << name if item[:value].include?(component[:name])
185
+ end
186
+ end
187
+
188
+ results << {
189
+ component: component[:name],
190
+ count: found_in_applications.uniq.length,
191
+ list: found_in_applications.uniq.join(", "),
192
+ }
193
+ end
194
+
195
+ results if found_something
196
+ end
197
+ end
198
+ end
@@ -0,0 +1,158 @@
1
+ module GovukPublishingComponents
2
+ class AuditComponents
3
+ attr_reader :data
4
+
5
+ def initialize(path)
6
+ @data = {
7
+ gem_found: false,
8
+ }
9
+ @data = compile_data(path) if Dir.exist?(path)
10
+ end
11
+
12
+ private
13
+
14
+ def compile_data(path)
15
+ templates_path = "app/views/govuk_publishing_components/components"
16
+ stylesheets_path = "app/assets/stylesheets/govuk_publishing_components/components"
17
+ print_stylesheets_path = "app/assets/stylesheets/govuk_publishing_components/components/print"
18
+ javascripts_path = "app/assets/javascripts/govuk_publishing_components/components"
19
+ tests_path = "spec/components"
20
+ js_tests_path = "spec/javascripts/components"
21
+
22
+ templates = Dir["#{path}/#{templates_path}/*.erb"]
23
+ stylesheets = Dir["#{path}/#{stylesheets_path}/*.scss"]
24
+ print_stylesheets = Dir["#{path}/#{print_stylesheets_path}/*.scss"]
25
+ javascripts = Dir["#{path}/#{javascripts_path}/*.js"]
26
+ tests = Dir["#{path}/#{tests_path}/*.rb"]
27
+ js_tests = Dir["#{path}/#{js_tests_path}/*.js"]
28
+
29
+ @templates_full_path = "#{path}/#{templates_path}/"
30
+
31
+ @components = find_files(templates, [path, templates_path].join("/"))
32
+ @component_stylesheets = find_files(stylesheets, [path, stylesheets_path].join("/"))
33
+ @component_print_stylesheets = find_files(print_stylesheets, [path, print_stylesheets_path].join("/"))
34
+ @component_javascripts = find_files(javascripts, [path, javascripts_path].join("/"))
35
+ @component_tests = find_files(tests, [path, tests_path].join("/"))
36
+ @component_js_tests = find_files(js_tests, [path, js_tests_path].join("/"))
37
+
38
+ {
39
+ gem_found: true,
40
+ component_code: @components,
41
+ component_stylesheets: @component_stylesheets,
42
+ component_print_stylesheets: @component_print_stylesheets,
43
+ component_javascripts: @component_javascripts,
44
+ component_tests: @component_tests,
45
+ component_js_tests: @component_js_tests,
46
+ components_containing_components: find_all_partials_in(templates),
47
+ component_listing: list_all_component_details,
48
+ }
49
+ end
50
+
51
+ def find_files(files, replace)
52
+ files.map { |file| clean_file_name(file.gsub(replace, "")) }.sort
53
+ end
54
+
55
+ def clean_file_name(name)
56
+ name.tr("/_-", " ")
57
+ .gsub(".html.erb", "")
58
+ .gsub(".erb", "")
59
+ .gsub(".scss", "")
60
+ .gsub(".js", "")
61
+ .gsub("spec", "")
62
+ .gsub(".rb", "")
63
+ .strip
64
+ end
65
+
66
+ def get_component_name_from_full_path(path)
67
+ path.gsub(/.*\K\/_/, "/")
68
+ .gsub(@templates_full_path, "")
69
+ .gsub(".html.erb", "")
70
+ .gsub(".erb", "")
71
+ .tr('\"\'', "")
72
+ end
73
+
74
+ def get_component_link(component)
75
+ "/component-guide/#{component.gsub(' ', '_')}"
76
+ end
77
+
78
+ def find_all_partials_in(templates)
79
+ components = []
80
+
81
+ templates.each do |template|
82
+ partials_found = true
83
+ components_to_search = [template]
84
+ components_found = []
85
+
86
+ while partials_found
87
+ extra_components = find_partials_in(components_to_search)
88
+
89
+ if extra_components.any?
90
+ components_found << extra_components
91
+ components_to_search = extra_components
92
+ else
93
+ partials_found = false
94
+ components_found = components_found.flatten.reject { |c| c.include?("/") }
95
+
96
+ if components_found.any?
97
+ component_name = clean_file_name(get_component_name_from_full_path(template))
98
+ components << {
99
+ component: component_name,
100
+ link: get_component_link(component_name),
101
+ sub_components: components_found.uniq.sort.map { |name| clean_file_name(name) },
102
+ }
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ components.sort_by { |c| c[:component] }
109
+ end
110
+
111
+ def find_partials_in(components)
112
+ extra_components = []
113
+ components.each do |component|
114
+ extra_components << components_within_component(component)
115
+ end
116
+
117
+ extra_components.flatten.uniq.sort
118
+ end
119
+
120
+ def components_within_component(file)
121
+ file = get_component_name_from_full_path(file)
122
+ file = "#{@templates_full_path}#{file}.html.erb".sub(/.*\K\//, "/_")
123
+ data = File.read(file)
124
+ match = data.scan(/["']{1}(govuk_publishing_components\/components\/[\/a-z_-]+["']{1})/)
125
+ match.flatten.uniq.map(&:to_s).sort.map do |m|
126
+ m.gsub("govuk_publishing_components/components/", "").tr('\"\'', "")
127
+ end
128
+ end
129
+
130
+ def list_all_component_details
131
+ all_component_information = []
132
+
133
+ @components.each do |component|
134
+ all_component_information << {
135
+ name: component,
136
+ link: get_component_link(component),
137
+ stylesheet: check_component_has("stylesheet", component),
138
+ print_stylesheet: check_component_has("print_stylesheet", component),
139
+ javascript: check_component_has("javascript", component),
140
+ tests: check_component_has("test", component),
141
+ js_tests: check_component_has("js_test", component),
142
+ }
143
+ end
144
+
145
+ all_component_information
146
+ end
147
+
148
+ def check_component_has(a_thing, component)
149
+ look_in = @component_stylesheets if a_thing == "stylesheet"
150
+ look_in = @component_print_stylesheets if a_thing == "print_stylesheet"
151
+ look_in = @component_javascripts if a_thing == "javascript"
152
+ look_in = @component_tests if a_thing == "test"
153
+ look_in = @component_js_tests if a_thing == "js_test"
154
+
155
+ true if look_in.include?(component)
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,258 @@
1
+ <% content_for :title, "Component audit" %>
2
+
3
+ <%= render 'govuk_publishing_components/components/title', title: "Components audit", margin_top: 0; %>
4
+
5
+ <% if ENV["MAIN_COMPONENT_GUIDE"] %>
6
+ <div class="govuk-tabs" data-module="govuk-tabs">
7
+ <h2 class="govuk-tabs__title">
8
+ Contents
9
+ </h2>
10
+ <ul class="govuk-tabs__list">
11
+ <li class="govuk-tabs__list-item govuk-tabs__list-item--selected">
12
+ <a class="govuk-tabs__tab" href="#applications">
13
+ Applications
14
+ </a>
15
+ </li>
16
+ <li class="govuk-tabs__list-item">
17
+ <a class="govuk-tabs__tab" href="#components-gem">
18
+ Components
19
+ </a>
20
+ </li>
21
+ </ul>
22
+ <div class="govuk-tabs__panel" id="applications">
23
+ <%= render "govuk_publishing_components/components/heading", {
24
+ text: "Applications",
25
+ font_size: "l",
26
+ margin_bottom: 6
27
+ } %>
28
+
29
+ <% if @applications.any? %>
30
+ <details class="govuk-details" data-module="govuk-details">
31
+ <summary class="govuk-details__summary">
32
+ <span class="govuk-details__summary-text">
33
+ How to use this information
34
+ </span>
35
+ </summary>
36
+ <div class="govuk-details__text">
37
+ <p class="govuk-body">This page shows information about component use on GOV.UK. This information has been cross referenced with the components in the gem to produce warnings where e.g. a print stylesheet for a component exists but has not been included in an application.</p>
38
+ <p class="govuk-body">Warnings should be investigated, although there may be a reason why the application has been configured as it is. Note that 'code' can refer to templates or ruby code.</p>
39
+ </div>
40
+ </details>
41
+
42
+ <div class="govuk-accordion" data-module="govuk-accordion" id="accordion-with-summary-sections">
43
+ <% @applications.each_with_index do |application, index| %>
44
+ <div class="govuk-accordion__section ">
45
+ <div class="govuk-accordion__section-header">
46
+ <h2 class="govuk-accordion__section-heading">
47
+ <span class="govuk-accordion__section-button" id="accordion-with-summary-sections-heading-<%= index %>">
48
+ <%= application[:name] %>
49
+ </span>
50
+ </h2>
51
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-<%= index %>">
52
+ <% if application[:application_found] %>
53
+ Warnings:
54
+ <% if application[:warning_count] > 0 %>
55
+ <strong class="govuk-tag govuk-tag--red"><%= application[:warning_count] %></strong>
56
+ <% else %>
57
+ <%= application[:warning_count] %>
58
+ <% end %>
59
+ <% else %>
60
+ <strong class="govuk-tag govuk-tag--red">Application not found</strong>
61
+ <% end %>
62
+ </div>
63
+ </div>
64
+ <div id="accordion-with-summary-sections-content-<%= index %>" class="govuk-accordion__section-content" aria-labelledby="accordion-with-summary-sections-heading-<%= index %>">
65
+ <% if application[:application_found] %>
66
+ <% application[:warnings].each do |warning| %>
67
+ <p class="govuk-body">
68
+ <strong class="govuk-tag">Warn</strong>
69
+ <strong><%= warning[:component] %></strong> - <%= warning[:message] %>
70
+ </p>
71
+ <% end %>
72
+
73
+ <%= render "govuk_publishing_components/components/heading", {
74
+ text: "Components used",
75
+ font_size: "m",
76
+ margin_bottom: 4,
77
+ heading_level: 3,
78
+ } %>
79
+
80
+ <dl class="govuk-summary-list">
81
+ <% application[:summary].each do |item| %>
82
+ <div class="govuk-summary-list__row">
83
+ <dt class="govuk-summary-list__key">
84
+ <%= item[:name] %>
85
+ </dt>
86
+ <dd class="govuk-summary-list__value">
87
+ <% if item[:value].length > 0 %>
88
+ <%= item[:value] %>
89
+ <% else %>
90
+ None
91
+ <% end %>
92
+ </dd>
93
+ </div>
94
+ <% end %>
95
+ </dl>
96
+
97
+ <% if application[:gem_style_references].any? %>
98
+ <%= render "govuk_publishing_components/components/heading", {
99
+ text: "Component references",
100
+ font_size: "m",
101
+ margin_bottom: 4,
102
+ heading_level: 3,
103
+ } %>
104
+
105
+ <p class="govuk-body">This shows instances of `gem-c-` classes found in the application. If a reference is found in a stylesheet or in code a warning is created, as this could be a style override or hard coded component markup.</p>
106
+ <ul class="govuk-list govuk-list--bullet">
107
+ <% application[:gem_style_references].each do |ref| %>
108
+ <li><%= ref %></li>
109
+ <% end %>
110
+ </ul>
111
+ <% end %>
112
+ <% else %>
113
+ <p class="govuk-body">This application was not found. This could be because you do not have this repository checked out locally.</p>
114
+ <% end %>
115
+ </div>
116
+ </div>
117
+ <% end %>
118
+ </div>
119
+ <% else %>
120
+ <p class="govuk-body">No applications found.</p>
121
+ <% end %>
122
+ </div>
123
+
124
+ <div class="govuk-tabs__panel govuk-tabs__panel--hidden" id="components-gem">
125
+ <%= render "govuk_publishing_components/components/heading", {
126
+ text: "Components",
127
+ font_size: "l",
128
+ margin_bottom: 6,
129
+ } %>
130
+
131
+ <% if @components.any? %>
132
+ <div class="govuk-accordion" data-module="govuk-accordion" id="accordion-default">
133
+ <div class="govuk-accordion__section ">
134
+ <div class="govuk-accordion__section-header">
135
+ <h2 class="govuk-accordion__section-heading">
136
+ <span class="govuk-accordion__section-button" id="accordion-default-heading-1">
137
+ Component files
138
+ </span>
139
+ </h2>
140
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-1">
141
+ Lists what files each component has
142
+ </div>
143
+ </div>
144
+ <div id="accordion-default-content-1" class="govuk-accordion__section-content" aria-labelledby="accordion-default-heading-1">
145
+ <table class="govuk-table">
146
+ <thead class="govuk-table__head">
147
+ <tr class="govuk-table__row">
148
+ <th scope="col" class="govuk-table__header sticky-table-header">Component</th>
149
+ <th scope="col" class="govuk-table__header sticky-table-header">Stylesheet</th>
150
+ <th scope="col" class="govuk-table__header sticky-table-header">Print stylesheet</th>
151
+ <th scope="col" class="govuk-table__header sticky-table-header">JS</th>
152
+ <th scope="col" class="govuk-table__header sticky-table-header">Test</th>
153
+ <th scope="col" class="govuk-table__header sticky-table-header">JS test</th>
154
+ </tr>
155
+ </thead>
156
+ <tbody class="govuk-table__body">
157
+ <% @components[:component_listing].each do |component| %>
158
+ <tr class="govuk-table__row">
159
+ <th scope="row" class="govuk-table__header">
160
+ <a href="<%= component[:link] %>" class="govuk-link"><%= component[:name] %></a>
161
+ </th>
162
+ <td class="govuk-table__cell">
163
+ <% if component[:stylesheet] %>
164
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
165
+ <% end %>
166
+ </td>
167
+ <td class="govuk-table__cell">
168
+ <% if component[:print_stylesheet] %>
169
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
170
+ <% end %>
171
+ </td>
172
+ <td class="govuk-table__cell">
173
+ <% if component[:javascript] %>
174
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
175
+ <% end %>
176
+ </td>
177
+ <td class="govuk-table__cell">
178
+ <% if component[:tests] %>
179
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
180
+ <% end %>
181
+ </td>
182
+ <td class="govuk-table__cell">
183
+ <% if component[:js_tests] %>
184
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
185
+ <% end %>
186
+ </td>
187
+ </tr>
188
+ <% end %>
189
+ </tbody>
190
+ </table>
191
+ </div>
192
+ </div>
193
+
194
+ <div class="govuk-accordion__section ">
195
+ <div class="govuk-accordion__section-header">
196
+ <h2 class="govuk-accordion__section-heading">
197
+ <span class="govuk-accordion__section-button" id="accordion-default-heading-2">
198
+ Components containing components
199
+ </span>
200
+ </h2>
201
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-2">
202
+ Shows which components contain other components
203
+ </div>
204
+ </div>
205
+ <div id="accordion-default-content-2" class="govuk-accordion__section-content" aria-labelledby="accordion-default-heading-2">
206
+ <dl class="govuk-summary-list">
207
+ <% @components[:components_containing_components].each do |component| %>
208
+ <div class="govuk-summary-list__row">
209
+ <dt class="govuk-summary-list__key">
210
+ <a href="<%= component[:link] %>" class="govuk-link"><%= component[:component] %></a>
211
+ </dt>
212
+ <dd class="govuk-summary-list__value">
213
+ <%= component[:sub_components].join(', ') %>
214
+ </dd>
215
+ </div>
216
+ <% end %>
217
+ </dl>
218
+ </div>
219
+ </div>
220
+ <div class="govuk-accordion__section ">
221
+ <div class="govuk-accordion__section-header">
222
+ <h2 class="govuk-accordion__section-heading">
223
+ <span class="govuk-accordion__section-button" id="accordion-default-heading-2">
224
+ Components by application
225
+ </span>
226
+ </h2>
227
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-2">
228
+ Shows which applications use each component
229
+ </div>
230
+ </div>
231
+ <div id="accordion-default-content-2" class="govuk-accordion__section-content" aria-labelledby="accordion-default-heading-2">
232
+ <% if @components[:components_by_application].any? %>
233
+ <dl class="govuk-summary-list">
234
+ <% @components[:components_by_application].each do |component| %>
235
+ <div class="govuk-summary-list__row">
236
+ <dt class="govuk-summary-list__key">
237
+ <%= component[:component] %> (<%= component[:count] %>)
238
+ </dt>
239
+ <dd class="govuk-summary-list__value">
240
+ <%= component[:list] %>
241
+ </dd>
242
+ </div>
243
+ <% end %>
244
+ </dl>
245
+ <% else %>
246
+ <p class="govuk-body">Sorry, no applications found.</p>
247
+ <% end %>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ <% else %>
252
+ <p class="govuk-body">No components found.</p>
253
+ <% end %>
254
+ </div>
255
+ </div>
256
+ <% else %>
257
+ <p class="govuk-body">Component auditing is only available when the component guide is running locally as a standalone app.</p>
258
+ <% end %>