openproject-primer_view_components 0.41.0 → 0.42.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/app/assets/javascripts/app/components/primer/alpha/select_panel_element.d.ts +0 -1
- 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/item.html.erb +1 -5
- data/app/components/primer/alpha/action_list/item.rb +10 -3
- 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/segmented_control.pcss +1 -0
- data/app/components/primer/alpha/select_panel.rb +2 -1
- data/app/components/primer/alpha/select_panel_element.d.ts +0 -1
- data/app/components/primer/alpha/select_panel_element.js +38 -19
- data/app/components/primer/alpha/select_panel_element.ts +36 -22
- data/app/components/primer/alpha/tool_tip.js +2 -2
- data/app/components/primer/alpha/tool_tip.ts +2 -2
- data/app/components/primer/beta/relative_time.rb +4 -4
- data/app/components/primer/beta/state.css +1 -1
- data/app/components/primer/beta/state.css.map +1 -1
- data/app/components/primer/beta/state.pcss +4 -0
- data/lib/primer/forms/text_area.rb +7 -1
- data/lib/primer/view_components/linters/details_menu_migration.rb +30 -1
- data/lib/primer/view_components/linters/tooltipped_migration.rb +1 -1
- data/lib/primer/view_components/version.rb +1 -1
- data/previews/primer/alpha/action_list_preview.rb +1 -1
- data/previews/primer/alpha/select_panel_preview/list_of_links.html.erb +16 -0
- data/previews/primer/alpha/select_panel_preview/playground.html.erb +2 -1
- data/previews/primer/alpha/select_panel_preview.rb +12 -1
- data/previews/primer/alpha/text_area_preview.rb +5 -2
- data/previews/primer/forms_preview/custom_width_fields_form.html.erb +34 -2
- data/static/arguments.json +5 -5
- data/static/info_arch.json +57 -11
- data/static/previews.json +13 -0
- metadata +3 -3
- data/app/forms/custom_width_fields_form.rb +0 -26
@@ -14,6 +14,13 @@ module ERBLint
|
|
14
14
|
" https://primer.style/design/components/action-menu/rails/alpha"
|
15
15
|
DETAILS_MENU_RUBY_PATTERN = /tag:?\s+:"details-menu"/.freeze
|
16
16
|
|
17
|
+
# Allow custom pattern matching for ERB nodes
|
18
|
+
class ConfigSchema < LinterConfig
|
19
|
+
property :custom_erb_pattern, accepts: array_of?(Regexp),
|
20
|
+
default: -> { [] }
|
21
|
+
end
|
22
|
+
self.config_schema = ConfigSchema
|
23
|
+
|
17
24
|
def run(processed_source)
|
18
25
|
# HTML tags
|
19
26
|
tags(processed_source).each do |tag|
|
@@ -25,9 +32,31 @@ module ERBLint
|
|
25
32
|
# ERB nodes
|
26
33
|
erb_nodes(processed_source).each do |node|
|
27
34
|
code = extract_ruby_from_erb_node(node)
|
28
|
-
|
35
|
+
|
36
|
+
if contains_offense?(code)
|
37
|
+
generate_node_offense(self.class, processed_source, node, MIGRATE_FROM_DETAILS_MENU)
|
38
|
+
end
|
29
39
|
end
|
30
40
|
end
|
41
|
+
|
42
|
+
def contains_offense?(code)
|
43
|
+
return true if code.match?(DETAILS_MENU_RUBY_PATTERN)
|
44
|
+
return code.match?(custom_erb_pattern) if custom_erb_pattern
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
def custom_erb_pattern
|
49
|
+
unless defined?(@custom_erb_pattern)
|
50
|
+
@custom_erb_pattern =
|
51
|
+
if @config.custom_erb_pattern.empty?
|
52
|
+
nil
|
53
|
+
else
|
54
|
+
Regexp.new(@config.custom_erb_pattern.join("|"), true)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
@custom_erb_pattern
|
59
|
+
end
|
31
60
|
end
|
32
61
|
end
|
33
62
|
end
|
@@ -10,7 +10,7 @@ module ERBLint
|
|
10
10
|
include LinterRegistry
|
11
11
|
include Helpers::RuleHelpers
|
12
12
|
|
13
|
-
MIGRATE_TO_NEWER_TOOLTIP = ".tooltipped has been deprecated.
|
13
|
+
MIGRATE_TO_NEWER_TOOLTIP = ".tooltipped has been deprecated. Due to major accessibility concerns with using this tooltip, please migrate to a Primer Tooltip component or rework the design to eliminate the tooltip. See https://primer.style/guides/rails/migration-guides/primer-css-tooltipped."
|
14
14
|
TOOLTIPPED_RUBY_PATTERN = /classes:.*tooltipped|class:.*tooltipped/.freeze
|
15
15
|
|
16
16
|
def run(processed_source)
|
@@ -380,7 +380,7 @@ module Primer
|
|
380
380
|
aria: { label: "List heading" }
|
381
381
|
)) do |component|
|
382
382
|
component.with_item(label: "Default item", href: "/") do |item|
|
383
|
-
item.with_description.with_content("This is a description")
|
383
|
+
item.with_description(test_selector: "some-selector").with_content("This is a description")
|
384
384
|
end
|
385
385
|
end
|
386
386
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<% subject_id = SecureRandom.hex %>
|
2
|
+
|
3
|
+
<%= render(Primer::Alpha::SelectPanel.new(
|
4
|
+
data: { interaction_subject: subject_id },
|
5
|
+
select_variant: :single,
|
6
|
+
fetch_strategy: :local,
|
7
|
+
open_on_load: open_on_load
|
8
|
+
)) do |panel| %>
|
9
|
+
<% panel.with_show_button { "Panel" } %>
|
10
|
+
<% panel.with_item(label: "GitHub", href: "https://github.com") %>
|
11
|
+
<% panel.with_item(label: "Microsoft", href: "https://microsoft.com") %>
|
12
|
+
<% panel.with_item(label: "Primer", href: "https://primer.style") %>
|
13
|
+
<% panel.with_item(label: "Catalyst", href: "https://catalyst.rocks") %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= render partial: "primer/alpha/select_panel_preview/interaction_subject_js", locals: { subject_id: subject_id } %>
|
@@ -18,6 +18,7 @@ module Primer
|
|
18
18
|
# @param open_on_load toggle
|
19
19
|
# @param anchor_align [Symbol] select [start, center, end]
|
20
20
|
# @param anchor_side [Symbol] select [outside_bottom, outside_top, outside_left, outside_right]
|
21
|
+
# @param select_items toggle
|
21
22
|
def playground(
|
22
23
|
title: "Sci-fi equipment",
|
23
24
|
subtitle: "Various tools from your favorite shows",
|
@@ -31,10 +32,12 @@ module Primer
|
|
31
32
|
show_filter: true,
|
32
33
|
open_on_load: false,
|
33
34
|
anchor_align: :start,
|
34
|
-
anchor_side: :outside_bottom
|
35
|
+
anchor_side: :outside_bottom,
|
36
|
+
select_items: true
|
35
37
|
)
|
36
38
|
render_with_template(locals: {
|
37
39
|
subtitle: subtitle,
|
40
|
+
select_items: select_items,
|
38
41
|
system_arguments: {
|
39
42
|
title: title,
|
40
43
|
size: size,
|
@@ -234,6 +237,14 @@ module Primer
|
|
234
237
|
def multiselect_form(open_on_load: false, route_format: :html)
|
235
238
|
render_with_template(locals: { open_on_load: open_on_load, route_format: route_format })
|
236
239
|
end
|
240
|
+
|
241
|
+
# @label List of links
|
242
|
+
#
|
243
|
+
# @snapshot interactive
|
244
|
+
# @param open_on_load toggle
|
245
|
+
def list_of_links(open_on_load: false)
|
246
|
+
render_with_template(locals: { open_on_load: open_on_load })
|
247
|
+
end
|
237
248
|
end
|
238
249
|
end
|
239
250
|
end
|
@@ -16,6 +16,7 @@ module Primer
|
|
16
16
|
# @param disabled toggle
|
17
17
|
# @param invalid toggle
|
18
18
|
# @param validation_message text
|
19
|
+
# @param input_width [Symbol] select [auto, small, medium, large, xlarge, xxlarge]
|
19
20
|
def playground(
|
20
21
|
name: "my-text-area",
|
21
22
|
id: "my-text-area",
|
@@ -26,7 +27,8 @@ module Primer
|
|
26
27
|
full_width: true,
|
27
28
|
disabled: false,
|
28
29
|
invalid: false,
|
29
|
-
validation_message: nil
|
30
|
+
validation_message: nil,
|
31
|
+
input_width: nil
|
30
32
|
)
|
31
33
|
system_arguments = {
|
32
34
|
name: name,
|
@@ -38,7 +40,8 @@ module Primer
|
|
38
40
|
full_width: full_width,
|
39
41
|
disabled: disabled,
|
40
42
|
invalid: invalid,
|
41
|
-
validation_message: validation_message
|
43
|
+
validation_message: validation_message,
|
44
|
+
input_width: input_width
|
42
45
|
}
|
43
46
|
|
44
47
|
render(Primer::Alpha::TextArea.new(**system_arguments))
|
@@ -1,5 +1,37 @@
|
|
1
|
-
|
1
|
+
<%
|
2
|
+
custom_width_form = Class.new(ApplicationForm) do
|
3
|
+
form do |f|
|
4
|
+
f.text_field(
|
5
|
+
name: :ultimate_answer,
|
6
|
+
label: "Ultimate answer",
|
7
|
+
required: true,
|
8
|
+
caption: "The answer to life, the universe, and everything",
|
9
|
+
input_width: :medium
|
10
|
+
)
|
11
|
+
|
12
|
+
f.select_list(
|
13
|
+
name: "cities",
|
14
|
+
label: "Cool cities",
|
15
|
+
caption: "Select your favorite!",
|
16
|
+
include_blank: true,
|
17
|
+
input_width: :small
|
18
|
+
) do |city_list|
|
19
|
+
city_list.option(label: "Lopez Island", value: "lopez_island")
|
20
|
+
city_list.option(label: "Bellevue", value: "bellevue")
|
21
|
+
city_list.option(label: "Seattle", value: "seattle")
|
22
|
+
end
|
23
|
+
|
24
|
+
f.text_field(
|
25
|
+
name: :lots_of_text,
|
26
|
+
label: "Lots of text",
|
27
|
+
required: true,
|
28
|
+
caption: "What else do you need?",
|
29
|
+
input_width: :small
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
%>
|
2
34
|
|
3
35
|
<%= primer_form_with(url: "/foo") do |f| %>
|
4
|
-
<%= render(
|
36
|
+
<%= render(custom_width_form.new(f)) %>
|
5
37
|
<% end %>
|
data/static/arguments.json
CHANGED
@@ -4336,9 +4336,9 @@
|
|
4336
4336
|
},
|
4337
4337
|
{
|
4338
4338
|
"name": "prefix",
|
4339
|
-
"type": "
|
4339
|
+
"type": "String",
|
4340
4340
|
"default": "`nil`",
|
4341
|
-
"description": "What to prefix the relative
|
4341
|
+
"description": "What to prefix the relative time display with."
|
4342
4342
|
},
|
4343
4343
|
{
|
4344
4344
|
"name": "second",
|
@@ -4390,7 +4390,7 @@
|
|
4390
4390
|
},
|
4391
4391
|
{
|
4392
4392
|
"name": "threshold",
|
4393
|
-
"type": "
|
4393
|
+
"type": "String",
|
4394
4394
|
"default": "`nil`",
|
4395
4395
|
"description": "The threshold, in ISO-8601 'durations' format, at which relative time displays become absolute."
|
4396
4396
|
},
|
@@ -4414,13 +4414,13 @@
|
|
4414
4414
|
},
|
4415
4415
|
{
|
4416
4416
|
"name": "lang",
|
4417
|
-
"type": "
|
4417
|
+
"type": "String",
|
4418
4418
|
"default": "`nil`",
|
4419
4419
|
"description": "The language to use."
|
4420
4420
|
},
|
4421
4421
|
{
|
4422
4422
|
"name": "title",
|
4423
|
-
"type": "
|
4423
|
+
"type": "String",
|
4424
4424
|
"default": "`nil`",
|
4425
4425
|
"description": "Provide a custom title to the element."
|
4426
4426
|
},
|
data/static/info_arch.json
CHANGED
@@ -989,9 +989,20 @@
|
|
989
989
|
"slots": [
|
990
990
|
{
|
991
991
|
"name": "description",
|
992
|
-
"description": "Description content that complements the item's label
|
992
|
+
"description": "Description content that complements the item's label, with optional test_selector.\nSee `ActionList`'s `description_scheme` argument for layout options.",
|
993
993
|
"parameters": [
|
994
|
-
|
994
|
+
{
|
995
|
+
"name": "legacy_content",
|
996
|
+
"type": "String",
|
997
|
+
"default": "N/A",
|
998
|
+
"description": "Slot content, provided for backwards-compatibility. Pass a content block instead, or call `with_content`, eg. `component.with_description { \"My description\" }` or `component.with_description.with_content(\"My description\")`."
|
999
|
+
},
|
1000
|
+
{
|
1001
|
+
"name": "test_selector",
|
1002
|
+
"type": "String",
|
1003
|
+
"default": "N/A",
|
1004
|
+
"description": "The value of this argument is set as the value of a `data-test-selector` HTML attribute on the description element."
|
1005
|
+
}
|
995
1006
|
]
|
996
1007
|
},
|
997
1008
|
{
|
@@ -5547,9 +5558,20 @@
|
|
5547
5558
|
},
|
5548
5559
|
{
|
5549
5560
|
"name": "description",
|
5550
|
-
"description": "Description content that complements the item's label
|
5561
|
+
"description": "Description content that complements the item's label, with optional test_selector.\nSee `ActionList`'s `description_scheme` argument for layout options.",
|
5551
5562
|
"parameters": [
|
5552
|
-
|
5563
|
+
{
|
5564
|
+
"name": "legacy_content",
|
5565
|
+
"type": "String",
|
5566
|
+
"default": "N/A",
|
5567
|
+
"description": "Slot content, provided for backwards-compatibility. Pass a content block instead, or call `with_content`, eg. `component.with_description { \"My description\" }` or `component.with_description.with_content(\"My description\")`."
|
5568
|
+
},
|
5569
|
+
{
|
5570
|
+
"name": "test_selector",
|
5571
|
+
"type": "String",
|
5572
|
+
"default": "N/A",
|
5573
|
+
"description": "The value of this argument is set as the value of a `data-test-selector` HTML attribute on the description element."
|
5574
|
+
}
|
5553
5575
|
]
|
5554
5576
|
},
|
5555
5577
|
{
|
@@ -8083,6 +8105,19 @@
|
|
8083
8105
|
"color-contrast"
|
8084
8106
|
]
|
8085
8107
|
}
|
8108
|
+
},
|
8109
|
+
{
|
8110
|
+
"preview_path": "primer/alpha/select_panel/list_of_links",
|
8111
|
+
"name": "list_of_links",
|
8112
|
+
"snapshot": "interactive",
|
8113
|
+
"skip_rules": {
|
8114
|
+
"wont_fix": [
|
8115
|
+
"region"
|
8116
|
+
],
|
8117
|
+
"will_fix": [
|
8118
|
+
"color-contrast"
|
8119
|
+
]
|
8120
|
+
}
|
8086
8121
|
}
|
8087
8122
|
],
|
8088
8123
|
"subcomponents": [
|
@@ -14687,9 +14722,20 @@
|
|
14687
14722
|
},
|
14688
14723
|
{
|
14689
14724
|
"name": "description",
|
14690
|
-
"description": "Description content that complements the item's label
|
14725
|
+
"description": "Description content that complements the item's label, with optional test_selector.\nSee `ActionList`'s `description_scheme` argument for layout options.",
|
14691
14726
|
"parameters": [
|
14692
|
-
|
14727
|
+
{
|
14728
|
+
"name": "legacy_content",
|
14729
|
+
"type": "String",
|
14730
|
+
"default": "N/A",
|
14731
|
+
"description": "Slot content, provided for backwards-compatibility. Pass a content block instead, or call `with_content`, eg. `component.with_description { \"My description\" }` or `component.with_description.with_content(\"My description\")`."
|
14732
|
+
},
|
14733
|
+
{
|
14734
|
+
"name": "test_selector",
|
14735
|
+
"type": "String",
|
14736
|
+
"default": "N/A",
|
14737
|
+
"description": "The value of this argument is set as the value of a `data-test-selector` HTML attribute on the description element."
|
14738
|
+
}
|
14693
14739
|
]
|
14694
14740
|
},
|
14695
14741
|
{
|
@@ -15349,9 +15395,9 @@
|
|
15349
15395
|
},
|
15350
15396
|
{
|
15351
15397
|
"name": "prefix",
|
15352
|
-
"type": "
|
15398
|
+
"type": "String",
|
15353
15399
|
"default": "`nil`",
|
15354
|
-
"description": "What to prefix the relative
|
15400
|
+
"description": "What to prefix the relative time display with."
|
15355
15401
|
},
|
15356
15402
|
{
|
15357
15403
|
"name": "second",
|
@@ -15403,7 +15449,7 @@
|
|
15403
15449
|
},
|
15404
15450
|
{
|
15405
15451
|
"name": "threshold",
|
15406
|
-
"type": "
|
15452
|
+
"type": "String",
|
15407
15453
|
"default": "`nil`",
|
15408
15454
|
"description": "The threshold, in ISO-8601 'durations' format, at which relative time displays become absolute."
|
15409
15455
|
},
|
@@ -15427,13 +15473,13 @@
|
|
15427
15473
|
},
|
15428
15474
|
{
|
15429
15475
|
"name": "lang",
|
15430
|
-
"type": "
|
15476
|
+
"type": "String",
|
15431
15477
|
"default": "`nil`",
|
15432
15478
|
"description": "The language to use."
|
15433
15479
|
},
|
15434
15480
|
{
|
15435
15481
|
"name": "title",
|
15436
|
-
"type": "
|
15482
|
+
"type": "String",
|
15437
15483
|
"default": "`nil`",
|
15438
15484
|
"description": "Provide a custom title to the element."
|
15439
15485
|
},
|
data/static/previews.json
CHANGED
@@ -6624,6 +6624,19 @@
|
|
6624
6624
|
"color-contrast"
|
6625
6625
|
]
|
6626
6626
|
}
|
6627
|
+
},
|
6628
|
+
{
|
6629
|
+
"preview_path": "primer/alpha/select_panel/list_of_links",
|
6630
|
+
"name": "list_of_links",
|
6631
|
+
"snapshot": "interactive",
|
6632
|
+
"skip_rules": {
|
6633
|
+
"wont_fix": [
|
6634
|
+
"region"
|
6635
|
+
],
|
6636
|
+
"will_fix": [
|
6637
|
+
"color-contrast"
|
6638
|
+
]
|
6639
|
+
}
|
6627
6640
|
}
|
6628
6641
|
]
|
6629
6642
|
},
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openproject-primer_view_components
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.42.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitHub Open Source
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-08-
|
12
|
+
date: 2024-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionview
|
@@ -568,7 +568,6 @@ files:
|
|
568
568
|
- app/forms/check_box_group_form.rb
|
569
569
|
- app/forms/check_box_with_nested_form.rb
|
570
570
|
- app/forms/composed_form.rb
|
571
|
-
- app/forms/custom_width_fields_form.rb
|
572
571
|
- app/forms/example_toggle_switch_form.rb
|
573
572
|
- app/forms/example_toggle_switch_form/example_field_caption.html.erb
|
574
573
|
- app/forms/first_name_form.rb
|
@@ -856,6 +855,7 @@ files:
|
|
856
855
|
- previews/primer/alpha/select_panel_preview/eventually_local_fetch_initial_failure.html.erb
|
857
856
|
- previews/primer/alpha/select_panel_preview/eventually_local_fetch_no_results.html.erb
|
858
857
|
- previews/primer/alpha/select_panel_preview/footer_buttons.html.erb
|
858
|
+
- previews/primer/alpha/select_panel_preview/list_of_links.html.erb
|
859
859
|
- previews/primer/alpha/select_panel_preview/local_fetch.html.erb
|
860
860
|
- previews/primer/alpha/select_panel_preview/local_fetch_no_results.html.erb
|
861
861
|
- previews/primer/alpha/select_panel_preview/multiselect.html.erb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# :nodoc:
|
4
|
-
class CustomWidthFieldsForm < ApplicationForm
|
5
|
-
form do |f|
|
6
|
-
f.text_field(
|
7
|
-
name: :ultimate_answer,
|
8
|
-
label: "Ultimate answer",
|
9
|
-
required: true,
|
10
|
-
caption: "The answer to life, the universe, and everything",
|
11
|
-
input_width: :medium
|
12
|
-
)
|
13
|
-
|
14
|
-
f.select_list(
|
15
|
-
name: "cities",
|
16
|
-
label: "Cool cities",
|
17
|
-
caption: "Select your favorite!",
|
18
|
-
include_blank: true,
|
19
|
-
input_width: :small
|
20
|
-
) do |city_list|
|
21
|
-
city_list.option(label: "Lopez Island", value: "lopez_island")
|
22
|
-
city_list.option(label: "Bellevue", value: "bellevue")
|
23
|
-
city_list.option(label: "Seattle", value: "seattle")
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|