primer_view_components 0.43.1 → 0.43.3
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 +4 -4
- data/CHANGELOG.md +26 -0
- data/app/assets/javascripts/components/primer/beta/details_toggle_element.d.ts +4 -3
- data/app/assets/javascripts/primer_view_components.js +1 -1
- data/app/assets/javascripts/primer_view_components.js.map +1 -1
- data/app/assets/styles/primer_view_components.css +1 -1
- data/app/assets/styles/primer_view_components.css.map +1 -1
- data/app/components/primer/alpha/action_list.js +0 -2
- data/app/components/primer/alpha/action_list.ts +0 -2
- data/app/components/primer/alpha/segmented_control.css +1 -1
- data/app/components/primer/alpha/segmented_control.css.map +1 -1
- data/app/components/primer/alpha/toggle_switch.js +1 -0
- data/app/components/primer/alpha/toggle_switch.ts +1 -0
- data/app/components/primer/beta/breadcrumbs.css +1 -1
- data/app/components/primer/beta/breadcrumbs.css.map +1 -1
- data/app/components/primer/beta/breadcrumbs.pcss +1 -0
- data/app/components/primer/beta/button.css +1 -1
- data/app/components/primer/beta/button.css.map +1 -1
- data/app/components/primer/beta/details.rb +22 -12
- data/app/components/primer/beta/details_toggle_element.d.ts +4 -3
- data/app/components/primer/beta/details_toggle_element.js +12 -7
- data/app/components/primer/beta/details_toggle_element.ts +12 -7
- data/app/components/primer/beta/nav_list.js +0 -1
- data/app/components/primer/beta/nav_list.ts +0 -1
- data/app/components/primer/beta/nav_list_group_element.js +1 -0
- data/app/components/primer/beta/nav_list_group_element.ts +1 -0
- data/app/components/primer/beta/truncate.css +1 -1
- data/app/components/primer/beta/truncate.css.map +1 -1
- data/app/controllers/primer/view_components/action_menu_controller.rb +52 -0
- data/app/controllers/primer/view_components/application_controller.rb +10 -0
- data/app/controllers/primer/view_components/auto_check_controller.rb +41 -0
- data/app/controllers/primer/view_components/auto_complete_test_controller.rb +55 -0
- data/app/controllers/primer/view_components/form_handler_controller.rb +31 -0
- data/app/controllers/primer/view_components/include_fragment_controller.rb +17 -0
- data/app/controllers/primer/view_components/multi_controller.rb +15 -0
- data/app/controllers/primer/view_components/nav_list_items_controller.rb +28 -0
- data/app/controllers/primer/view_components/select_panel_items_controller.rb +122 -0
- data/app/controllers/primer/view_components/toggle_switch_controller.rb +48 -0
- data/app/forms/auto_complete_form.rb +1 -1
- data/app/forms/immediate_validation_form.rb +3 -3
- data/app/lib/primer/forms/acts_as_component.rb +0 -2
- data/app/lib/primer/forms/dsl/text_field_input.rb +1 -1
- data/app/views/primer/view_components/action_menu/deferred.html.erb +22 -0
- data/app/views/primer/view_components/action_menu/deferred_preload.html.erb +5 -0
- data/app/views/primer/view_components/action_menu/form_action.html.erb +2 -0
- data/app/views/primer/view_components/action_menu/landing.html.erb +3 -0
- data/app/views/primer/view_components/auto_check/_error_message.html.erb +1 -0
- data/app/views/primer/view_components/auto_check/_success_message.html.erb +1 -0
- data/app/views/primer/view_components/auto_check/_warning_message.html.erb +4 -0
- data/app/views/primer/view_components/auto_complete_test/index.html.erb +15 -0
- data/app/views/primer/view_components/auto_complete_test/no_results.html.erb +16 -0
- data/app/views/primer/view_components/form_handler/form_action.html.erb +1 -0
- data/app/views/primer/view_components/include_fragment/deferred.html.erb +3 -0
- data/app/views/primer/view_components/nav_list_items/index.html.erb +3 -0
- data/app/views/primer/view_components/select_panel_items/index.html.erb +15 -0
- data/config/routes.rb +27 -0
- data/lib/primer/accessibility.rb +3 -0
- data/lib/primer/view_components/engine.rb +4 -0
- data/lib/primer/view_components/linters/autocorrectable.rb +1 -1
- data/lib/primer/view_components/linters/migrations/iconbutton_component.rb +4 -7
- data/lib/primer/view_components/linters/migrations/truncate_component.rb +4 -7
- data/lib/primer/view_components/version.rb +1 -1
- data/lib/rubocop/cop/primer/base_cop.rb +1 -1
- data/lib/rubocop/cop/primer/component_name_migration.rb +7 -8
- data/lib/rubocop/cop/primer/deprecated_arguments.rb +7 -8
- data/lib/rubocop/cop/primer/deprecated_button_arguments.rb +5 -6
- data/lib/rubocop/cop/primer/deprecated_label_schemes.rb +6 -7
- data/lib/rubocop/cop/primer/deprecated_label_variants.rb +7 -14
- data/lib/rubocop/cop/primer/no_tag_memoize.rb +1 -1
- data/lib/rubocop/cop/primer/primer_octicon.rb +5 -6
- data/previews/primer/alpha/action_menu_preview/multiple_select_form.html.erb +1 -1
- data/previews/primer/alpha/action_menu_preview/single_select_form.html.erb +1 -1
- data/previews/primer/alpha/action_menu_preview/single_select_form_items.html.erb +2 -2
- data/previews/primer/alpha/action_menu_preview/with_actions.html.erb +2 -2
- data/previews/primer/alpha/action_menu_preview.rb +2 -2
- data/previews/primer/alpha/auto_complete_preview.rb +6 -6
- data/previews/primer/alpha/dialog_preview.rb +1 -1
- data/previews/primer/alpha/include_fragment_preview.rb +2 -2
- data/previews/primer/alpha/select_panel_preview/custom_loading_description.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/custom_loading_label.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/eventually_local_fetch.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/eventually_local_fetch_initial_failure.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/eventually_local_fetch_no_results.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/multiselect_form.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/playground.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/remote_fetch.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/remote_fetch_filter_failure.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/remote_fetch_form.html.erb +2 -2
- data/previews/primer/alpha/select_panel_preview/remote_fetch_initial_failure.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/remote_fetch_no_results.html.erb +1 -1
- data/previews/primer/alpha/select_panel_preview/single_select_form.html.erb +1 -1
- data/previews/primer/alpha/text_field_preview/input_group_leading_action_menu.html.erb +1 -1
- data/previews/primer/alpha/text_field_preview.rb +3 -3
- data/previews/primer/alpha/toggle_switch_preview.rb +11 -11
- data/previews/primer/beta/auto_complete_preview/with_submit_button.html.erb +1 -1
- data/previews/primer/beta/auto_complete_preview.rb +18 -18
- data/previews/primer/beta/breadcrumbs_preview/with_long_items.html.erb +13 -0
- data/previews/primer/beta/breadcrumbs_preview.rb +6 -0
- data/previews/primer/beta/details_preview.rb +16 -0
- data/previews/primer/beta/nav_list_preview.rb +2 -2
- data/previews/primer/forms_preview/action_menu_form.html.erb +1 -1
- data/previews/primer/forms_preview/auto_complete_form.html.erb +1 -1
- data/previews/primer/forms_preview/example_toggle_switch_form.html.erb +2 -2
- data/previews/primer/forms_preview/multi_input_form.html.erb +1 -1
- data/previews/primer/forms_preview/select_form.html.erb +1 -1
- data/previews/primer/url_helpers.rb +1 -0
- data/static/arguments.json +67 -37
- data/static/audited_at.json +1 -0
- data/static/constants.json +13 -2
- data/static/info_arch.json +638 -1407
- data/static/previews.json +112 -0
- data/static/statuses.json +1 -0
- metadata +27 -2
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module ViewComponents
|
5
|
+
# :nodoc:
|
6
|
+
# :nocov:
|
7
|
+
class IncludeFragmentController < ApplicationController
|
8
|
+
layout false
|
9
|
+
|
10
|
+
def landing; end
|
11
|
+
|
12
|
+
def deferred
|
13
|
+
render "primer/view_components/include_fragment/deferred"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module ViewComponents
|
5
|
+
# works with app/forms/multi_input_form.rb
|
6
|
+
# :nocov:
|
7
|
+
class MultiController < ApplicationController
|
8
|
+
def create
|
9
|
+
respond_to do |format|
|
10
|
+
format.json { render json: params.permit(:country, :region).to_h }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module ViewComponents
|
5
|
+
# For nav list previews/tests
|
6
|
+
# :nocov:
|
7
|
+
class NavListItemsController < ApplicationController
|
8
|
+
layout false
|
9
|
+
|
10
|
+
FOODS = [
|
11
|
+
{ label: "Bachelor Chow", href: "/foods/bachelor-chow" },
|
12
|
+
{ label: "LöBrau", href: "/foods/lobrau" },
|
13
|
+
{ label: "Taco Bellevue Hospital", href: "/foods/taco-bellevue-hospital" },
|
14
|
+
{ label: "Olde Fortran", href: "/foods/olde-fortran" },
|
15
|
+
{ label: "Space Honey", href: "/foods/space-honey" },
|
16
|
+
{ label: "Spice Weasel", href: "/foods/spice-weasel" },
|
17
|
+
]
|
18
|
+
|
19
|
+
def index
|
20
|
+
items_per_page = 2
|
21
|
+
# the first page is already shown in the nav list, so we need to offset the starting index
|
22
|
+
start_index = (params[:page].to_i - items_per_page) * items_per_page
|
23
|
+
@data = FOODS.slice(start_index, items_per_page)
|
24
|
+
@list = Primer::Beta::NavList::Group.new # dummy group
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module ViewComponents
|
5
|
+
# :nodoc:
|
6
|
+
# :nocov:
|
7
|
+
class SelectPanelItemsController < ApplicationController
|
8
|
+
SELECT_PANEL_ITEMS = [
|
9
|
+
{ value: 1, title: "Photon torpedo", description: "Starship-mounted missile" },
|
10
|
+
{ value: 2, title: "Bat'leth", description: "The Klingon warrior's preferred means of achieving honor" },
|
11
|
+
{ value: 3, title: "Phaser", description: "The iconic handheld laser beam" },
|
12
|
+
{ value: 4, title: "Lightsaber", description: "An elegant weapon for a more civilized age", recent: true },
|
13
|
+
{ value: 5, title: "Proton pack", description: "Ghostbusting equipment" },
|
14
|
+
{ value: 6, title: "Sonic screwdriver", description: "The Time Lord's multi-purpose tool" },
|
15
|
+
{ value: 7, title: "Tricorder", description: "Handheld sensor device", recent: true },
|
16
|
+
{ value: 8, title: "TARDIS", description: "Time and relative dimension in space" }
|
17
|
+
]
|
18
|
+
|
19
|
+
COOKIE_PREFIX = "select-panel-seen-uuid-"
|
20
|
+
|
21
|
+
def index
|
22
|
+
# delay a bit so loading spinners, etc can be seen
|
23
|
+
sleep 2
|
24
|
+
|
25
|
+
if params.fetch(:fail, "false") == "true"
|
26
|
+
uuid = params[:uuid]
|
27
|
+
|
28
|
+
# use the uuid to succeed for the first request and fail for all subsequent requests
|
29
|
+
if !uuid || seen_uuid?(uuid)
|
30
|
+
render status: :internal_server_error, plain: "An error occurred"
|
31
|
+
return
|
32
|
+
end
|
33
|
+
|
34
|
+
mark_seen_uuid(uuid) if uuid
|
35
|
+
end
|
36
|
+
|
37
|
+
show_results = params.fetch(:show_results, "true") == "true"
|
38
|
+
query = (params[:q] || "").downcase
|
39
|
+
|
40
|
+
results = if show_results
|
41
|
+
SELECT_PANEL_ITEMS.select do |item|
|
42
|
+
[item[:title], item[:description]].join(" ").downcase.include?(query)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
[]
|
46
|
+
end
|
47
|
+
|
48
|
+
if allows_selection?
|
49
|
+
results = results.map(&:dup)
|
50
|
+
results.each do |result|
|
51
|
+
if selected_items.any? { |item| result[:title].downcase.include?(item) }
|
52
|
+
result[:selected] = true
|
53
|
+
break if single_select?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
clean_up_old_uuids(uuid)
|
59
|
+
|
60
|
+
respond_to do |format|
|
61
|
+
format.any(:html, :html_fragment) do
|
62
|
+
render(
|
63
|
+
"primer/view_components/select_panel_items/index",
|
64
|
+
locals: { results: results },
|
65
|
+
layout: false,
|
66
|
+
formats: [:html, :html_fragment]
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def seen_uuid?(uuid)
|
75
|
+
cookies.has_key?(key_for(uuid))
|
76
|
+
end
|
77
|
+
|
78
|
+
def mark_seen_uuid(uuid)
|
79
|
+
cookies[key_for(uuid)] = "true"
|
80
|
+
end
|
81
|
+
|
82
|
+
def clean_up_old_uuids(current_uuid)
|
83
|
+
current_key = key_for(current_uuid)
|
84
|
+
to_delete = []
|
85
|
+
|
86
|
+
cookies.each do |k, _|
|
87
|
+
if k.start_with?(COOKIE_PREFIX) && k != current_key
|
88
|
+
to_delete << k
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
to_delete.each do |k|
|
93
|
+
cookies.delete(k)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def key_for(uuid)
|
98
|
+
"#{COOKIE_PREFIX}#{uuid}"
|
99
|
+
end
|
100
|
+
|
101
|
+
def selected_items
|
102
|
+
params.fetch(:selected_items, "").downcase.split(",").map(&:strip)
|
103
|
+
end
|
104
|
+
|
105
|
+
def select_variant
|
106
|
+
@select_variant ||= params.fetch(:select_variant, Primer::Alpha::SelectPanel::DEFAULT_SELECT_VARIANT).to_sym
|
107
|
+
end
|
108
|
+
|
109
|
+
def single_select?
|
110
|
+
select_variant == :single
|
111
|
+
end
|
112
|
+
|
113
|
+
def multi_select?
|
114
|
+
select_variant == :multiple
|
115
|
+
end
|
116
|
+
|
117
|
+
def allows_selection?
|
118
|
+
Primer::Alpha::SelectPanel::SELECT_VARIANT_OPTIONS.include?(select_variant)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
module ViewComponents
|
5
|
+
# For toggle switch previews/tests
|
6
|
+
# :nocov:
|
7
|
+
class ToggleSwitchController < ApplicationController
|
8
|
+
class << self
|
9
|
+
attr_accessor :last_request
|
10
|
+
end
|
11
|
+
|
12
|
+
rescue_from ActionController::InvalidAuthenticityToken, with: :handle_invalid_authenticity_token
|
13
|
+
|
14
|
+
before_action :reject_non_ajax_request
|
15
|
+
|
16
|
+
def create
|
17
|
+
# lol this is so not threadsafe
|
18
|
+
self.class.last_request = request
|
19
|
+
|
20
|
+
sleep 1 unless Rails.env.test?
|
21
|
+
|
22
|
+
if params[:fail] == "true"
|
23
|
+
render status: :internal_server_error, plain: "Something went wrong."
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
head :accepted
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def handle_invalid_authenticity_token
|
33
|
+
render status: :unauthorized, plain: "Bad CSRF token."
|
34
|
+
end
|
35
|
+
|
36
|
+
# this mimics dotcom behavior
|
37
|
+
def reject_non_ajax_request
|
38
|
+
return if request.headers["HTTP_REQUESTED_WITH"] == "XMLHttpRequest"
|
39
|
+
|
40
|
+
head :unprocessable_entity
|
41
|
+
end
|
42
|
+
|
43
|
+
def form_params
|
44
|
+
params.permit(:value, :authenticity_token)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -9,7 +9,7 @@ class AutoCompleteForm < ApplicationForm
|
|
9
9
|
name: :fruit,
|
10
10
|
label: "Fruit",
|
11
11
|
caption: "Please enter your favorite fruit",
|
12
|
-
src: Primer::UrlHelpers.autocomplete_index_path,
|
12
|
+
src: Primer::UrlHelpers.primer_view_components.autocomplete_index_path,
|
13
13
|
validation_message: "Something went wrong"
|
14
14
|
)
|
15
15
|
|
@@ -8,14 +8,14 @@ class ImmediateValidationForm < ApplicationForm
|
|
8
8
|
name: :has_error,
|
9
9
|
label: "Will have error",
|
10
10
|
caption: "Every time this checks with the server, it returns an error",
|
11
|
-
auto_check_src: @view_context.example_check_error_path
|
11
|
+
auto_check_src: @view_context.primer_view_components.example_check_error_path
|
12
12
|
)
|
13
13
|
|
14
14
|
validation_form.text_field(
|
15
15
|
name: :no_error,
|
16
16
|
label: "Will not error",
|
17
17
|
caption: "Will not have an error when it checks the server",
|
18
|
-
auto_check_src: @view_context.example_check_ok_path,
|
18
|
+
auto_check_src: @view_context.primer_view_components.example_check_ok_path,
|
19
19
|
validation_message: "This message will go away once you type something"
|
20
20
|
)
|
21
21
|
|
@@ -23,7 +23,7 @@ class ImmediateValidationForm < ApplicationForm
|
|
23
23
|
name: :random_error,
|
24
24
|
label: "Random error or success",
|
25
25
|
caption: "Server checks will randomly respond with errors or success",
|
26
|
-
auto_check_src: @view_context.example_check_random_path
|
26
|
+
auto_check_src: @view_context.primer_view_components.example_check_random_path
|
27
27
|
)
|
28
28
|
end
|
29
29
|
end
|
@@ -20,7 +20,7 @@ module Primer
|
|
20
20
|
@leading_visual = system_arguments.delete(:leading_visual)
|
21
21
|
@trailing_visual = system_arguments.delete(:trailing_visual)
|
22
22
|
@leading_spinner = !!system_arguments.delete(:leading_spinner)
|
23
|
-
@clear_button_id = system_arguments.delete(:clear_button_id)
|
23
|
+
@clear_button_id = system_arguments.delete(:clear_button_id) || SecureRandom.uuid
|
24
24
|
@inset = system_arguments.delete(:inset)
|
25
25
|
@monospace = system_arguments.delete(:monospace)
|
26
26
|
@auto_check_src = system_arguments.delete(:auto_check_src)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
<%= render(Primer::Alpha::ActionMenu::List.new(menu_id: "deferred")) do |list| %>
|
2
|
+
<% list.with_item(label: "Copy link", value: "", autofocus: true) %>
|
3
|
+
<% list.with_item(label: "Quote reply", value: "") %>
|
4
|
+
<% list.with_item(label: "Reference in new issue", value: "") %>
|
5
|
+
<% list.with_item(
|
6
|
+
label: "Show dialog",
|
7
|
+
tag: :button,
|
8
|
+
content_arguments: { "data-show-dialog-id": "my-dialog" },
|
9
|
+
value: "",
|
10
|
+
scheme: :danger
|
11
|
+
) %>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<%= render(Primer::Alpha::Dialog.new(id: "my-dialog", title: "Confirm deletion")) do |d| %>
|
15
|
+
<%= render(Primer::Alpha::Dialog::Body.new()) do %>
|
16
|
+
Are you sure you want to delete this?
|
17
|
+
<% end %>
|
18
|
+
<%= render(Primer::Alpha::Dialog::Footer.new()) do %>
|
19
|
+
<%= render(Primer::Beta::Button.new(data: { "close-dialog-id": "my-dialog" })) { "Cancel" } %>
|
20
|
+
<%= render(Primer::Beta::Button.new(scheme: :danger)) { "Delete" } %>
|
21
|
+
<% end %>
|
22
|
+
<% end %>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<%= render(Primer::Alpha::ActionMenu::List.new(menu_id: "deferred-preload")) do |list| %>
|
2
|
+
<% list.with_item(label: "Copy link", value: "", autofocus: true) %>
|
3
|
+
<% list.with_item(label: "Quote reply", value: "") %>
|
4
|
+
<% list.with_item(label: "Reference in new issue", value: "") %>
|
5
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
The name <code><%= input_value %></code> is already taken.
|
@@ -0,0 +1 @@
|
|
1
|
+
The name <code><%= input_value %></code> is available.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<%# erblint:counter DeprecatedComponentsCounter 2 %>
|
2
|
+
<% @fruit_list.each do |fruit| %>
|
3
|
+
<% if params['version'] == "alpha" %>
|
4
|
+
<%= render(Primer::Alpha::AutoComplete::Item.new(value: fruit)) { fruit } %>
|
5
|
+
<% else %>
|
6
|
+
<%= render(Primer::Beta::AutoComplete::Item.new(value: fruit)) do |component| %>
|
7
|
+
<% if @visual_type == "leading" %>
|
8
|
+
<% component.with_leading_visual_icon(icon: :"mark-github") %>
|
9
|
+
<% elsif @visual_type == "trailing" %>
|
10
|
+
<% component.with_trailing_visual_icon(icon: :"mark-github") %>
|
11
|
+
<% end %>
|
12
|
+
<%= fruit %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% if @fruit_list.length > 0 %>
|
2
|
+
<% @fruit_list.each do |fruit| %>
|
3
|
+
<%= render(Primer::Beta::AutoComplete::Item.new(value: fruit)) do |component| %>
|
4
|
+
<% if @visual_type == "leading" %>
|
5
|
+
<% component.with_leading_visual_icon(icon: :"mark-github") %>
|
6
|
+
<% elsif @visual_type == "trailing" %>
|
7
|
+
<% component.with_trailing_visual_icon(icon: :"mark-github") %>
|
8
|
+
<% end %>
|
9
|
+
<%= fruit %>
|
10
|
+
<% end %>
|
11
|
+
<% end %>
|
12
|
+
<% else %>
|
13
|
+
<%= render(Primer::Beta::AutoComplete::NoResultItem.new) do %>
|
14
|
+
No results!
|
15
|
+
<% end %>
|
16
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
Params sent to server: <%= @form_params.inspect %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<% unless results.empty? %>
|
2
|
+
<%= render(Primer::Alpha::SelectPanel::ItemList.new(
|
3
|
+
select_variant: (params[:select_variant] || :multiple).to_sym,
|
4
|
+
aria: {
|
5
|
+
label: "options",
|
6
|
+
},
|
7
|
+
)) do |list| %>
|
8
|
+
<% results.each do |result| %>
|
9
|
+
<% list.with_item(content_arguments: { data: { value: result[:value] } }, active: result[:selected] || false) do |item| %>
|
10
|
+
<% item.with_description { result[:description] } %>
|
11
|
+
<%= result[:title] %>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Primer::ViewComponents::Engine.routes.draw do
|
4
|
+
get "/auto_complete", to: "auto_complete_test#index", as: :autocomplete_index
|
5
|
+
get "/auto_complete_no_results", to: "auto_complete_test#no_results", as: :autocomplete_no_results
|
6
|
+
|
7
|
+
resources :toggle_switch, only: [:create]
|
8
|
+
resources :nav_list_items, only: [:index]
|
9
|
+
resources :multi, only: [:create]
|
10
|
+
resources :select_panel_items, only: [:index]
|
11
|
+
resources :tree_view_items, only: [:index]
|
12
|
+
|
13
|
+
# generic form submission path
|
14
|
+
post "/form_handler", to: "form_handler#form_action", as: :generic_form_submission
|
15
|
+
|
16
|
+
post "/example_check/accepted", to: "auto_check#accepted", as: :example_check_accepted
|
17
|
+
post "/example_check/ok", to: "auto_check#ok", as: :example_check_ok
|
18
|
+
post "/example_check/error", to: "auto_check#error", as: :example_check_error
|
19
|
+
post "/example_check/random", to: "auto_check#random", as: :example_check_random
|
20
|
+
|
21
|
+
get "/action_menu/landing_page", to: "action_menu#landing", as: :action_menu_landing
|
22
|
+
post "/action_menu/form_action", to: "action_menu#form_action", as: :action_menu_form_action
|
23
|
+
get "/action_menu/deferred", to: "action_menu#deferred", as: :action_menu_deferred
|
24
|
+
get "/action_menu/deferred_preload", to: "action_menu#deferred_preload", as: :action_menu_deferred_preload
|
25
|
+
|
26
|
+
get "/include_fragment/deferred", to: "include_fragment#deferred", as: :include_fragment_deferred
|
27
|
+
end
|
data/lib/primer/accessibility.rb
CHANGED
@@ -27,6 +27,10 @@ module Primer
|
|
27
27
|
config.primer_view_components.validate_class_names = !Rails.env.production?
|
28
28
|
config.primer_view_components.raise_on_invalid_aria = false
|
29
29
|
|
30
|
+
initializer "primer_view_components.mime_types" do
|
31
|
+
Mime::Type.register "text/fragment+html", :html_fragment
|
32
|
+
end
|
33
|
+
|
30
34
|
initializer "primer_view_components.assets" do |app|
|
31
35
|
app.config.assets.precompile += %w[primer_view_components] if app.config.respond_to?(:assets)
|
32
36
|
end
|
@@ -25,7 +25,7 @@ module ERBLint
|
|
25
25
|
def message(args, processed_source)
|
26
26
|
return self.class::MESSAGE if args.nil?
|
27
27
|
|
28
|
-
"#{self.class::MESSAGE}\nTry using:\n\n#{correction(args)}\n\nYou can also run
|
28
|
+
"#{self.class::MESSAGE}\nTry using:\n\n#{correction(args)}\n\nYou can also run erb_lint in autocorrect mode:\n\nbundle exec erb_lint -a #{processed_source.filename}\n"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -4,7 +4,8 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Migrations
|
6
6
|
# Lint and autocorrect deprecated IconButton
|
7
|
-
class IconButtonComponent < RuboCop::Cop::
|
7
|
+
class IconButtonComponent < RuboCop::Cop::Base
|
8
|
+
extend AutoCorrector
|
8
9
|
INVALID_MESSAGE = <<~STR
|
9
10
|
`Primer::IconButton` is deprecated. Please use `Primer::Beta::IconButton` instead.
|
10
11
|
STR
|
@@ -20,13 +21,9 @@ module RuboCop
|
|
20
21
|
def on_send(node)
|
21
22
|
return unless icon_button(node)
|
22
23
|
|
23
|
-
add_offense(node, message: INVALID_MESSAGE)
|
24
|
-
|
25
|
-
|
26
|
-
def autocorrect(node)
|
27
|
-
return if hash_with_box_value?(node.arguments.first)
|
24
|
+
add_offense(node, message: INVALID_MESSAGE) do |corrector|
|
25
|
+
next if hash_with_box_value?(node.arguments.first)
|
28
26
|
|
29
|
-
lambda do |corrector|
|
30
27
|
corrector.replace(icon_button(node), "Primer::Beta::IconButton")
|
31
28
|
end
|
32
29
|
end
|
@@ -4,7 +4,8 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
module Migrations
|
6
6
|
# Lint & autocorrect Truncate components
|
7
|
-
class TruncateComponent < RuboCop::Cop::
|
7
|
+
class TruncateComponent < RuboCop::Cop::Base
|
8
|
+
extend AutoCorrector
|
8
9
|
INVALID_MESSAGE = <<~STR
|
9
10
|
`Primer::Truncate` is deprecated. Please use `Primer::Beta::Truncate` instead!
|
10
11
|
STR
|
@@ -24,13 +25,9 @@ module RuboCop
|
|
24
25
|
def on_send(node)
|
25
26
|
return unless truncate_component(node)
|
26
27
|
|
27
|
-
add_offense(node, message: INVALID_MESSAGE)
|
28
|
-
|
29
|
-
|
30
|
-
def autocorrect(node)
|
31
|
-
return if hash_with_inline_value?(node.arguments.first)
|
28
|
+
add_offense(node, message: INVALID_MESSAGE) do |corrector|
|
29
|
+
next if hash_with_inline_value?(node.arguments.first)
|
32
30
|
|
33
|
-
lambda do |corrector|
|
34
31
|
if node.arguments.first.nil? == false
|
35
32
|
corrector.replace(node.children.first, "Primer::Beta::Truncate")
|
36
33
|
corrector.insert_after(node.arguments.first, ", tag: :div") unless truncate_with_tag?(node.arguments.first)
|
@@ -15,20 +15,19 @@ module RuboCop
|
|
15
15
|
# good
|
16
16
|
# Primer::Beta::ComponentName.new()
|
17
17
|
class ComponentNameMigration < BaseCop
|
18
|
+
extend AutoCorrector
|
19
|
+
|
18
20
|
def on_send(node)
|
19
21
|
return unless node.method_name == :new && !node.receiver.nil? && ::Primer::Deprecations.deprecated?(node.receiver.const_name)
|
20
22
|
|
21
23
|
message = ::Primer::Deprecations.deprecation_message(node.receiver.const_name)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
lambda do |corrector|
|
27
|
-
component_name = node.const_name
|
28
|
-
return unless ::Primer::Deprecations.correctable?(component_name)
|
24
|
+
|
25
|
+
add_offense(node.receiver, message: message) do |corrector|
|
26
|
+
component_name = node.receiver.const_name
|
27
|
+
next unless ::Primer::Deprecations.correctable?(component_name)
|
29
28
|
|
30
29
|
replacement = ::Primer::Deprecations.replacement(component_name)
|
31
|
-
corrector.replace(node, replacement) if replacement.present?
|
30
|
+
corrector.replace(node.receiver, replacement) if replacement.present?
|
32
31
|
end
|
33
32
|
end
|
34
33
|
end
|
@@ -14,6 +14,7 @@ module RuboCop
|
|
14
14
|
# good
|
15
15
|
# Component.new(foo: :bar)
|
16
16
|
class DeprecatedArguments < BaseCop
|
17
|
+
extend AutoCorrector
|
17
18
|
INVALID_MESSAGE = <<~STR
|
18
19
|
Avoid using deprecated arguments: https://primer.style/view-components/deprecated.
|
19
20
|
STR
|
@@ -283,17 +284,15 @@ module RuboCop
|
|
283
284
|
key, value = extract_kv_from(pair)
|
284
285
|
next unless DEPRECATED.key?(key) && DEPRECATED[key].key?(value)
|
285
286
|
|
286
|
-
add_offense(pair, message: INVALID_MESSAGE)
|
287
|
+
add_offense(pair, message: INVALID_MESSAGE) do |corrector|
|
288
|
+
key, value = extract_kv_from(pair)
|
289
|
+
replacement = DEPRECATED[key][value]
|
290
|
+
corrector.replace(pair, replacement) if replacement.present?
|
291
|
+
end
|
287
292
|
end
|
288
293
|
end
|
289
294
|
|
290
|
-
|
291
|
-
lambda do |corrector|
|
292
|
-
key, value = extract_kv_from(node)
|
293
|
-
replacement = DEPRECATED[key][value]
|
294
|
-
corrector.replace(node, replacement) if replacement.present?
|
295
|
-
end
|
296
|
-
end
|
295
|
+
|
297
296
|
|
298
297
|
def extract_kv_from(pair)
|
299
298
|
key = pair.key.value
|
@@ -14,6 +14,7 @@ module RuboCop
|
|
14
14
|
# good
|
15
15
|
# ButtonComponent.new(size: :small)
|
16
16
|
class DeprecatedButtonArguments < BaseCop
|
17
|
+
extend AutoCorrector
|
17
18
|
INVALID_MESSAGE = <<~STR
|
18
19
|
`variant` is deprecated. Use `size` instead.
|
19
20
|
STR
|
@@ -37,14 +38,12 @@ module RuboCop
|
|
37
38
|
|
38
39
|
return if pair.nil?
|
39
40
|
|
40
|
-
add_offense(pair.key, message: INVALID_MESSAGE)
|
41
|
-
|
42
|
-
|
43
|
-
def autocorrect(node)
|
44
|
-
lambda do |corrector|
|
45
|
-
corrector.replace(node, DEPRECATIONS[node.value])
|
41
|
+
add_offense(pair.key, message: INVALID_MESSAGE) do |corrector|
|
42
|
+
corrector.replace(pair.key, DEPRECATIONS[pair.key.value])
|
46
43
|
end
|
47
44
|
end
|
45
|
+
|
46
|
+
|
48
47
|
end
|
49
48
|
end
|
50
49
|
end
|