view_component 3.21.0 → 4.0.0.alpha1
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/app/controllers/concerns/view_component/preview_actions.rb +1 -1
- data/app/controllers/view_components_system_test_controller.rb +17 -20
- data/app/views/test_mailer/test_asset_email.html.erb +1 -0
- data/app/views/view_components/preview.html.erb +1 -9
- data/docs/CHANGELOG.md +171 -1
- data/lib/view_component/base.rb +45 -61
- data/lib/view_component/collection.rb +11 -17
- data/lib/view_component/compiler.rb +50 -74
- data/lib/view_component/config.rb +0 -21
- data/lib/view_component/configurable.rb +17 -0
- data/lib/view_component/deprecation.rb +1 -1
- data/lib/view_component/engine.rb +3 -82
- data/lib/view_component/errors.rb +19 -25
- data/lib/view_component/inline_template.rb +2 -3
- data/lib/view_component/instrumentation.rb +4 -10
- data/lib/view_component/preview.rb +3 -10
- data/lib/view_component/request_details.rb +30 -0
- data/lib/view_component/slot.rb +2 -5
- data/lib/view_component/slotable.rb +31 -39
- data/lib/view_component/system_test_helpers.rb +1 -2
- data/lib/view_component/template.rb +106 -83
- data/lib/view_component/test_helpers.rb +22 -42
- data/lib/view_component/translatable.rb +24 -23
- data/lib/view_component/use_helpers.rb +3 -4
- data/lib/view_component/version.rb +3 -3
- data/lib/view_component.rb +0 -1
- metadata +76 -213
- data/app/assets/vendor/prism.css +0 -4
- data/app/assets/vendor/prism.min.js +0 -12
- data/app/helpers/preview_helper.rb +0 -85
- data/app/views/view_components/_preview_source.html.erb +0 -17
- data/lib/rails/generators/abstract_generator.rb +0 -56
- data/lib/rails/generators/component/USAGE +0 -13
- data/lib/rails/generators/component/component_generator.rb +0 -67
- data/lib/rails/generators/component/templates/component.rb.tt +0 -16
- data/lib/rails/generators/erb/component_generator.rb +0 -33
- data/lib/rails/generators/erb/templates/component.html.erb.tt +0 -1
- data/lib/rails/generators/haml/component_generator.rb +0 -22
- data/lib/rails/generators/haml/templates/component.html.haml.tt +0 -1
- data/lib/rails/generators/locale/component_generator.rb +0 -46
- data/lib/rails/generators/preview/component_generator.rb +0 -39
- data/lib/rails/generators/preview/templates/component_preview.rb.tt +0 -9
- data/lib/rails/generators/rspec/component_generator.rb +0 -31
- data/lib/rails/generators/rspec/templates/component_spec.rb.tt +0 -15
- data/lib/rails/generators/slim/component_generator.rb +0 -22
- data/lib/rails/generators/slim/templates/component.html.slim.tt +0 -1
- data/lib/rails/generators/stimulus/component_generator.rb +0 -44
- data/lib/rails/generators/stimulus/templates/component_controller.js.tt +0 -7
- data/lib/rails/generators/stimulus/templates/component_controller.ts.tt +0 -9
- data/lib/rails/generators/tailwindcss/component_generator.rb +0 -11
- data/lib/rails/generators/tailwindcss/templates/component.html.erb.tt +0 -1
- data/lib/rails/generators/test_unit/component_generator.rb +0 -20
- data/lib/rails/generators/test_unit/templates/component_test.rb.tt +0 -12
- data/lib/view_component/component_error.rb +0 -6
- data/lib/view_component/docs_builder_component.html.erb +0 -22
- data/lib/view_component/docs_builder_component.rb +0 -96
- data/lib/view_component/rails/tasks/view_component.rake +0 -20
- data/lib/view_component/render_component_helper.rb +0 -10
- data/lib/view_component/render_component_to_string_helper.rb +0 -9
- data/lib/view_component/render_monkey_patch.rb +0 -13
- data/lib/view_component/render_to_string_monkey_patch.rb +0 -13
- data/lib/view_component/rendering_component_helper.rb +0 -9
- data/lib/view_component/rendering_monkey_patch.rb +0 -13
- data/lib/yard/mattr_accessor_handler.rb +0 -19
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "erb"
|
4
|
-
require "set"
|
5
4
|
require "i18n"
|
6
5
|
require "active_support/concern"
|
7
6
|
|
@@ -10,19 +9,22 @@ module ViewComponent
|
|
10
9
|
extend ActiveSupport::Concern
|
11
10
|
|
12
11
|
HTML_SAFE_TRANSLATION_KEY = /(?:_|\b)html\z/
|
12
|
+
private_constant :HTML_SAFE_TRANSLATION_KEY
|
13
|
+
|
13
14
|
TRANSLATION_EXTENSIONS = %w[yml yaml].freeze
|
15
|
+
private_constant :TRANSLATION_EXTENSIONS
|
14
16
|
|
15
17
|
included do
|
16
|
-
class_attribute :
|
18
|
+
class_attribute :__vc_i18n_backend, instance_writer: false, instance_predicate: false
|
17
19
|
end
|
18
20
|
|
19
21
|
class_methods do
|
20
|
-
def
|
21
|
-
@
|
22
|
+
def __vc_i18n_scope
|
23
|
+
@__vc_i18n_scope ||= virtual_path.sub(%r{^/}, "").gsub(%r{/_?}, ".")
|
22
24
|
end
|
23
25
|
|
24
|
-
def
|
25
|
-
return if
|
26
|
+
def __vc_build_i18n_backend
|
27
|
+
return if __vc_compiled?
|
26
28
|
|
27
29
|
# We need to load the translations files from the ancestors so a component
|
28
30
|
# can inherit translations from its parent and is able to overwrite them.
|
@@ -33,31 +35,31 @@ module ViewComponent
|
|
33
35
|
end
|
34
36
|
|
35
37
|
# In development it will become nil if the translations file is removed
|
36
|
-
self.
|
38
|
+
self.__vc_i18n_backend = if translation_files.any?
|
37
39
|
I18nBackend.new(
|
38
|
-
|
40
|
+
scope: __vc_i18n_scope,
|
39
41
|
load_paths: translation_files
|
40
42
|
)
|
41
43
|
end
|
42
44
|
end
|
43
45
|
|
44
|
-
def
|
46
|
+
def __vc_i18n_key(key, scope = nil)
|
45
47
|
scope = scope.join(".") if scope.is_a? Array
|
46
48
|
key = key&.to_s unless key.is_a?(String)
|
47
49
|
key = "#{scope}.#{key}" if scope
|
48
|
-
key = "#{
|
50
|
+
key = "#{__vc_i18n_scope}#{key}" if key.start_with?(".")
|
49
51
|
key
|
50
52
|
end
|
51
53
|
|
52
54
|
def translate(key = nil, **options)
|
53
55
|
return key.map { |k| translate(k, **options) } if key.is_a?(Array)
|
54
56
|
|
55
|
-
|
57
|
+
__vc_ensure_compiled
|
56
58
|
|
57
59
|
locale = options.delete(:locale) || ::I18n.locale
|
58
|
-
key =
|
60
|
+
key = __vc_i18n_key(key, options.delete(:scope))
|
59
61
|
|
60
|
-
|
62
|
+
__vc_i18n_backend.translate(locale, key, options)
|
61
63
|
end
|
62
64
|
|
63
65
|
alias_method :t, :translate
|
@@ -66,8 +68,8 @@ module ViewComponent
|
|
66
68
|
class I18nBackend < ::I18n::Backend::Simple
|
67
69
|
EMPTY_HASH = {}.freeze
|
68
70
|
|
69
|
-
def initialize(
|
70
|
-
@
|
71
|
+
def initialize(scope:, load_paths:)
|
72
|
+
@__vc_i18n_scope = scope.split(".").map(&:to_sym)
|
71
73
|
@load_paths = load_paths
|
72
74
|
end
|
73
75
|
|
@@ -77,7 +79,7 @@ module ViewComponent
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def scope_data(data)
|
80
|
-
@
|
82
|
+
@__vc_i18n_scope.reverse_each do |part|
|
81
83
|
data = {part => data}
|
82
84
|
end
|
83
85
|
data
|
@@ -91,19 +93,19 @@ module ViewComponent
|
|
91
93
|
def translate(key = nil, **options)
|
92
94
|
raise ViewComponent::TranslateCalledBeforeRenderError if view_context.nil?
|
93
95
|
|
94
|
-
return super unless
|
96
|
+
return super unless __vc_i18n_backend
|
95
97
|
return key.map { |k| translate(k, **options) } if key.is_a?(Array)
|
96
98
|
|
97
99
|
locale = options.delete(:locale) || ::I18n.locale
|
98
|
-
key = self.class.
|
100
|
+
key = self.class.__vc_i18n_key(key, options.delete(:scope))
|
99
101
|
as_html = HTML_SAFE_TRANSLATION_KEY.match?(key)
|
100
102
|
|
101
103
|
html_escape_translation_options!(options) if as_html
|
102
104
|
|
103
|
-
if key.start_with?(
|
105
|
+
if key.start_with?(__vc_i18n_scope + ".")
|
104
106
|
translated =
|
105
107
|
catch(:exception) do
|
106
|
-
|
108
|
+
__vc_i18n_backend.translate(locale, key, options)
|
107
109
|
end
|
108
110
|
|
109
111
|
# Fallback to the global translations
|
@@ -119,9 +121,8 @@ module ViewComponent
|
|
119
121
|
end
|
120
122
|
alias_method :t, :translate
|
121
123
|
|
122
|
-
|
123
|
-
|
124
|
-
self.class.i18n_scope
|
124
|
+
def __vc_i18n_scope
|
125
|
+
self.class.__vc_i18n_scope
|
125
126
|
end
|
126
127
|
|
127
128
|
private
|
@@ -12,13 +12,12 @@ module ViewComponent::UseHelpers
|
|
12
12
|
helper_method_name = full_helper_method_name(helper_method, prefix: prefix, source: from)
|
13
13
|
|
14
14
|
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
15
|
-
def #{helper_method_name}(
|
15
|
+
def #{helper_method_name}(...)
|
16
16
|
raise HelpersCalledBeforeRenderError if view_context.nil?
|
17
17
|
|
18
18
|
#{define_helper(helper_method: helper_method, source: from)}
|
19
19
|
end
|
20
20
|
RUBY
|
21
|
-
ruby2_keywords(helper_method_name) if respond_to?(:ruby2_keywords, true)
|
22
21
|
end
|
23
22
|
|
24
23
|
private
|
@@ -34,9 +33,9 @@ module ViewComponent::UseHelpers
|
|
34
33
|
end
|
35
34
|
|
36
35
|
def define_helper(helper_method:, source:)
|
37
|
-
return "__vc_original_view_context.#{helper_method}(
|
36
|
+
return "__vc_original_view_context.#{helper_method}(...)" unless source.present?
|
38
37
|
|
39
|
-
"#{source}.instance_method(:#{helper_method}).bind(self).call(
|
38
|
+
"#{source}.instance_method(:#{helper_method}).bind(self).call(...)"
|
40
39
|
end
|
41
40
|
end
|
42
41
|
end
|