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.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/app/assets/javascripts/components/primer/beta/details_toggle_element.d.ts +4 -3
  4. data/app/assets/javascripts/primer_view_components.js +1 -1
  5. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  6. data/app/assets/styles/primer_view_components.css +1 -1
  7. data/app/assets/styles/primer_view_components.css.map +1 -1
  8. data/app/components/primer/alpha/action_list.js +0 -2
  9. data/app/components/primer/alpha/action_list.ts +0 -2
  10. data/app/components/primer/alpha/segmented_control.css +1 -1
  11. data/app/components/primer/alpha/segmented_control.css.map +1 -1
  12. data/app/components/primer/alpha/toggle_switch.js +1 -0
  13. data/app/components/primer/alpha/toggle_switch.ts +1 -0
  14. data/app/components/primer/beta/breadcrumbs.css +1 -1
  15. data/app/components/primer/beta/breadcrumbs.css.map +1 -1
  16. data/app/components/primer/beta/breadcrumbs.pcss +1 -0
  17. data/app/components/primer/beta/button.css +1 -1
  18. data/app/components/primer/beta/button.css.map +1 -1
  19. data/app/components/primer/beta/details.rb +22 -12
  20. data/app/components/primer/beta/details_toggle_element.d.ts +4 -3
  21. data/app/components/primer/beta/details_toggle_element.js +12 -7
  22. data/app/components/primer/beta/details_toggle_element.ts +12 -7
  23. data/app/components/primer/beta/nav_list.js +0 -1
  24. data/app/components/primer/beta/nav_list.ts +0 -1
  25. data/app/components/primer/beta/nav_list_group_element.js +1 -0
  26. data/app/components/primer/beta/nav_list_group_element.ts +1 -0
  27. data/app/components/primer/beta/truncate.css +1 -1
  28. data/app/components/primer/beta/truncate.css.map +1 -1
  29. data/app/controllers/primer/view_components/action_menu_controller.rb +52 -0
  30. data/app/controllers/primer/view_components/application_controller.rb +10 -0
  31. data/app/controllers/primer/view_components/auto_check_controller.rb +41 -0
  32. data/app/controllers/primer/view_components/auto_complete_test_controller.rb +55 -0
  33. data/app/controllers/primer/view_components/form_handler_controller.rb +31 -0
  34. data/app/controllers/primer/view_components/include_fragment_controller.rb +17 -0
  35. data/app/controllers/primer/view_components/multi_controller.rb +15 -0
  36. data/app/controllers/primer/view_components/nav_list_items_controller.rb +28 -0
  37. data/app/controllers/primer/view_components/select_panel_items_controller.rb +122 -0
  38. data/app/controllers/primer/view_components/toggle_switch_controller.rb +48 -0
  39. data/app/forms/auto_complete_form.rb +1 -1
  40. data/app/forms/immediate_validation_form.rb +3 -3
  41. data/app/lib/primer/forms/acts_as_component.rb +0 -2
  42. data/app/lib/primer/forms/dsl/text_field_input.rb +1 -1
  43. data/app/views/primer/view_components/action_menu/deferred.html.erb +22 -0
  44. data/app/views/primer/view_components/action_menu/deferred_preload.html.erb +5 -0
  45. data/app/views/primer/view_components/action_menu/form_action.html.erb +2 -0
  46. data/app/views/primer/view_components/action_menu/landing.html.erb +3 -0
  47. data/app/views/primer/view_components/auto_check/_error_message.html.erb +1 -0
  48. data/app/views/primer/view_components/auto_check/_success_message.html.erb +1 -0
  49. data/app/views/primer/view_components/auto_check/_warning_message.html.erb +4 -0
  50. data/app/views/primer/view_components/auto_complete_test/index.html.erb +15 -0
  51. data/app/views/primer/view_components/auto_complete_test/no_results.html.erb +16 -0
  52. data/app/views/primer/view_components/form_handler/form_action.html.erb +1 -0
  53. data/app/views/primer/view_components/include_fragment/deferred.html.erb +3 -0
  54. data/app/views/primer/view_components/nav_list_items/index.html.erb +3 -0
  55. data/app/views/primer/view_components/select_panel_items/index.html.erb +15 -0
  56. data/config/routes.rb +27 -0
  57. data/lib/primer/accessibility.rb +3 -0
  58. data/lib/primer/view_components/engine.rb +4 -0
  59. data/lib/primer/view_components/linters/autocorrectable.rb +1 -1
  60. data/lib/primer/view_components/linters/migrations/iconbutton_component.rb +4 -7
  61. data/lib/primer/view_components/linters/migrations/truncate_component.rb +4 -7
  62. data/lib/primer/view_components/version.rb +1 -1
  63. data/lib/rubocop/cop/primer/base_cop.rb +1 -1
  64. data/lib/rubocop/cop/primer/component_name_migration.rb +7 -8
  65. data/lib/rubocop/cop/primer/deprecated_arguments.rb +7 -8
  66. data/lib/rubocop/cop/primer/deprecated_button_arguments.rb +5 -6
  67. data/lib/rubocop/cop/primer/deprecated_label_schemes.rb +6 -7
  68. data/lib/rubocop/cop/primer/deprecated_label_variants.rb +7 -14
  69. data/lib/rubocop/cop/primer/no_tag_memoize.rb +1 -1
  70. data/lib/rubocop/cop/primer/primer_octicon.rb +5 -6
  71. data/previews/primer/alpha/action_menu_preview/multiple_select_form.html.erb +1 -1
  72. data/previews/primer/alpha/action_menu_preview/single_select_form.html.erb +1 -1
  73. data/previews/primer/alpha/action_menu_preview/single_select_form_items.html.erb +2 -2
  74. data/previews/primer/alpha/action_menu_preview/with_actions.html.erb +2 -2
  75. data/previews/primer/alpha/action_menu_preview.rb +2 -2
  76. data/previews/primer/alpha/auto_complete_preview.rb +6 -6
  77. data/previews/primer/alpha/dialog_preview.rb +1 -1
  78. data/previews/primer/alpha/include_fragment_preview.rb +2 -2
  79. data/previews/primer/alpha/select_panel_preview/custom_loading_description.html.erb +1 -1
  80. data/previews/primer/alpha/select_panel_preview/custom_loading_label.html.erb +1 -1
  81. data/previews/primer/alpha/select_panel_preview/eventually_local_fetch.html.erb +1 -1
  82. data/previews/primer/alpha/select_panel_preview/eventually_local_fetch_initial_failure.html.erb +1 -1
  83. data/previews/primer/alpha/select_panel_preview/eventually_local_fetch_no_results.html.erb +1 -1
  84. data/previews/primer/alpha/select_panel_preview/multiselect_form.html.erb +1 -1
  85. data/previews/primer/alpha/select_panel_preview/playground.html.erb +1 -1
  86. data/previews/primer/alpha/select_panel_preview/remote_fetch.html.erb +1 -1
  87. data/previews/primer/alpha/select_panel_preview/remote_fetch_filter_failure.html.erb +1 -1
  88. data/previews/primer/alpha/select_panel_preview/remote_fetch_form.html.erb +2 -2
  89. data/previews/primer/alpha/select_panel_preview/remote_fetch_initial_failure.html.erb +1 -1
  90. data/previews/primer/alpha/select_panel_preview/remote_fetch_no_results.html.erb +1 -1
  91. data/previews/primer/alpha/select_panel_preview/single_select_form.html.erb +1 -1
  92. data/previews/primer/alpha/text_field_preview/input_group_leading_action_menu.html.erb +1 -1
  93. data/previews/primer/alpha/text_field_preview.rb +3 -3
  94. data/previews/primer/alpha/toggle_switch_preview.rb +11 -11
  95. data/previews/primer/beta/auto_complete_preview/with_submit_button.html.erb +1 -1
  96. data/previews/primer/beta/auto_complete_preview.rb +18 -18
  97. data/previews/primer/beta/breadcrumbs_preview/with_long_items.html.erb +13 -0
  98. data/previews/primer/beta/breadcrumbs_preview.rb +6 -0
  99. data/previews/primer/beta/details_preview.rb +16 -0
  100. data/previews/primer/beta/nav_list_preview.rb +2 -2
  101. data/previews/primer/forms_preview/action_menu_form.html.erb +1 -1
  102. data/previews/primer/forms_preview/auto_complete_form.html.erb +1 -1
  103. data/previews/primer/forms_preview/example_toggle_switch_form.html.erb +2 -2
  104. data/previews/primer/forms_preview/multi_input_form.html.erb +1 -1
  105. data/previews/primer/forms_preview/select_form.html.erb +1 -1
  106. data/previews/primer/url_helpers.rb +1 -0
  107. data/static/arguments.json +67 -37
  108. data/static/audited_at.json +1 -0
  109. data/static/constants.json +13 -2
  110. data/static/info_arch.json +638 -1407
  111. data/static/previews.json +112 -0
  112. data/static/statuses.json +1 -0
  113. 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
