primer_view_components 0.0.112 → 0.0.113
Sign up to get free protection for your applications and to get access to all the features.
- 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 %>
|