diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/routes/capabilities/collections.rb b/packages/forest_admin_agent/lib/forest_admin_agent/routes/capabilities/collections.rb index ab61dd770..b9accaad9 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/routes/capabilities/collections.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/routes/capabilities/collections.rb @@ -63,7 +63,8 @@ def handle_request(args = {}) collections: result, nativeQueryConnections: connections, agentCapabilities: { - canUseProjectionOnGetOne: true + canUseProjectionOnGetOne: true, + canUseMultipleFieldsProjectionOnRelation: true } }, status: 200 diff --git a/packages/forest_admin_agent/lib/forest_admin_agent/utils/query_string_parser.rb b/packages/forest_admin_agent/lib/forest_admin_agent/utils/query_string_parser.rb index 901c22f2d..16618df5a 100644 --- a/packages/forest_admin_agent/lib/forest_admin_agent/utils/query_string_parser.rb +++ b/packages/forest_admin_agent/lib/forest_admin_agent/utils/query_string_parser.rb @@ -63,7 +63,7 @@ def self.add_polymorphic_type_fields(collection, requested_field_names) end def self.build_projection_fields(collection, requested_field_names, args) - requested_field_names.map do |field_name| + requested_field_names.flat_map do |field_name| field = get_field(collection, field_name) case field.type @@ -73,7 +73,12 @@ def self.build_projection_fields(collection, requested_field_names, args) "#{field_name}:*" else relation_fields = args.dig(:params, :fields, field_name) - "#{field_name}:#{relation_fields}" + + if relation_fields.nil? || relation_fields.empty? + "#{field_name}:#{relation_fields}" + else + relation_fields.split(',').map { |sub_field| "#{field_name}:#{sub_field.strip}" } + end end end end diff --git a/packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/capabilities/collections_spec.rb b/packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/capabilities/collections_spec.rb index ec1575cb0..bb64ae66a 100644 --- a/packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/capabilities/collections_spec.rb +++ b/packages/forest_admin_agent/spec/lib/forest_admin_agent/routes/capabilities/collections_spec.rb @@ -84,7 +84,7 @@ module Capabilities it 'returns agentCapabilities' do expect(result[:content][:agentCapabilities]).to eq( - { canUseProjectionOnGetOne: true } + { canUseProjectionOnGetOne: true, canUseMultipleFieldsProjectionOnRelation: true } ) end end @@ -131,7 +131,7 @@ module Capabilities it 'returns agentCapabilities' do expect(result[:content][:agentCapabilities]).to eq( - { canUseProjectionOnGetOne: true } + { canUseProjectionOnGetOne: true, canUseMultipleFieldsProjectionOnRelation: true } ) end end diff --git a/packages/forest_admin_agent/spec/lib/forest_admin_agent/utils/query_string_parser_spec.rb b/packages/forest_admin_agent/spec/lib/forest_admin_agent/utils/query_string_parser_spec.rb index 4ab8ca0be..1af986c6f 100644 --- a/packages/forest_admin_agent/spec/lib/forest_admin_agent/utils/query_string_parser_spec.rb +++ b/packages/forest_admin_agent/spec/lib/forest_admin_agent/utils/query_string_parser_spec.rb @@ -333,6 +333,20 @@ module Utils expect(described_class.parse_projection_with_pks(collection, args)).to eq(Projection.new(%w[id author:name author:id])) end + + it 'supports multiple projected fields on a belongsTo relation' do + args = { + params: { + fields: { + 'Book' => 'id, author', + 'author' => 'id,name' + } + } + } + + expect(described_class.parse_projection_with_pks(collection, + args)).to eq(Projection.new(%w[id author:id author:name])) + end end describe 'parse_pagination' do