alba-inertia 0.1.1 → 0.1.2
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 +9 -1
- data/README.md +56 -1
- data/lib/alba/inertia/controller.rb +6 -2
- data/lib/alba/inertia/prop_builder.rb +70 -9
- data/lib/alba/inertia/resource.rb +3 -4
- data/lib/alba/inertia/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 36892b105c78f91a4874dca3d397e42be762acf30fcd56f379e1f2672683def0
|
|
4
|
+
data.tar.gz: 8dfc87dca73d0594fcc7233e48bdf73d2cc62f6f082bfe0e820685cfa827603c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 74b25910459121487726f3a3d1be5c235dacd494cc25d9bc0dfb337e0900e962be3c5283e8a2667476cf1dcff1314a984781c04ab037f7eddcf2b09379296b48
|
|
7
|
+
data.tar.gz: d36a4bde371ad4322c595f251ce7a83c4cd0e83e6459695603044d8987e6d029b6556783337135a668ac76410cec19a57634492e805c252c86744d6d95efeddd
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning].
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.2] - 2025-12-08
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Support for `InertiaRails.scroll` attributes. ([@skryukov])
|
|
15
|
+
- Add `serializer_params` option to `render_inertia` and `inertia_serializer_params` controller method for passing params to serializers. ([@skryukov])
|
|
16
|
+
|
|
10
17
|
## [0.1.1] - 2025-11-05
|
|
11
18
|
|
|
12
19
|
### Added
|
|
@@ -26,7 +33,8 @@ and this project adheres to [Semantic Versioning].
|
|
|
26
33
|
|
|
27
34
|
[@skryukov]: https://github.com/skryukov
|
|
28
35
|
|
|
29
|
-
[Unreleased]: https://github.com/skryukov/alba-inertia/compare/v0.1.
|
|
36
|
+
[Unreleased]: https://github.com/skryukov/alba-inertia/compare/v0.1.2...HEAD
|
|
37
|
+
[0.1.2]: https://github.com/skryukov/alba-inertia/compare/v0.1.1...v0.1.2
|
|
30
38
|
[0.1.1]: https://github.com/skryukov/alba-inertia/compare/v0.1.0...v0.1.1
|
|
31
39
|
[0.1.0]: https://github.com/skryukov/alba-inertia/commits/v0.1.0
|
|
32
40
|
|
data/README.md
CHANGED
|
@@ -27,7 +27,10 @@ Include `Alba::Inertia::Resource` in your resource classes:
|
|
|
27
27
|
```ruby
|
|
28
28
|
class ApplicationResource
|
|
29
29
|
include Alba::Resource
|
|
30
|
-
|
|
30
|
+
|
|
31
|
+
# ...
|
|
32
|
+
|
|
33
|
+
helper Alba::Inertia::Resource
|
|
31
34
|
end
|
|
32
35
|
```
|
|
33
36
|
|
|
@@ -61,6 +64,15 @@ class CoursesIndexResource < ApplicationResource
|
|
|
61
64
|
|
|
62
65
|
# Merge prop (for partial reloads)
|
|
63
66
|
has_many :comments, serializer: CommentResource, inertia: { merge: { match_on: :id } }
|
|
67
|
+
|
|
68
|
+
# Scroll prop with auto-detection.
|
|
69
|
+
# Checks object for `scroll_meta` and `pagy` attributes, or object being a Kaminari collection.
|
|
70
|
+
has_many :items, inertia: :scroll
|
|
71
|
+
|
|
72
|
+
# Scroll prop with explicit metadata
|
|
73
|
+
has_many :items, inertia: { scroll: :meta }
|
|
74
|
+
has_many :items, inertia: { scroll: -> { |obj| obj.meta } }
|
|
75
|
+
has_many :items, inertia: { scroll: -> { |obj| obj.meta }, wrapper: 'data' }
|
|
64
76
|
end
|
|
65
77
|
```
|
|
66
78
|
|
|
@@ -177,6 +189,49 @@ render_inertia(serializer: CustomResource)
|
|
|
177
189
|
render_inertia(locals: { custom: 'props'})
|
|
178
190
|
```
|
|
179
191
|
|
|
192
|
+
### Serializer Params
|
|
193
|
+
|
|
194
|
+
You can pass params to the serializer using the `serializer_params` option. This is useful for passing context like the current user, permissions, or feature flags:
|
|
195
|
+
|
|
196
|
+
```ruby
|
|
197
|
+
class CoursesController < InertiaController
|
|
198
|
+
def index
|
|
199
|
+
@courses = Course.all
|
|
200
|
+
render_inertia(serializer_params: { current_user: current_user })
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
In your resource, access params via the `params` method:
|
|
206
|
+
|
|
207
|
+
```ruby
|
|
208
|
+
class CoursesIndexResource < ApplicationResource
|
|
209
|
+
attributes :id, :title
|
|
210
|
+
|
|
211
|
+
attribute :can_edit do |course|
|
|
212
|
+
params[:current_user]&.can_edit?(course)
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Default Serializer Params
|
|
218
|
+
|
|
219
|
+
Override `inertia_serializer_params` in your controller to provide default params for all Inertia renders:
|
|
220
|
+
|
|
221
|
+
```ruby
|
|
222
|
+
class ApplicationController < ActionController::Base
|
|
223
|
+
include Alba::Inertia::Controller
|
|
224
|
+
|
|
225
|
+
private
|
|
226
|
+
|
|
227
|
+
def inertia_serializer_params
|
|
228
|
+
{ current_user: current_user, locale: I18n.locale }
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The `serializer_params` option in `render_inertia` will be merged with these defaults (with `serializer_params` taking precedence).
|
|
234
|
+
|
|
180
235
|
## Naming Convention
|
|
181
236
|
|
|
182
237
|
The controller integration follows Rails conventions:
|
|
@@ -9,13 +9,17 @@ module Alba
|
|
|
9
9
|
Alba::Inertia.config.default_render ? render_inertia : super
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def render_inertia(component = nil, serializer: inertia_serializer_class, locals: view_assigns, **props)
|
|
13
|
-
resource = serializer&.new(locals.symbolize_keys
|
|
12
|
+
def render_inertia(component = nil, serializer: inertia_serializer_class, locals: view_assigns, serializer_params: {}, **props)
|
|
13
|
+
resource = serializer&.new(locals.symbolize_keys!, params: inertia_serializer_params.merge(serializer_params))
|
|
14
14
|
data = resource.respond_to?(:to_inertia) ? resource.to_inertia : resource.as_json
|
|
15
15
|
|
|
16
16
|
render inertia: component || true, props: data || {}, **props
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
def inertia_serializer_params
|
|
20
|
+
{}
|
|
21
|
+
end
|
|
22
|
+
|
|
19
23
|
def inertia_serializer_class
|
|
20
24
|
namespace = self.class.name.deconstantize
|
|
21
25
|
base_name = "#{controller_name}_#{action_name}_resource".classify
|
|
@@ -4,15 +4,17 @@ module Alba
|
|
|
4
4
|
module Inertia
|
|
5
5
|
class PropBuilder
|
|
6
6
|
class << self
|
|
7
|
-
def build(evaluation_block, options)
|
|
7
|
+
def build(evaluation_block, options, object = nil)
|
|
8
8
|
if options[:optional]
|
|
9
|
-
wrap_optional(evaluation_block, options[:optional])
|
|
9
|
+
wrap_optional(evaluation_block, options[:optional], object)
|
|
10
10
|
elsif options[:defer]
|
|
11
|
-
wrap_defer(evaluation_block, options[:defer])
|
|
11
|
+
wrap_defer(evaluation_block, options[:defer], object)
|
|
12
12
|
elsif options[:merge]
|
|
13
|
-
wrap_merge(evaluation_block, options[:merge])
|
|
13
|
+
wrap_merge(evaluation_block, options[:merge], object)
|
|
14
|
+
elsif options[:scroll]
|
|
15
|
+
wrap_scroll(evaluation_block, options[:scroll], object)
|
|
14
16
|
elsif options[:always]
|
|
15
|
-
wrap_always(evaluation_block, options[:always])
|
|
17
|
+
wrap_always(evaluation_block, options[:always], object)
|
|
16
18
|
else
|
|
17
19
|
Alba::Inertia.config.lazy_by_default ? evaluation_block : evaluation_block.call
|
|
18
20
|
end
|
|
@@ -20,15 +22,15 @@ module Alba
|
|
|
20
22
|
|
|
21
23
|
private
|
|
22
24
|
|
|
23
|
-
def wrap_always(value_block, _opts)
|
|
25
|
+
def wrap_always(value_block, _opts, _object)
|
|
24
26
|
::InertiaRails.always(&value_block)
|
|
25
27
|
end
|
|
26
28
|
|
|
27
|
-
def wrap_optional(value_block, _opts)
|
|
29
|
+
def wrap_optional(value_block, _opts, _object)
|
|
28
30
|
::InertiaRails.optional(&value_block)
|
|
29
31
|
end
|
|
30
32
|
|
|
31
|
-
def wrap_defer(value_block, opts)
|
|
33
|
+
def wrap_defer(value_block, opts, _object)
|
|
32
34
|
if opts.is_a?(Hash)
|
|
33
35
|
options = {
|
|
34
36
|
group: opts[:group],
|
|
@@ -43,7 +45,7 @@ module Alba
|
|
|
43
45
|
end
|
|
44
46
|
end
|
|
45
47
|
|
|
46
|
-
def wrap_merge(value_block, opts)
|
|
48
|
+
def wrap_merge(value_block, opts, _object)
|
|
47
49
|
if opts.is_a?(Hash)
|
|
48
50
|
options = {match_on: opts[:match_on]}.compact
|
|
49
51
|
::InertiaRails.merge(**options, &value_block)
|
|
@@ -51,6 +53,65 @@ module Alba
|
|
|
51
53
|
::InertiaRails.merge(&value_block)
|
|
52
54
|
end
|
|
53
55
|
end
|
|
56
|
+
|
|
57
|
+
def wrap_scroll(value_block, opts, object)
|
|
58
|
+
case opts
|
|
59
|
+
when Symbol
|
|
60
|
+
# scroll: :meta => extract metadata from object[:meta] or object.meta
|
|
61
|
+
metadata = extract_from_object(object, opts)
|
|
62
|
+
::InertiaRails.scroll(metadata: metadata, &value_block)
|
|
63
|
+
when Proc
|
|
64
|
+
# scroll: -> { |obj| obj.meta } => call proc with object
|
|
65
|
+
metadata = opts.call(object)
|
|
66
|
+
::InertiaRails.scroll(metadata: metadata, &value_block)
|
|
67
|
+
when Hash
|
|
68
|
+
options = build_scroll_options(opts, object)
|
|
69
|
+
::InertiaRails.scroll(**options, &value_block)
|
|
70
|
+
when TrueClass
|
|
71
|
+
# scroll: true => auto-detect metadata
|
|
72
|
+
metadata = auto_detect_pagination_metadata(object)
|
|
73
|
+
::InertiaRails.scroll(metadata: metadata, &value_block)
|
|
74
|
+
else
|
|
75
|
+
raise ArgumentError, "Invalid scroll option. Expected Symbol, Proc, Hash, or true."
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def build_scroll_options(opts, object)
|
|
80
|
+
metadata = case opts[:scroll]
|
|
81
|
+
when Symbol
|
|
82
|
+
extract_from_object(object, opts[:scroll])
|
|
83
|
+
when Proc
|
|
84
|
+
opts[:scroll].call(object)
|
|
85
|
+
else
|
|
86
|
+
opts[:scroll]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
{metadata: metadata}.merge(opts.slice(:wrapper, :page_name, :previous_page, :next_page, :current_page))
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def extract_from_object(object, key)
|
|
93
|
+
if object.respond_to?(:[])
|
|
94
|
+
object[key]
|
|
95
|
+
elsif object.respond_to?(key)
|
|
96
|
+
object.send(key)
|
|
97
|
+
end
|
|
98
|
+
rescue
|
|
99
|
+
nil
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def auto_detect_pagination_metadata(object)
|
|
103
|
+
metadata = extract_from_object(object, :scroll_meta)
|
|
104
|
+
return metadata if metadata
|
|
105
|
+
|
|
106
|
+
metadata = extract_from_object(object, :pagy)
|
|
107
|
+
return metadata if metadata
|
|
108
|
+
|
|
109
|
+
# Check if object is a Kaminari collection
|
|
110
|
+
return object if defined?(Kaminari) && object.is_a?(Kaminari::PageScopeMethods)
|
|
111
|
+
|
|
112
|
+
# If nothing found, raise an error
|
|
113
|
+
raise ArgumentError, "Unable to auto-detect pagination metadata. Please provide metadata explicitly or ensure object has 'scroll_meta', 'pagy' attributes, or is a Kaminari collection."
|
|
114
|
+
end
|
|
54
115
|
end
|
|
55
116
|
end
|
|
56
117
|
end
|
|
@@ -61,6 +61,7 @@ module Alba
|
|
|
61
61
|
optional: kwargs.delete(:optional) || false,
|
|
62
62
|
defer: kwargs.delete(:defer) || false,
|
|
63
63
|
merge: kwargs.delete(:merge) || false,
|
|
64
|
+
scroll: kwargs.delete(:scroll) || false,
|
|
64
65
|
always: kwargs.delete(:always) || false
|
|
65
66
|
}.select { |_k, v| v.present? }
|
|
66
67
|
|
|
@@ -107,9 +108,7 @@ module Alba
|
|
|
107
108
|
def auto_typelize_from_inertia(name, inertia_opts)
|
|
108
109
|
return unless respond_to?(:typelize)
|
|
109
110
|
|
|
110
|
-
should_be_optional = inertia_opts[:optional].present? ||
|
|
111
|
-
inertia_opts[:defer].present? ||
|
|
112
|
-
inertia_opts[:merge].present?
|
|
111
|
+
should_be_optional = inertia_opts[:optional].present? || inertia_opts[:defer].present?
|
|
113
112
|
|
|
114
113
|
typelize(name.to_sym => [optional: true]) if should_be_optional
|
|
115
114
|
end
|
|
@@ -127,7 +126,7 @@ module Alba
|
|
|
127
126
|
evaluation_block = build_evaluation_block(attr_name, attr_body)
|
|
128
127
|
|
|
129
128
|
result[attr_name_str] = if metadata.key?(attr_name)
|
|
130
|
-
PropBuilder.build(evaluation_block, metadata[attr_name])
|
|
129
|
+
PropBuilder.build(evaluation_block, metadata[attr_name], object)
|
|
131
130
|
else
|
|
132
131
|
Alba::Inertia.config.lazy_by_default ? evaluation_block : evaluation_block.call
|
|
133
132
|
end
|
data/lib/alba/inertia/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alba-inertia
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Svyatoslav Kryukov
|
|
@@ -67,15 +67,15 @@ files:
|
|
|
67
67
|
- lib/alba/inertia/prop_builder.rb
|
|
68
68
|
- lib/alba/inertia/resource.rb
|
|
69
69
|
- lib/alba/inertia/version.rb
|
|
70
|
-
homepage: https://github.com/skryukov/
|
|
70
|
+
homepage: https://github.com/skryukov/alba-inertia
|
|
71
71
|
licenses:
|
|
72
72
|
- MIT
|
|
73
73
|
metadata:
|
|
74
|
-
bug_tracker_uri: https://github.com/skryukov/
|
|
75
|
-
changelog_uri: https://github.com/skryukov/
|
|
76
|
-
documentation_uri: https://github.com/skryukov/
|
|
77
|
-
homepage_uri: https://github.com/skryukov/
|
|
78
|
-
source_code_uri: https://github.com/skryukov/
|
|
74
|
+
bug_tracker_uri: https://github.com/skryukov/alba-inertia/issues
|
|
75
|
+
changelog_uri: https://github.com/skryukov/alba-inertia/blob/main/CHANGELOG.md
|
|
76
|
+
documentation_uri: https://github.com/skryukov/alba-inertia/blob/main/README.md
|
|
77
|
+
homepage_uri: https://github.com/skryukov/alba-inertia
|
|
78
|
+
source_code_uri: https://github.com/skryukov/alba-inertia
|
|
79
79
|
rubygems_mfa_required: 'true'
|
|
80
80
|
rdoc_options: []
|
|
81
81
|
require_paths:
|
|
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
91
91
|
- !ruby/object:Gem::Version
|
|
92
92
|
version: '0'
|
|
93
93
|
requirements: []
|
|
94
|
-
rubygems_version:
|
|
94
|
+
rubygems_version: 4.0.0
|
|
95
95
|
specification_version: 4
|
|
96
96
|
summary: Seamless integration between Alba and Inertia Rails.
|
|
97
97
|
test_files: []
|