govuk_publishing_components 21.58.0 → 21.59.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: e165b9cdf4f92f02644b2e82c82c8c6b116379b86d5d4508437dc8ccfd25bd81
4
- data.tar.gz: 2be44d5b0942debce73048f3bec3786cc9398ae37de322016b253ccfe220442a
3
+ metadata.gz: 1d31d1f48a5d3491e568c0412fdbbcfaf2e1a98a71aaf84ff703556e83a19b6b
4
+ data.tar.gz: 45ecc8d0b068dd621f3a5a4fb2b4add39f542cfe14ba22f5a2e9828ae9638438
5
5
  SHA512:
6
- metadata.gz: 9a3a06af1b35ecdc351c4d1da7b65ac95bd601a9b2f6f0049e17a84b15768872e478b44c170d2e9579992fd0ca092d60c4c91c049ed2edf48c0e0a1e9f9e7b44
7
- data.tar.gz: 457fceebbb07d07f8afa3c0ab11c7057659a7df2e6d7a409a472ecfdb5a821147cd6918c4568ded4a063a9c53ef5a9764543c0de507085f62b33f1f0aca91df1
6
+ metadata.gz: 89fd3c928d07a3cda0079255ea980e7731bda3eb1b9033eeba53131f85f05c12a9073334b17a04b86c050ddd5329fcef28be3ced3373137b6c4385cefb1070aa
7
+ data.tar.gz: 82d9e99c1d65f4441404f8a76c18ccc11a3357250ac579bdd6844e8f0b57c63d41dfca449cb848b3f86e37576c7e5dcd6eb3e373860c5d1814882ac52a6d3052
@@ -20,9 +20,11 @@ window.GOVUK.Modules = window.GOVUK.Modules || {};
20
20
  var detailsClick = detailsComponent.querySelector('[data-details-track-click]')
21
21
  var that = this
22
22
 
23
- detailsClick.addEventListener('click', function (event) {
24
- that.trackDefault(detailsComponent)
25
- })
23
+ if (detailsClick) {
24
+ detailsClick.addEventListener('click', function (event) {
25
+ that.trackDefault(detailsComponent)
26
+ })
27
+ }
26
28
  }
27
29
  }
28
30
 
