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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df5684ee0729c9f364ed20123d54801b86444a5e9744faad8440a72e6c687954
4
- data.tar.gz: 9b5e4cacf37baec365aeb8b3ab4a1f34414e8ac2cec9ef44c73d9602b314431f
3
+ metadata.gz: 36892b105c78f91a4874dca3d397e42be762acf30fcd56f379e1f2672683def0
4
+ data.tar.gz: 8dfc87dca73d0594fcc7233e48bdf73d2cc62f6f082bfe0e820685cfa827603c
5
5
  SHA512:
6
- metadata.gz: 32a3a5cf0efa9191ec64930aa9ec6911667a49effa8a22fc3f824ad6385dfadf4a31a6be6c836498b5f27fa6828b1f2e8d484517ef80c3917728c0376676eefe
7
- data.tar.gz: e36f3677490020bdce6e55e0616ea5fa45aa3e1ba10f377b7db8732eaf62312e49117b18bf9fe21bf08949d1a605934e3019e928d15f6355bb1230c14175e4a3
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.0...HEAD
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
- include Alba::Inertia::Resource
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Alba
4
4
  module Inertia
5
- VERSION = "0.1.1"
5
+ VERSION = "0.1.2"
6
6
  end
7
7
  end
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.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/typelizer
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/typelizer/issues
75
- changelog_uri: https://github.com/skryukov/typelizer/blob/main/CHANGELOG.md
76
- documentation_uri: https://github.com/skryukov/typelizer/blob/main/README.md
77
- homepage_uri: https://github.com/skryukov/typelizer
78
- source_code_uri: https://github.com/skryukov/typelizer
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: 3.6.9
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: []