@@ -71,8 +71,6 @@ module Primer
71
71
 
72
72
  if base_path
73
73
  @base_template_path = File.dirname(base_path)
74
- else
75
- warn "Could not identify the template for #{self}"
76
74
  end
77
75
  end
78
76
 
@@ -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,2 @@
1
+ You selected <%= @value.inspect %><br>
2
+ Other params sent to server: <%= @other_params.inspect %>
@@ -0,0 +1,3 @@
1
+ <div class="action-menu-landing-page">
2
+ Hello world!
3
+ </div>
@@ -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,4 @@
1
+ The name <strong><%= input_value %></strong> is available.
2
+ <div class="color-fg-muted">
3
+ The name can only contain ASCII letters, digits, and the characters <code>.</code>, <code>-</code> and <code>_</code>.
4
+ </div>
@@ -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,3 @@
1
+ <div>
2
+ Hello world!
3
+ </div>
@@ -0,0 +1,3 @@
1
+ <% @data.each do |item_arguments| %>
2
+ <%= render(Primer::Beta::NavList::Item.new(list: @list, **item_arguments)) %>
3
+ <% end %>
@@ -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
@@ -37,7 +37,10 @@ module Primer
37
37
  }
38
38
  }.freeze
39
39
 
40
+ # rubocop:disable Style/ClassMethodsDefinitions
40
41
  class << self
42
+ # rubocop:enable Style/ClassMethodsDefinitions
43
+
41
44
  def ignore_preview?(preview_class)
42
45
  IGNORED_PREVIEWS.include?(preview_class)
43
46
  end
@@ -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 erblint in autocorrect mode:\n\nbundle exec erblint -a #{processed_source.filename}\n"
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::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
- end
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::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
- end
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)
@@ -6,7 +6,7 @@ module Primer
6
6
  module VERSION
7
7
  MAJOR = 0
8
8
  MINOR = 43
9
- PATCH = 1
9
+ PATCH = 3
10
10
 
11
11
  STRING = [MAJOR, MINOR, PATCH].join(".")
12
12
  end
@@ -8,7 +8,7 @@ module RuboCop
8
8
  module Cop
9
9
  module Primer
10
10
  # :nodoc:
11
- class BaseCop < RuboCop::Cop::Cop
11
+ class BaseCop < RuboCop::Cop::Base
12
12
  # We only verify SystemArguments if it's a `.new` call on a component or
13
13
  # a ViewHeleper call.
14
14
  def valid_node?(node)
@@ -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
- add_offense(node.receiver, message: message)
23
- end
24
-
25
- def autocorrect(node)
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
- def autocorrect(node)
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
- end
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