@@ -0,0 +1,52 @@
1
+ module GovukPublishingComponents
2
+ class AuditController < GovukPublishingComponents::ApplicationController
3
+ def show
4
+ path = Dir.pwd
5
+
6
+ components = AuditComponents.new(path)
7
+ applications = analyse_applications(File.expand_path("..", path))
8
+ compared_data = AuditComparer.new(components.data, applications)
9
+
10
+ @applications = compared_data.data
11
+ @components = compared_data.gem_data
12
+ end
13
+
14
+ private
15
+
16
+ def analyse_applications(path)
17
+ results = []
18
+ applications = %w[
19
+ calculators
20
+ collections
21
+ collections-publisher
22
+ content-data-admin
23
+ content-publisher
24
+ email-alert-frontend
25
+ feedback
26
+ finder-frontend
27
+ frontend
28
+ government-frontend
29
+ govspeak-preview
30
+ info-frontend
31
+ licence-finder
32
+ manuals-frontend
33
+ release
34
+ search-admin
35
+ service-manual-frontend
36
+ signon
37
+ smart-answers
38
+ static
39
+ travel-advice-publisher
40
+ whitehall
41
+ ].sort
42
+
43
+ applications.each do |application|
44
+ application_path = [path, application].join("/")
45
+ app = AuditApplications.new(application_path, application)
46
+ results << app.data
47
+ end
48
+
49
+ results
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,99 @@
1
+ module GovukPublishingComponents
2
+ class AuditApplications
3
+ attr_reader :data
4
+
5
+ def initialize(path, name)
6
+ templates = Dir["#{path}/app/views/**/*.html.erb"]
7
+ stylesheets = Dir["#{path}/app/assets/stylesheets/**/*.scss"]
8
+ javascripts = Dir["#{path}/app/assets/javascripts/**/*.js"]
9
+
10
+ find_templates = /(?<=govuk_publishing_components\/components\/)[\/a-zA-Z_-]+(?=['"])/
11
+
12
+ @find_all_stylesheets = /@import ["']{1}govuk_publishing_components\/all_components/
13
+ find_stylesheets = /(?<=@import ["']{1}govuk_publishing_components\/components\/)(?!print)+[a-zA-Z_-]+(?=['"])/
14
+
15
+ @find_all_print_stylesheets = /@import ["']{1}govuk_publishing_components\/all_components_print/
16
+ find_print_stylesheets = /(?<=@import ["']{1}govuk_publishing_components\/components\/print\/)[a-zA-Z_-]+(?=['"])/
17
+
18
+ @find_all_javascripts = /\/\/[ ]*= require govuk_publishing_components\/all_components/
19
+ find_javascripts = /(?<=require govuk_publishing_components\/components\/)[a-zA-Z_-]+/
20
+
21
+ components_in_templates = find_components(templates, find_templates, "templates") || []
22
+ components_in_stylesheets = find_components(stylesheets, find_stylesheets, "stylesheets") || []
23
+ components_in_print_stylesheets = find_components(stylesheets, find_print_stylesheets, "print_stylesheets") || []
24
+ components_in_javascripts = find_components(javascripts, find_javascripts, "javascripts") || []
25
+
26
+ find_ruby = /(?<=render\(["']{1}govuk_publishing_components\/components\/)[a-zA-Z_-]+/
27
+ ruby_paths = %w[/app/helpers/ /app/presenters/ /lib/]
28
+
29
+ components_in_ruby = []
30
+ ruby_paths.each do |ruby_path|
31
+ components_in_ruby << find_components(Dir["#{path}#{ruby_path}**/*.rb"], find_ruby, "ruby") || []
32
+ end
33
+
34
+ components_in_ruby = components_in_ruby.flatten.uniq
35
+
36
+ @data = {
37
+ name: name,
38
+ application_found: application_exists(path),
39
+ components_found: [
40
+ {
41
+ location: "templates",
42
+ components: components_in_templates,
43
+ },
44
+ {
45
+ location: "stylesheets",
46
+ components: components_in_stylesheets,
47
+ },
48
+ {
49
+ location: "print_stylesheets",
50
+ components: components_in_print_stylesheets,
51
+ },
52
+ {
53
+ location: "javascripts",
54
+ components: components_in_javascripts,
55
+ },
56
+ {
57
+ location: "ruby",
58
+ components: components_in_ruby,
59
+ },
60
+ ],
61
+ }
62
+ end
63
+
64
+ private
65
+
66
+ def find_components(files, find, type)
67
+ components_found = []
68
+
69
+ files.each do |file|
70
+ src = File.read(file)
71
+ components_found << find_match(find, src, type)
72
+ end
73
+
74
+ components_found.flatten.uniq.sort
75
+ end
76
+
77
+ def find_match(find, src, type)
78
+ return %w[all] if src.match(@find_all_stylesheets) && type == "stylesheets"
79
+ return %w[all] if src.match(@find_all_print_stylesheets) && type == "print_stylesheets"
80
+ return %w[all] if src.match(@find_all_javascripts) && type == "javascripts"
81
+
82
+ matches = src.scan(find)
83
+ all_matches = []
84
+ matches.each do |match|
85
+ all_matches << clean_file_name(match.tr('[])\'"', ""))
86
+ end
87
+
88
+ all_matches
89
+ end
90
+
91
+ def clean_file_name(name)
92
+ name.tr("_-", " ").strip
93
+ end
94
+
95
+ def application_exists(directory)
96
+ File.directory?(directory)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,172 @@
1
+ module GovukPublishingComponents
2
+ class AuditComparer
3
+ attr_reader :data, :gem_data
4
+
5
+ def initialize(gem_data, results)
6
+ @gem_data = gem_data
7
+ @data = sort_results(results)
8
+ @gem_data[:components_by_application] = get_components_by_application
9
+ end
10
+
11
+ private
12
+
13
+ def prettify_key(key)
14
+ key.to_s.gsub("_", " ").capitalize
15
+ end
16
+
17
+ def sort_results(results)
18
+ data = []
19
+
20
+ results.each do |result|
21
+ templates = result[:components_found].find { |c| c[:location] == "templates" }
22
+ stylesheets = result[:components_found].find { |c| c[:location] == "stylesheets" }
23
+ print_stylesheets = result[:components_found].find { |c| c[:location] == "print_stylesheets" }
24
+ javascripts = result[:components_found].find { |c| c[:location] == "javascripts" }
25
+ ruby = result[:components_found].find { |c| c[:location] == "ruby" }
26
+
27
+ @all_stylesheets = true if stylesheets[:components].include?("all")
28
+ @all_print_stylesheets = true if print_stylesheets[:components].include?("all")
29
+ @all_javascripts = true if javascripts[:components].include?("all")
30
+
31
+ templates[:components] = include_any_components_within_components(templates[:components])
32
+
33
+ warnings = []
34
+ warnings << warn_about_missing_components(result[:components_found])
35
+ warnings << warn_about_missing_assets(result[:components_found])
36
+ warnings = warnings.flatten
37
+
38
+ data << {
39
+ name: result[:name],
40
+ application_found: result[:application_found],
41
+ summary: [
42
+ {
43
+ name: "Components in templates",
44
+ value: templates[:components].flatten.uniq.sort.join(", "),
45
+ },
46
+ {
47
+ name: "Components in stylesheets",
48
+ value: stylesheets[:components].join(", "),
49
+ },
50
+ {
51
+ name: "Components in print stylesheets",
52
+ value: print_stylesheets[:components].join(", "),
53
+ },
54
+ {
55
+ name: "Components in javascripts",
56
+ value: javascripts[:components].join(", "),
57
+ },
58
+ {
59
+ name: "Components in ruby",
60
+ value: ruby[:components].join(", "),
61
+ },
62
+ ],
63
+ warnings: warnings,
64
+ warning_count: warnings.length,
65
+ }
66
+ end
67
+
68
+ data
69
+ end
70
+
71
+ def include_any_components_within_components(components)
72
+ @gem_data[:components_containing_components].each do |component|
73
+ components << component[:sub_components] if components.include?(component[:component])
74
+ end
75
+
76
+ components.flatten.uniq.sort
77
+ end
78
+
79
+ def create_warning(component, message)
80
+ {
81
+ component: component,
82
+ message: message,
83
+ }
84
+ end
85
+
86
+ def find_missing_items(first_group, second_group)
87
+ warnings = []
88
+
89
+ first_group.each do |first|
90
+ first_location = first[:location]
91
+
92
+ second_group.each do |second|
93
+ second_location = second[:location]
94
+ second_location = "code" if %w[templates ruby].include?(second_location)
95
+ in_current = find_missing(second[:components].clone, first[:components].clone)
96
+
97
+ next if second[:components].include?("all")
98
+
99
+ in_current.each do |component|
100
+ if @gem_data.include?("component_#{second_location}".to_sym)
101
+ warnings << create_warning(component, "Included in #{first_location} but not #{second_location}") if @gem_data["component_#{second_location}".to_sym].include?(component)
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ warnings
108
+ end
109
+
110
+ def warn_about_missing_assets(components)
111
+ warnings = []
112
+
113
+ code = components.select { |c| c[:location] == "templates" || c[:location] == "ruby" }
114
+ code = [
115
+ {
116
+ location: "code",
117
+ components: code.map { |c| c[:components] }.flatten.uniq.sort,
118
+ },
119
+ ]
120
+ assets = components.select { |c| c[:location] == "stylesheets" || c[:location] == "print_stylesheets" || c[:location] == "javascripts" }
121
+
122
+ warnings << find_missing_items(code, assets)
123
+ warnings << find_missing_items(assets, code)
124
+ warnings.flatten
125
+ end
126
+
127
+ def warn_about_missing_components(results)
128
+ warnings = []
129
+
130
+ results.each do |result|
131
+ location = result[:location]
132
+ result[:components].each do |component|
133
+ warnings << create_warning(component, "Included in #{location} but component does not exist") if component_does_not_exist(component)
134
+ end
135
+ end
136
+
137
+ warnings
138
+ end
139
+
140
+ def component_does_not_exist(component)
141
+ !@gem_data[:component_code].include?(component) unless component == "all"
142
+ end
143
+
144
+ def find_missing(needle, haystack)
145
+ (haystack - needle).flatten.sort
146
+ end
147
+
148
+ def get_components_by_application
149
+ results = []
150
+
151
+ @gem_data[:component_listing].each do |component|
152
+ found_in_applications = []
153
+
154
+ @data.each do |application|
155
+ name = application[:name]
156
+
157
+ application[:summary].each do |item|
158
+ found_in_applications << name if item[:value].include?(component[:name])
159
+ end
160
+ end
161
+
162
+ results << {
163
+ component: component[:name],
164
+ count: found_in_applications.uniq.length,
165
+ list: found_in_applications.uniq.join(", "),
166
+ }
167
+ end
168
+
169
+ results
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,139 @@
1
+ module GovukPublishingComponents
2
+ class AuditComponents
3
+ attr_reader :data
4
+
5
+ def initialize(path)
6
+ templates_path = "app/views/govuk_publishing_components/components"
7
+ stylesheets_path = "app/assets/stylesheets/govuk_publishing_components/components"
8
+ print_stylesheets_path = "app/assets/stylesheets/govuk_publishing_components/components/print"
9
+ javascripts_path = "app/assets/javascripts/govuk_publishing_components/components"
10
+ tests_path = "spec/components"
11
+ js_tests_path = "spec/javascripts/components"
12
+
13
+ templates = Dir["#{path}/#{templates_path}/*.html.erb"]
14
+ stylesheets = Dir["#{path}/#{stylesheets_path}/*.scss"]
15
+ print_stylesheets = Dir["#{path}/#{print_stylesheets_path}/*.scss"]
16
+ javascripts = Dir["#{path}/#{javascripts_path}/*.js"]
17
+ tests = Dir["#{path}/#{tests_path}/*.rb"]
18
+ js_tests = Dir["#{path}/#{js_tests_path}/*.js"]
19
+
20
+ @templates_full_path = "#{path}/#{templates_path}/"
21
+
22
+ @components = find_files(templates, [path, templates_path].join("/"))
23
+ @component_stylesheets = find_files(stylesheets, [path, stylesheets_path].join("/"))
24
+ @component_print_stylesheets = find_files(print_stylesheets, [path, print_stylesheets_path].join("/"))
25
+ @component_javascripts = find_files(javascripts, [path, javascripts_path].join("/"))
26
+ @component_tests = find_files(tests, [path, tests_path].join("/"))
27
+ @component_js_tests = find_files(js_tests, [path, js_tests_path].join("/"))
28
+
29
+ @data = {
30
+ component_code: @components,
31
+ component_stylesheets: @component_stylesheets,
32
+ component_print_stylesheets: @component_print_stylesheets,
33
+ component_javascripts: @component_javascripts,
34
+ component_tests: @component_tests,
35
+ component_js_tests: @component_js_tests,
36
+ components_containing_components: find_all_partials_in(templates),
37
+ component_listing: list_all_component_details,
38
+ }
39
+ end
40
+
41
+ private
42
+
43
+ def find_files(files, replace)
44
+ files.map { |file| clean_file_name(file.gsub(replace, "")) }.sort
45
+ end
46
+
47
+ def clean_file_name(name)
48
+ name.tr("/_-", " ").gsub(".html.erb", "").gsub(".scss", "").gsub(".js", "").gsub("spec", "").gsub(".rb", "").strip
49
+ end
50
+
51
+ def get_component_name_from_full_path(path)
52
+ path.gsub("/_", "/").gsub(@templates_full_path, "").gsub(".html.erb", "").tr('\"\'', "")
53
+ end
54
+
55
+ def get_component_link(component)
56
+ "/component-guide/#{component.gsub(' ', '_')}"
57
+ end
58
+
59
+ def find_all_partials_in(templates)
60
+ components = []
61
+
62
+ templates.each do |template|
63
+ partials_found = true
64
+ components_to_search = [template]
65
+ components_found = []
66
+
67
+ while partials_found
68
+ extra_components = find_partials_in(components_to_search)
69
+
70
+ if extra_components.any?
71
+ components_found << extra_components
72
+ components_to_search = extra_components
73
+ else
74
+ partials_found = false
75
+ components_found = components_found.flatten.reject { |c| c.include?("/") }
76
+
77
+ if components_found.any?
78
+ component_name = clean_file_name(get_component_name_from_full_path(template))
79
+ components << {
80
+ component: component_name,
81
+ link: get_component_link(component_name),
82
+ sub_components: components_found.uniq.sort.map { |name| clean_file_name(name) },
83
+ }
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ components.sort_by { |c| c[:component] }
90
+ end
91
+
92
+ def find_partials_in(components)
93
+ extra_components = []
94
+ components.each do |component|
95
+ extra_components << components_within_component(component)
96
+ end
97
+
98
+ extra_components.flatten.uniq.sort
99
+ end
100
+
101
+ def components_within_component(file)
102
+ file = get_component_name_from_full_path(file)
103
+ file = "#{@templates_full_path}#{file}.html.erb".sub(/.*\K\//, "/_")
104
+ data = File.read(file)
105
+ match = data.scan(/["']{1}(govuk_publishing_components\/components\/[\/a-z_-]+["']{1})/)
106
+ match.flatten.uniq.map(&:to_s).sort.map do |m|
107
+ m.gsub("govuk_publishing_components/components/", "").tr('\"\'', "")
108
+ end
109
+ end
110
+
111
+ def list_all_component_details
112
+ all_component_information = []
113
+
114
+ @components.each do |component|
115
+ all_component_information << {
116
+ name: component,
117
+ link: get_component_link(component),
118
+ stylesheet: check_component_has("stylesheet", component),
119
+ print_stylesheet: check_component_has("print_stylesheet", component),
120
+ javascript: check_component_has("javascript", component),
121
+ tests: check_component_has("test", component),
122
+ js_tests: check_component_has("js_test", component),
123
+ }
124
+ end
125
+
126
+ all_component_information
127
+ end
128
+
129
+ def check_component_has(a_thing, component)
130
+ look_in = @component_stylesheets if a_thing == "stylesheet"
131
+ look_in = @component_print_stylesheets if a_thing == "print_stylesheet"
132
+ look_in = @component_javascripts if a_thing == "javascript"
133
+ look_in = @component_tests if a_thing == "test"
134
+ look_in = @component_js_tests if a_thing == "js_test"
135
+
136
+ true if look_in.include?(component)
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,221 @@
1
+ <% content_for :title, "Component audit" %>
2
+
3
+ <%= render 'govuk_publishing_components/components/title', title: "Components audit", margin_top: 0; %>
4
+
5
+ <div class="govuk-tabs" data-module="govuk-tabs">
6
+ <h2 class="govuk-tabs__title">
7
+ Contents
8
+ </h2>
9
+ <ul class="govuk-tabs__list">
10
+ <li class="govuk-tabs__list-item govuk-tabs__list-item--selected">
11
+ <a class="govuk-tabs__tab" href="#applications">
12
+ Applications
13
+ </a>
14
+ </li>
15
+ <li class="govuk-tabs__list-item">
16
+ <a class="govuk-tabs__tab" href="#components-gem">
17
+ Components
18
+ </a>
19
+ </li>
20
+ </ul>
21
+ <div class="govuk-tabs__panel" id="applications">
22
+ <h2 class="govuk-heading-l">Applications</h2>
23
+
24
+ <% if @applications.any? %>
25
+ <details class="govuk-details" data-module="govuk-details">
26
+ <summary class="govuk-details__summary">
27
+ <span class="govuk-details__summary-text">
28
+ How to use this information
29
+ </span>
30
+ </summary>
31
+ <div class="govuk-details__text">
32
+ <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>
33
+ <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>
34
+ </div>
35
+ </details>
36
+
37
+ <div class="govuk-accordion" data-module="govuk-accordion" id="accordion-with-summary-sections">
38
+ <% @applications.each_with_index do |application, index| %>
39
+ <div class="govuk-accordion__section ">
40
+ <div class="govuk-accordion__section-header">
41
+ <h2 class="govuk-accordion__section-heading">
42
+ <span class="govuk-accordion__section-button" id="accordion-with-summary-sections-heading-<%= index %>">
43
+ <%= application[:name] %>
44
+ </span>
45
+ </h2>
46
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-<%= index %>">
47
+ <% if application[:application_found] %>
48
+ Warnings:
49
+ <% if application[:warning_count] > 0 %>
50
+ <strong class="govuk-tag govuk-tag--red"><%= application[:warning_count] %></strong>
51
+ <% else %>
52
+ <%= application[:warning_count] %>
53
+ <% end %>
54
+ <% else %>
55
+ <strong class="govuk-tag govuk-tag--red">Application not found</strong>
56
+ <% end %>
57
+ </div>
58
+ </div>
59
+ <div id="accordion-with-summary-sections-content-<%= index %>" class="govuk-accordion__section-content" aria-labelledby="accordion-with-summary-sections-heading-<%= index %>">
60
+ <% if application[:application_found] %>
61
+ <% application[:warnings].each do |warning| %>
62
+ <p class="govuk-body">
63
+ <strong class="govuk-tag">Warn</strong>
64
+ <strong><%= warning[:component] %></strong> - <%= warning[:message] %>
65
+ </p>
66
+ <% end %>
67
+
68
+ <h3 class="govuk-heading-m">Components used</h3>
69
+
70
+ <dl class="govuk-summary-list">
71
+ <% application[:summary].each do |item| %>
72
+ <div class="govuk-summary-list__row">
73
+ <dt class="govuk-summary-list__key">
74
+ <%= item[:name] %>
75
+ </dt>
76
+ <dd class="govuk-summary-list__value">
77
+ <% if item[:value].length > 0 %>
78
+ <%= item[:value] %>
79
+ <% else %>
80
+ None
81
+ <% end %>
82
+ </dd>
83
+ </div>
84
+ <% end %>
85
+ </dl>
86
+ <% else %>
87
+ <p class="govuk-body">This application was not found. This could be because you do not have this repository checked out locally.</p>
88
+ <% end %>
89
+ </div>
90
+ </div>
91
+ <% end %>
92
+ </div>
93
+ <% else %>
94
+ <p class="govuk-body">No applications found.</p>
95
+ <% end %>
96
+ </div>
97
+
98
+ <div class="govuk-tabs__panel govuk-tabs__panel--hidden" id="components-gem">
99
+ <h2 class="govuk-heading-l">Components</h2>
100
+
101
+ <% if @components.any? %>
102
+ <div class="govuk-accordion" data-module="govuk-accordion" id="accordion-default">
103
+ <div class="govuk-accordion__section ">
104
+ <div class="govuk-accordion__section-header">
105
+ <h2 class="govuk-accordion__section-heading">
106
+ <span class="govuk-accordion__section-button" id="accordion-default-heading-1">
107
+ Component files
108
+ </span>
109
+ </h2>
110
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-1">
111
+ Lists what files each component has
112
+ </div>
113
+ </div>
114
+ <div id="accordion-default-content-1" class="govuk-accordion__section-content" aria-labelledby="accordion-default-heading-1">
115
+ <table class="govuk-table">
116
+ <thead class="govuk-table__head">
117
+ <tr class="govuk-table__row">
118
+ <th scope="col" class="govuk-table__header">Component</th>
119
+ <th scope="col" class="govuk-table__header">Stylesheet</th>
120
+ <th scope="col" class="govuk-table__header">Print stylesheet</th>
121
+ <th scope="col" class="govuk-table__header">JS</th>
122
+ <th scope="col" class="govuk-table__header">Test</th>
123
+ <th scope="col" class="govuk-table__header">JS test</th>
124
+ </tr>
125
+ </thead>
126
+ <tbody class="govuk-table__body">
127
+ <% @components[:component_listing].each do |component| %>
128
+ <tr class="govuk-table__row">
129
+ <th scope="row" class="govuk-table__header">
130
+ <a href="<%= component[:link] %>" class="govuk-link"><%= component[:name] %></a>
131
+ </th>
132
+ <td class="govuk-table__cell">
133
+ <% if component[:stylesheet] %>
134
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
135
+ <% end %>
136
+ </td>
137
+ <td class="govuk-table__cell">
138
+ <% if component[:print_stylesheet] %>
139
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
140
+ <% end %>
141
+ </td>
142
+ <td class="govuk-table__cell">
143
+ <% if component[:javascript] %>
144
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
145
+ <% end %>
146
+ </td>
147
+ <td class="govuk-table__cell">
148
+ <% if component[:tests] %>
149
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
150
+ <% end %>
151
+ </td>
152
+ <td class="govuk-table__cell">
153
+ <% if component[:js_tests] %>
154
+ <strong class="govuk-tag govuk-tag--green">Yes</strong>
155
+ <% end %>
156
+ </td>
157
+ </tr>
158
+ <% end %>
159
+ </tbody>
160
+ </table>
161
+ </div>
162
+ </div>
163
+
164
+ <div class="govuk-accordion__section ">
165
+ <div class="govuk-accordion__section-header">
166
+ <h2 class="govuk-accordion__section-heading">
167
+ <span class="govuk-accordion__section-button" id="accordion-default-heading-2">
168
+ Components containing components
169
+ </span>
170
+ </h2>
171
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-2">
172
+ Shows which components contain other components
173
+ </div>
174
+ </div>
175
+ <div id="accordion-default-content-2" class="govuk-accordion__section-content" aria-labelledby="accordion-default-heading-2">
176
+ <dl class="govuk-summary-list">
177
+ <% @components[:components_containing_components].each do |component| %>
178
+ <div class="govuk-summary-list__row">
179
+ <dt class="govuk-summary-list__key">
180
+ <a href="<%= component[:link] %>" class="govuk-link"><%= component[:component] %></a>
181
+ </dt>
182
+ <dd class="govuk-summary-list__value">
183
+ <%= component[:sub_components].join(', ') %>
184
+ </dd>
185
+ </div>
186
+ <% end %>
187
+ </dl>
188
+ </div>
189
+ </div>
190
+ <div class="govuk-accordion__section ">
191
+ <div class="govuk-accordion__section-header">
192
+ <h2 class="govuk-accordion__section-heading">
193
+ <span class="govuk-accordion__section-button" id="accordion-default-heading-2">
194
+ Components by application
195
+ </span>
196
+ </h2>
197
+ <div class="govuk-accordion__section-summary govuk-body" id="accordion-with-summary-sections-summary-2">
198
+ Shows which applications use each component
199
+ </div>
200
+ </div>
201
+ <div id="accordion-default-content-2" class="govuk-accordion__section-content" aria-labelledby="accordion-default-heading-2">
202
+ <dl class="govuk-summary-list">
203
+ <% @components[:components_by_application].each do |component| %>
204
+ <div class="govuk-summary-list__row">
205
+ <dt class="govuk-summary-list__key">
206
+ <%= component[:component] %> (<%= component[:count] %>)
207
+ </dt>
208
+ <dd class="govuk-summary-list__value">
209
+ <%= component[:list] %>
210
+ </dd>
211
+ </div>
212
+ <% end %>
213
+ </dl>
214
+ </div>
215
+ </div>
216
+ </div>
217
+ <% else %>
218
+ <p class="govuk-body">No components found.</p>
219
+ <% end %>
220
+ </div>
221
+ </div>
@@ -2,7 +2,11 @@
2
2
 
3
3
  <div class="component-markdown">
4
4
  <p>Components are packages of template, style, behaviour and documentation that live in your application.</p>
5
- <p>See the <a href="https://github.com/alphagov/govuk_publishing_components">govuk_publishing_components gem</a> for further details, or <a href="https://docs.publishing.service.gov.uk/manual/components.html#component-guides">a list of all component guides</a>. Read about how to <a href="https://github.com/alphagov/govuk_publishing_components/blob/master/docs/publishing-to-rubygems.md">release a new version of the gem</a>.</p>
5
+ <p>See the <a href="https://github.com/alphagov/govuk_publishing_components">govuk_publishing_components gem</a> for further details, or <a href="https://docs.publishing.service.gov.uk/manual/components.html#component-guides">a list of all component guides</a>.</p>
6
+ <ul>
7
+ <li>Read about how to <a href="https://github.com/alphagov/govuk_publishing_components/blob/master/docs/publishing-to-rubygems.md">release a new version of the gem</a></li>
8
+ <li><a href="/component-guide/audit">View component audits</a></li>
9
+ </ul>
6
10
  </div>
7
11
 
8
12
  <form role="search" data-module="filter-components" class="component-search">
@@ -1,4 +1,5 @@
1
1
  GovukPublishingComponents::Engine.routes.draw do
2
+ get "/audit" => "audit#show", as: :audit
2
3
  root to: "component_guide#index", as: :component_guide
3
4
  get ":component/preview" => "component_guide#preview", as: :component_preview_all
4
5
  get ":component/:example/preview" => "component_guide#preview", as: :component_preview
@@ -1,3 +1,3 @@
1
1
  module GovukPublishingComponents
2
- VERSION = "21.58.0".freeze
2
+ VERSION = "21.59.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_publishing_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 21.58.0
4
+ version: 21.59.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: 2020-07-14 00:00:00.000000000 Z
11
+ date: 2020-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gds-api-adapters
@@ -597,12 +597,17 @@ files:
597
597
  - app/assets/stylesheets/govuk_publishing_components/components/print/_translation-nav.scss
598
598
  - app/assets/stylesheets/govuk_publishing_components/govuk_frontend_support.scss
599
599
  - app/controllers/govuk_publishing_components/application_controller.rb
600
+ - app/controllers/govuk_publishing_components/audit_controller.rb
600
601
  - app/controllers/govuk_publishing_components/component_guide_controller.rb
601
602
  - app/helpers/govuk_publishing_components/application_helper.rb
603
+ - app/models/govuk_publishing_components/audit_applications.rb
604
+ - app/models/govuk_publishing_components/audit_comparer.rb
605
+ - app/models/govuk_publishing_components/audit_components.rb
602
606
  - app/models/govuk_publishing_components/component_doc.rb
603
607
  - app/models/govuk_publishing_components/component_docs.rb
604
608
  - app/models/govuk_publishing_components/component_example.rb
605
609
  - app/models/govuk_publishing_components/shared_accessibility_criteria.rb
610
+ - app/views/govuk_publishing_components/audit/show.html.erb
606
611
  - app/views/govuk_publishing_components/component_guide/_application_stylesheet.html.erb
607
612
  - app/views/govuk_publishing_components/component_guide/component_doc/_call.html.erb
608
613
  - app/views/govuk_publishing_components/component_guide/component_doc/_component.html.erb