primer_view_components 0.0.112 → 0.0.113
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 +38 -0
- 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 +3 -1
- data/app/assets/styles/primer_view_components.css.map +1 -1
- data/app/components/primer/alpha/action_list.css +1 -1
- data/app/components/primer/alpha/action_list.css.json +1 -1
- data/app/components/primer/alpha/action_list.css.map +1 -1
- data/app/components/primer/alpha/action_list.pcss +0 -15
- data/app/components/primer/alpha/auto_complete.css +1 -1
- data/app/components/primer/alpha/auto_complete.css.map +1 -1
- data/app/components/primer/alpha/auto_complete.pcss +1 -1
- data/app/components/primer/alpha/banner.css +1 -1
- data/app/components/primer/alpha/banner.css.map +1 -1
- data/app/components/primer/alpha/banner.pcss +2 -2
- data/app/components/primer/alpha/dialog/body.rb +3 -0
- data/app/components/primer/alpha/dialog/footer.rb +3 -0
- data/app/components/primer/alpha/dialog/header.rb +3 -0
- data/app/components/primer/alpha/dialog.css +1 -0
- data/app/components/primer/alpha/dialog.css.json +1 -0
- data/app/components/primer/alpha/dialog.css.map +1 -0
- data/app/components/primer/alpha/dialog.pcss +484 -0
- data/app/components/primer/alpha/dialog.rb +3 -0
- 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/text_field.css +3 -0
- data/app/components/primer/alpha/text_field.css.json +1 -0
- data/app/components/primer/alpha/text_field.css.map +1 -0
- data/app/components/primer/alpha/text_field.pcss +683 -0
- data/app/components/primer/alpha/toggle_switch.d.ts +1 -1
- data/app/components/primer/alpha/toggle_switch.js +7 -4
- data/app/components/primer/alpha/toggle_switch.ts +7 -3
- data/app/components/primer/beta/button_group.css +1 -0
- data/app/components/primer/beta/button_group.css.json +1 -0
- data/app/components/primer/beta/button_group.css.map +1 -0
- data/app/components/primer/beta/button_group.pcss +92 -0
- data/app/components/primer/{clipboard_copy.d.ts → beta/clipboard_copy.d.ts} +0 -0
- data/app/components/primer/{clipboard_copy.html.erb → beta/clipboard_copy.html.erb} +0 -0
- data/app/components/primer/{clipboard_copy.js → beta/clipboard_copy.js} +0 -0
- data/app/components/primer/beta/clipboard_copy.rb +50 -0
- data/app/components/primer/{clipboard_copy.ts → beta/clipboard_copy.ts} +0 -0
- data/app/components/primer/beta/popover.css.map +1 -1
- data/app/components/primer/beta/popover.pcss +5 -5
- data/app/components/primer/beta/relative_time.rb +160 -0
- data/app/components/primer/button_component.css +1 -0
- data/app/components/primer/button_component.css.json +1 -0
- data/app/components/primer/button_component.css.map +1 -0
- data/app/components/primer/button_component.pcss +557 -0
- data/app/components/primer/button_component.rb +1 -1
- data/app/components/primer/clipboard_copy.rb +2 -43
- data/app/components/primer/component.rb +4 -0
- data/app/components/primer/local_time.d.ts +1 -1
- data/app/components/primer/local_time.js +1 -1
- data/app/components/primer/local_time.rb +3 -1
- data/app/components/primer/local_time.ts +1 -1
- data/app/components/primer/primer.d.ts +1 -1
- data/app/components/primer/primer.js +1 -1
- data/app/components/primer/primer.pcss +10 -0
- data/app/components/primer/primer.ts +1 -1
- data/app/components/primer/time_ago_component.d.ts +1 -1
- data/app/components/primer/time_ago_component.js +1 -1
- data/app/components/primer/time_ago_component.rb +2 -1
- data/app/components/primer/time_ago_component.ts +1 -1
- data/app/forms/submit_button_form.rb +8 -2
- data/app/helpers/primer/form_helper.rb +12 -0
- data/lib/postcss_mixins/clearfix.pcss +12 -0
- data/lib/primer/deprecations.rb +96 -26
- data/lib/primer/deprecations.yml +68 -0
- data/lib/primer/forms/base.rb +7 -20
- data/lib/primer/forms/base_component.rb +15 -1
- data/lib/primer/forms/button.html.erb +4 -0
- data/lib/primer/forms/button.rb +68 -0
- data/lib/primer/forms/check_box.html.erb +2 -2
- data/lib/primer/forms/check_box.rb +1 -1
- data/lib/primer/forms/check_box_group.html.erb +2 -2
- data/lib/primer/forms/dsl/button_input.rb +29 -0
- data/lib/primer/forms/dsl/input_methods.rb +7 -2
- data/lib/primer/forms/dsl/submit_button_input.rb +1 -0
- data/lib/primer/forms/dsl/text_field_input.rb +0 -7
- data/lib/primer/forms/radio_button.html.erb +2 -2
- data/lib/primer/forms/radio_button.rb +1 -1
- data/lib/primer/forms/radio_button_group.html.erb +2 -2
- data/lib/primer/forms/select_list.html.erb +1 -1
- data/lib/primer/forms/select_list.rb +4 -1
- data/lib/primer/forms/submit_button.html.erb +1 -4
- data/lib/primer/forms/submit_button.rb +1 -37
- data/lib/primer/forms/text_area.html.erb +1 -1
- data/lib/primer/forms/text_area.rb +5 -1
- data/lib/primer/forms/text_field.html.erb +1 -1
- data/lib/primer/forms/text_field.rb +11 -0
- data/lib/primer/forms/utils.rb +28 -0
- data/lib/primer/view_components/audited.rb +14 -0
- data/lib/primer/view_components/engine.rb +1 -0
- data/lib/primer/view_components/linters/clipboard_copy_component_migration_counter.rb +2 -2
- data/lib/primer/view_components/linters/helpers/deprecated_components_helpers.rb +3 -18
- data/lib/primer/view_components/version.rb +1 -1
- data/lib/rubocop/cop/primer/component_name_migration.rb +2 -2
- data/lib/tasks/docs.rake +3 -2
- data/previews/primer/alpha/auto_complete_preview.rb +12 -0
- data/previews/primer/alpha/segmented_control_preview.rb +9 -6
- data/previews/primer/alpha/text_field_preview.rb +77 -52
- data/previews/primer/beta/clipboard_copy_preview/element.html.erb +2 -0
- data/previews/primer/beta/clipboard_copy_preview.rb +39 -0
- data/previews/primer/beta/relative_time_preview.rb +271 -0
- data/previews/primer/forms/forms_preview.rb +1 -0
- data/static/arguments.json +143 -33
- data/static/audited_at.json +6 -4
- data/static/constants.json +124 -0
- data/static/statuses.json +4 -2
- metadata +34 -8
- data/previews/primer/clipboard_copy_preview/element.html.erb +0 -2
- data/previews/primer/clipboard_copy_preview.rb +0 -37
|
@@ -7,7 +7,7 @@ import './alpha/toggle_switch'
|
|
|
7
7
|
import './alpha/tool_tip'
|
|
8
8
|
import './alpha/x_banner'
|
|
9
9
|
import './beta/auto_complete/auto_complete'
|
|
10
|
-
import './clipboard_copy'
|
|
10
|
+
import './beta/clipboard_copy'
|
|
11
11
|
import './local_time'
|
|
12
12
|
import './tab_container_component'
|
|
13
13
|
import './time_ago_component'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import '@github/time-
|
|
1
|
+
import '@github/relative-time-element';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import '@github/time-
|
|
1
|
+
import '@github/relative-time-element';
|
|
@@ -15,7 +15,8 @@ module Primer
|
|
|
15
15
|
@system_arguments = deny_tag_argument(**system_arguments)
|
|
16
16
|
@system_arguments[:datetime] = time.utc.iso8601
|
|
17
17
|
@system_arguments[:classes] = class_names("no-wrap", @system_arguments[:classes])
|
|
18
|
-
@system_arguments[:tag] = "time
|
|
18
|
+
@system_arguments[:tag] = "relative-time"
|
|
19
|
+
@system_arguments[:tense] = "past"
|
|
19
20
|
@system_arguments[:format] = "micro" if micro
|
|
20
21
|
@time = time
|
|
21
22
|
@micro = micro
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import '@github/time-
|
|
1
|
+
import '@github/relative-time-element'
|
|
@@ -13,8 +13,14 @@ class SubmitButtonForm < ApplicationForm
|
|
|
13
13
|
color: :success
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
-
my_form.
|
|
17
|
-
|
|
16
|
+
my_form.group(layout: :horizontal) do |button_group|
|
|
17
|
+
button_group.submit(name: :submit, label: "Submit", scheme: :primary, mb: 3) do |c|
|
|
18
|
+
c.with_leading_visual_icon(icon: :"check-circle")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
button_group.button(name: :button, label: "Click me", mb: 3) do |c|
|
|
22
|
+
c.with_leading_visual_icon(icon: :alert)
|
|
23
|
+
end
|
|
18
24
|
end
|
|
19
25
|
end
|
|
20
26
|
end
|
|
@@ -7,5 +7,17 @@ module Primer
|
|
|
7
7
|
def primer_form_with(**kwargs, &block)
|
|
8
8
|
form_with(**kwargs, skip_default_ids: false, builder: Primer::Forms::Builder, &block)
|
|
9
9
|
end
|
|
10
|
+
|
|
11
|
+
def primer_fields_for(record_name, record_object = nil, options = {}, &block)
|
|
12
|
+
fields_for(
|
|
13
|
+
record_name,
|
|
14
|
+
record_object,
|
|
15
|
+
options.merge(
|
|
16
|
+
skip_default_ids: false,
|
|
17
|
+
builder: Primer::Forms::Builder
|
|
18
|
+
),
|
|
19
|
+
&block
|
|
20
|
+
)
|
|
21
|
+
end
|
|
10
22
|
end
|
|
11
23
|
end
|
data/lib/primer/deprecations.rb
CHANGED
|
@@ -1,35 +1,105 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "yaml"
|
|
4
|
+
|
|
3
5
|
module Primer
|
|
4
6
|
# :nodoc:
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"Primer::Dropdown::Menu::Item" => "Primer::Alpha::Dropdown::Menu::Item",
|
|
18
|
-
"Primer::IconButton" => "Primer::Beta::IconButton",
|
|
19
|
-
"Primer::Tooltip" => "Primer::Alpha::Tooltip",
|
|
20
|
-
"Primer::PopoverComponent" => "Primer::Beta::Popover"
|
|
21
|
-
}.freeze
|
|
22
|
-
|
|
23
|
-
def self.deprecated?(name)
|
|
24
|
-
DEPRECATED_COMPONENTS.key?(name)
|
|
25
|
-
end
|
|
7
|
+
class Deprecations
|
|
8
|
+
class << self
|
|
9
|
+
def register(file_path)
|
|
10
|
+
data = YAML.load_file(file_path)
|
|
11
|
+
data["deprecations"].each do |dep|
|
|
12
|
+
register_deprecation(dep["component"], {
|
|
13
|
+
autocorrect: dep["autocorrect"],
|
|
14
|
+
guide: dep["guide"],
|
|
15
|
+
replacement: dep["replacement"]
|
|
16
|
+
})
|
|
17
|
+
end
|
|
18
|
+
end
|
|
26
19
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
20
|
+
def register_deprecation(component, options)
|
|
21
|
+
registered_deprecations[component] = {
|
|
22
|
+
autocorrect: options[:autocorrect],
|
|
23
|
+
guide: options[:guide],
|
|
24
|
+
replacement: options[:replacement]
|
|
25
|
+
}
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def deprecated_components
|
|
29
|
+
registered_deprecations.keys.sort
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def deprecated?(component_name)
|
|
33
|
+
# if the component is registered, it is deprecated
|
|
34
|
+
registered_deprecations.key?(component_name)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def replacement?(component_name)
|
|
38
|
+
!replacement(component_name).nil?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def replacement(component_name)
|
|
42
|
+
dep = registered_deprecations[component_name]
|
|
43
|
+
return nil if dep.nil?
|
|
44
|
+
|
|
45
|
+
dep[:replacement]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def correctable?(component_name)
|
|
49
|
+
dep = registered_deprecations[component_name]
|
|
50
|
+
return false if dep.nil?
|
|
51
|
+
|
|
52
|
+
dep[:autocorrect]
|
|
53
|
+
end
|
|
30
54
|
|
|
31
|
-
|
|
32
|
-
|
|
55
|
+
def guide?(component_name)
|
|
56
|
+
!guide(component_name).nil?
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def guide(component_name)
|
|
60
|
+
dep = registered_deprecations[component_name]
|
|
61
|
+
return nil if dep.nil?
|
|
62
|
+
|
|
63
|
+
dep[:guide]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def deprecation_message(component_name)
|
|
67
|
+
return nil unless deprecated?(component_name)
|
|
68
|
+
|
|
69
|
+
msg = ["'#{component_name}' has been deprecated."]
|
|
70
|
+
|
|
71
|
+
# this nested structure is complex, because it has to
|
|
72
|
+
# match all of the valid scenarios for a component being
|
|
73
|
+
# replaceable, auto-correctable, and having a guide. for
|
|
74
|
+
# more information on what is and is not valid, see the
|
|
75
|
+
# documentation here: docs/contributors/deprecations.md
|
|
76
|
+
|
|
77
|
+
if replacement?(component_name) # has replacement
|
|
78
|
+
if correctable?(component_name) # is autocorrectable
|
|
79
|
+
msg << "Please update your code to use '#{replacement(component_name)}'"
|
|
80
|
+
msg << "or use rubocop's auto-correct option to do it for you."
|
|
81
|
+
msg << "See #{guide(component_name)} for more information." if guide?(component_name) # has a guide
|
|
82
|
+
elsif guide?(component_name) # not autocorrectable
|
|
83
|
+
msg << "See #{guide(component_name)} for information on replacing this component in your code." # has a guide
|
|
84
|
+
end
|
|
85
|
+
elsif !correctable?(component_name) # no replacement
|
|
86
|
+
if guide?(component_name) # has a guide
|
|
87
|
+
msg << "Unfortunately, there is no direct replacement."
|
|
88
|
+
msg << "See #{guide(component_name)} for available options to update your code."
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
msg.join(" ")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def registered_deprecations
|
|
98
|
+
@registered_deprecations ||= {}
|
|
99
|
+
end
|
|
33
100
|
end
|
|
101
|
+
|
|
102
|
+
# auto-load PVC's deprecations
|
|
103
|
+
register(File.expand_path("deprecations.yml", __dir__))
|
|
34
104
|
end
|
|
35
105
|
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# PVC Component Deprecations
|
|
2
|
+
# --------------------------
|
|
3
|
+
#
|
|
4
|
+
# All component deprecations for PVC must be listed here, and must have valid configurations.
|
|
5
|
+
# See 'docs/contributors/deprecations.md' for information on configuration options.
|
|
6
|
+
|
|
7
|
+
deprecations:
|
|
8
|
+
- component: "Primer::Alpha::AutoComplete"
|
|
9
|
+
autocorrect: true
|
|
10
|
+
replacement: "Primer::Beta::AutoComplete"
|
|
11
|
+
|
|
12
|
+
- component: "Primer::Alpha::AutoComplete::Item"
|
|
13
|
+
autocorrect: true
|
|
14
|
+
replacement: "Primer::Beta::AutoComplete::Item"
|
|
15
|
+
|
|
16
|
+
- component: "Primer::BlankslateComponent"
|
|
17
|
+
autocorrect: true
|
|
18
|
+
replacement: "Primer::Beta::Blankslate"
|
|
19
|
+
|
|
20
|
+
- component: "Primer::BoxComponent"
|
|
21
|
+
autocorrect: true
|
|
22
|
+
replacement: "Primer::Box"
|
|
23
|
+
|
|
24
|
+
- component: "Primer::ButtonComponent"
|
|
25
|
+
autocorrect: false
|
|
26
|
+
replacement: "Primer::Beta::Button"
|
|
27
|
+
guide: "https://primer.style/view-components/guides/primer_button_component"
|
|
28
|
+
|
|
29
|
+
- component: "Primer::ClipboardCopy"
|
|
30
|
+
autocorrect: true
|
|
31
|
+
replacement: "Primer::Beta::ClipboardCopy"
|
|
32
|
+
|
|
33
|
+
- component: "Primer::DropdownMenuComponent"
|
|
34
|
+
autocorrect: false
|
|
35
|
+
replacement: "Primer::Beta::Dropdown"
|
|
36
|
+
guide: "https://primer.style/view-components/guides/primer_dropdown_menu_component"
|
|
37
|
+
|
|
38
|
+
- component: "Primer::Dropdown"
|
|
39
|
+
autocorrect: true
|
|
40
|
+
replacement: "Primer::Alpha::Dropdown"
|
|
41
|
+
|
|
42
|
+
- component: "Primer::Dropdown::Menu"
|
|
43
|
+
autocorrect: true
|
|
44
|
+
replacement: "Primer::Alpha::Dropdown::Menu"
|
|
45
|
+
|
|
46
|
+
- component: "Primer::Dropdown::Menu::Item"
|
|
47
|
+
autocorrect: true
|
|
48
|
+
replacement: "Primer::Alpha::Dropdown::Menu::Item"
|
|
49
|
+
|
|
50
|
+
- component: "Primer::IconButton"
|
|
51
|
+
autocorrect: true
|
|
52
|
+
replacement: "Primer::Beta::IconButton"
|
|
53
|
+
|
|
54
|
+
- component: "Primer::LabelComponent"
|
|
55
|
+
autocorrect: true
|
|
56
|
+
replacement: "Primer::Beta::Label"
|
|
57
|
+
|
|
58
|
+
- component: "Primer::LinkComponent"
|
|
59
|
+
autocorrect: true
|
|
60
|
+
replacement: "Primer::Beta::Link"
|
|
61
|
+
|
|
62
|
+
- component: "Primer::PopoverComponent"
|
|
63
|
+
autocorrect: true
|
|
64
|
+
replacement: "Primer::Beta::Popover"
|
|
65
|
+
|
|
66
|
+
- component: "Primer::Tooltip"
|
|
67
|
+
autocorrect: true
|
|
68
|
+
replacement: "Primer::Alpha::Tooltip"
|
data/lib/primer/forms/base.rb
CHANGED
|
@@ -29,7 +29,7 @@ module Primer
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def inherited(base)
|
|
32
|
-
form_path = const_source_location(base.name)
|
|
32
|
+
form_path = Utils.const_source_location(base.name)
|
|
33
33
|
return unless form_path
|
|
34
34
|
|
|
35
35
|
base.template_root_path = File.join(File.dirname(form_path), base.name.demodulize.underscore)
|
|
@@ -54,25 +54,6 @@ module Primer
|
|
|
54
54
|
def sanitize_field_name_for_template_path(field_name)
|
|
55
55
|
field_name.to_s.delete_suffix("?").to_sym
|
|
56
56
|
end
|
|
57
|
-
|
|
58
|
-
private
|
|
59
|
-
|
|
60
|
-
# Unfortunately this bug (https://github.com/ruby/ruby/pull/5646) prevents us from using
|
|
61
|
-
# Ruby's native Module.const_source_location. Instead we have to fudge it by searching
|
|
62
|
-
# for the file in the configured autoload paths. Doing so relies on Rails' autoloading
|
|
63
|
-
# conventions, so it should work ok. Zeitwerk also has this information but lacks a
|
|
64
|
-
# public API to map constants to source files.
|
|
65
|
-
def const_source_location(class_name)
|
|
66
|
-
# NOTE: underscore respects namespacing, i.e. will convert Foo::Bar to foo/bar.
|
|
67
|
-
class_path = "#{class_name.underscore}.rb"
|
|
68
|
-
|
|
69
|
-
ActiveSupport::Dependencies.autoload_paths.each do |autoload_path|
|
|
70
|
-
absolute_path = File.join(autoload_path, class_path)
|
|
71
|
-
return absolute_path if File.exist?(absolute_path)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
nil
|
|
75
|
-
end
|
|
76
57
|
end
|
|
77
58
|
|
|
78
59
|
def inputs
|
|
@@ -124,12 +105,18 @@ module Primer
|
|
|
124
105
|
end
|
|
125
106
|
|
|
126
107
|
def perform_render(&_block)
|
|
108
|
+
return "" unless render?
|
|
109
|
+
|
|
127
110
|
Base.compile!
|
|
128
111
|
self.class.compile!
|
|
129
112
|
|
|
130
113
|
render_base_form
|
|
131
114
|
end
|
|
132
115
|
|
|
116
|
+
def render?
|
|
117
|
+
true
|
|
118
|
+
end
|
|
119
|
+
|
|
133
120
|
private
|
|
134
121
|
|
|
135
122
|
def form_object
|
|
@@ -10,12 +10,22 @@ module Primer
|
|
|
10
10
|
extend ActsAsComponent
|
|
11
11
|
|
|
12
12
|
def self.inherited(base)
|
|
13
|
-
|
|
13
|
+
base_path = Utils.const_source_location(base.name)
|
|
14
|
+
|
|
15
|
+
unless base_path
|
|
16
|
+
warn "Could not identify the template for #{base}"
|
|
17
|
+
return
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
dir = File.dirname(base_path)
|
|
21
|
+
base.renders_template File.join(dir, "#{base.name.demodulize.underscore}.html.erb"), :render_template
|
|
14
22
|
end
|
|
15
23
|
|
|
16
24
|
delegate :required?, :disabled?, :hidden?, to: :@input
|
|
17
25
|
|
|
18
26
|
def perform_render(&block)
|
|
27
|
+
return "" unless render?
|
|
28
|
+
|
|
19
29
|
@__prf_content_block = block
|
|
20
30
|
compile_and_render_template
|
|
21
31
|
end
|
|
@@ -43,6 +53,10 @@ module Primer
|
|
|
43
53
|
self
|
|
44
54
|
end
|
|
45
55
|
|
|
56
|
+
def render?
|
|
57
|
+
true
|
|
58
|
+
end
|
|
59
|
+
|
|
46
60
|
private
|
|
47
61
|
|
|
48
62
|
def compile_and_render_template
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Primer
|
|
4
|
+
module Forms
|
|
5
|
+
# :nodoc:
|
|
6
|
+
class Button < BaseComponent
|
|
7
|
+
# :nodoc:
|
|
8
|
+
module ButtonAttributeGenerator
|
|
9
|
+
extend ActionView::Helpers::FormTagHelper
|
|
10
|
+
|
|
11
|
+
class << self
|
|
12
|
+
alias submit_tag_attributes submit_tag
|
|
13
|
+
alias button_tag_attributes button_tag
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
# FormTagHelper#submit_tag ultimately calls the #tag method. We return the options hash here instead
|
|
18
|
+
# of returning a string so it can be merged into the hash of options we pass to the Primer::ButtonComponent.
|
|
19
|
+
def tag(_name, options)
|
|
20
|
+
options
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# FormTagHelper#button_tag ultimately calls the #content_tag method. We return the options hash here instead
|
|
24
|
+
# of returning a string so it can be merged into the hash of options we pass to the Primer::ButtonComponent.
|
|
25
|
+
def content_tag(_name, _content, options)
|
|
26
|
+
options
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
delegate :builder, :form, to: :@input
|
|
32
|
+
|
|
33
|
+
def initialize(input:, type: :button)
|
|
34
|
+
@input = input
|
|
35
|
+
@type = type
|
|
36
|
+
|
|
37
|
+
@input.add_input_classes("FormField-input flex-self-start")
|
|
38
|
+
@input.merge_input_arguments!(tag_attributes.deep_symbolize_keys)
|
|
39
|
+
|
|
40
|
+
# rails uses a string for this, but PVC wants a symbol
|
|
41
|
+
@input.merge_input_arguments!(type: type.to_sym)
|
|
42
|
+
|
|
43
|
+
# Never disable buttons. This overrides the global
|
|
44
|
+
# ActionView::Base.automatically_disable_submit_tag setting.
|
|
45
|
+
# Disabling buttons is not accessible.
|
|
46
|
+
@input.remove_input_data(:disable_with)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def input_arguments
|
|
50
|
+
@input_arguments ||= @input.input_arguments.deep_dup.tap do |args|
|
|
51
|
+
# rails uses :class but PVC wants :classes
|
|
52
|
+
args[:classes] = args.delete(:class)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def tag_attributes
|
|
59
|
+
case @type
|
|
60
|
+
when :submit
|
|
61
|
+
ButtonAttributeGenerator.submit_tag_attributes(@input.label, name: @input.name)
|
|
62
|
+
else
|
|
63
|
+
ButtonAttributeGenerator.button_tag_attributes(@input.label, name: @input.name)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
<%= content_tag(:div, class: "FormControl-checkbox-wrap", hidden: @input.hidden?) do %>
|
|
2
2
|
<%= builder.check_box(@input.name, @input.input_arguments, checked_value, unchecked_value) %>
|
|
3
3
|
<span class="FormControl-checkbox-labelWrap">
|
|
4
4
|
<%= builder.label(@input.name, **@input.label_arguments) do %>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<% end %>
|
|
7
7
|
<%= render(Caption.new(input: @input)) %>
|
|
8
8
|
</span>
|
|
9
|
-
|
|
9
|
+
<% end %>
|
|
10
10
|
<% if @input.nested_form_block %>
|
|
11
11
|
<%= content_tag(:div, nested_form_arguments) do %>
|
|
12
12
|
<%= render(@input.nested_form_block.call(builder)) %>
|
|
@@ -20,7 +20,7 @@ module Primer
|
|
|
20
20
|
def nested_form_arguments
|
|
21
21
|
return @nested_form_arguments if defined?(@nested_form_arguments)
|
|
22
22
|
|
|
23
|
-
@nested_form_arguments = { **@input.nested_form_arguments }
|
|
23
|
+
@nested_form_arguments = { hidden: @input.hidden?, **@input.nested_form_arguments }
|
|
24
24
|
@nested_form_arguments[:class] = class_names(
|
|
25
25
|
@nested_form_arguments[:class],
|
|
26
26
|
@nested_form_arguments.delete(:classes),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
<%= content_tag(:fieldset, hidden: @input.hidden?) do %>
|
|
2
2
|
<% if @input.label %>
|
|
3
3
|
<%= content_tag(:legend, **@input.label_arguments) do %>
|
|
4
4
|
<%= @input.label %>
|
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
<%= render(check_box.to_component) %>
|
|
10
10
|
<% end %>
|
|
11
11
|
<% end %>
|
|
12
|
-
|
|
12
|
+
<% end %>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Primer
|
|
4
|
+
module Forms
|
|
5
|
+
module Dsl
|
|
6
|
+
# :nodoc:
|
|
7
|
+
class ButtonInput < Input
|
|
8
|
+
attr_reader :name, :label, :block
|
|
9
|
+
|
|
10
|
+
def initialize(name:, label:, **system_arguments, &block)
|
|
11
|
+
@name = name
|
|
12
|
+
@label = label
|
|
13
|
+
@block = block
|
|
14
|
+
|
|
15
|
+
super(**system_arguments)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def to_component
|
|
19
|
+
Button.new(input: self)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# :nocov:
|
|
23
|
+
def type
|
|
24
|
+
:button
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -17,8 +17,8 @@ module Primer
|
|
|
17
17
|
add_input HiddenInput.new(builder: builder, form: form, **options)
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
def check_box(**options)
|
|
21
|
-
add_input CheckBoxInput.new(builder: builder, form: form, **options)
|
|
20
|
+
def check_box(**options, &block)
|
|
21
|
+
add_input CheckBoxInput.new(builder: builder, form: form, **options, &block)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def radio_button_group(**options, &block)
|
|
@@ -63,6 +63,11 @@ module Primer
|
|
|
63
63
|
add_input SubmitButtonInput.new(builder: builder, form: form, **options, &block)
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
+
def button(**options, &block)
|
|
67
|
+
options = decorate_options(**options)
|
|
68
|
+
add_input ButtonInput.new(builder: builder, form: form, **options, &block)
|
|
69
|
+
end
|
|
70
|
+
|
|
66
71
|
# END button input methods
|
|
67
72
|
|
|
68
73
|
def inputs
|
|
@@ -31,13 +31,6 @@ module Primer
|
|
|
31
31
|
|
|
32
32
|
add_input_classes("FormControl-inset") if inset?
|
|
33
33
|
add_input_classes("FormControl-monospace") if monospace?
|
|
34
|
-
|
|
35
|
-
@field_wrap_classes = class_names(
|
|
36
|
-
"FormControl-input-wrap",
|
|
37
|
-
Primer::Forms::Dsl::Input::SIZE_MAPPINGS[size],
|
|
38
|
-
"FormControl-input-wrap--trailingAction": show_clear_button?,
|
|
39
|
-
"FormControl-input-wrap--leadingVisual": leading_visual?
|
|
40
|
-
)
|
|
41
34
|
end
|
|
42
35
|
|
|
43
36
|
alias show_clear_button? show_clear_button
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
<%= content_tag(:div, class: "FormControl-radio-wrap", hidden: @input.hidden?) do %>
|
|
2
2
|
<%= builder.radio_button(@input.name, @input.value, **@input.input_arguments) %>
|
|
3
3
|
<span class="FormControl-radio-labelWrap">
|
|
4
4
|
<%= builder.label(@input.name, value: @input.value, **@input.label_arguments) do %>
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<% end %>
|
|
7
7
|
<%= render(Caption.new(input: @input)) %>
|
|
8
8
|
</span>
|
|
9
|
-
|
|
9
|
+
<% end %>
|
|
10
10
|
<% if @input.nested_form_block %>
|
|
11
11
|
<%= content_tag(:div, nested_form_arguments) do %>
|
|
12
12
|
<%= render(@input.nested_form_block.call(builder)) %>
|
|
@@ -15,7 +15,7 @@ module Primer
|
|
|
15
15
|
def nested_form_arguments
|
|
16
16
|
return @nested_form_arguments if defined?(@nested_form_arguments)
|
|
17
17
|
|
|
18
|
-
@nested_form_arguments = { **@input.nested_form_arguments }
|
|
18
|
+
@nested_form_arguments = { hidden: @input.hidden?, **@input.nested_form_arguments }
|
|
19
19
|
@nested_form_arguments[:class] = class_names(
|
|
20
20
|
@nested_form_arguments[:class],
|
|
21
21
|
@nested_form_arguments.delete(:classes),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
<%= content_tag(:fieldset, hidden: @input.hidden?) do %>
|
|
2
2
|
<% if @input.label %>
|
|
3
3
|
<%= content_tag(:legend, **@input.label_arguments) do %>
|
|
4
4
|
<%= @input.label %>
|
|
@@ -9,4 +9,4 @@
|
|
|
9
9
|
<%= render(radio_button.to_component) %>
|
|
10
10
|
<% end %>
|
|
11
11
|
<% end %>
|
|
12
|
-
|
|
12
|
+
<% end %>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<%= render(FormControl.new(input: @input)) do %>
|
|
2
|
-
<%= content_tag(:div,
|
|
2
|
+
<%= content_tag(:div, **@field_wrap_arguments) do %>
|
|
3
3
|
<%= builder.select(@input.name, options, @input.select_arguments, **@input.input_arguments) %>
|
|
4
4
|
<% end %>
|
|
5
5
|
<% end %>
|