Skip to content

Commit f7d630a

Browse files
authored
Merge pull request #745 from vinnygambiny/2.x
[2.x] Keep only partial data in mergeProps
2 parents 19ae352 + 2ceb700 commit f7d630a

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

src/Response.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,16 @@ public function resolveCacheDirections(Request $request): array
318318

319319
public function resolveMergeProps(Request $request): array
320320
{
321-
$resetProps = collect(explode(',', $request->header(Header::RESET, '')));
321+
$resetProps = array_filter(explode(',', $request->header(Header::RESET, '')));
322+
$onlyProps = array_filter(explode(',', $request->header(Header::PARTIAL_ONLY, '')));
323+
$exceptProps = array_filter(explode(',', $request->header(Header::PARTIAL_EXCEPT, '')));
324+
322325
$mergeProps = collect($this->props)
323326
->filter(fn ($prop) => $prop instanceof Mergeable)
324327
->filter(fn ($prop) => $prop->shouldMerge())
325-
->filter(fn ($_, $key) => ! $resetProps->contains($key));
328+
->reject(fn ($_, $key) => in_array($key, $resetProps))
329+
->filter(fn ($_, $key) => count($onlyProps) === 0 || in_array($key, $onlyProps))
330+
->reject(fn ($_, $key) => in_array($key, $exceptProps));
326331

327332
$deepMergeProps = $mergeProps
328333
->filter(fn ($prop) => $prop->shouldDeepMerge())

tests/ResponseTest.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,68 @@ public function test_server_response_with_defer_and_deep_merge_props(): void
320320
$this->assertSame('<div id="app" data-page="{&quot;component&quot;:&quot;User\/Edit&quot;,&quot;props&quot;:{&quot;user&quot;:{&quot;name&quot;:&quot;Jonathan&quot;},&quot;bar&quot;:&quot;bar value&quot;},&quot;url&quot;:&quot;\/user\/123&quot;,&quot;version&quot;:&quot;123&quot;,&quot;clearHistory&quot;:false,&quot;encryptHistory&quot;:false,&quot;deepMergeProps&quot;:[&quot;foo&quot;,&quot;bar&quot;],&quot;deferredProps&quot;:{&quot;default&quot;:[&quot;foo&quot;]}}"></div>', $view->render());
321321
}
322322

323+
public function test_exclude_merge_props_from_partial_only_response(): void
324+
{
325+
$request = Request::create('/user/123', 'GET');
326+
$request->headers->add(['X-Inertia' => 'true']);
327+
$request->headers->add(['X-Inertia-Partial-Component' => 'User/Edit']);
328+
$request->headers->add(['X-Inertia-Partial-Data' => 'user']);
329+
330+
$user = ['name' => 'Jonathan'];
331+
$response = new Response(
332+
'User/Edit',
333+
[
334+
'user' => $user,
335+
'foo' => new MergeProp('foo value'),
336+
'bar' => new MergeProp('bar value'),
337+
],
338+
'app',
339+
'123'
340+
);
341+
$response = $response->toResponse($request);
342+
$page = $response->getData();
343+
344+
$props = get_object_vars($page->props);
345+
346+
$this->assertInstanceOf(JsonResponse::class, $response);
347+
348+
$this->assertSame('Jonathan', $props['user']->name);
349+
$this->assertArrayNotHasKey('foo', $props);
350+
$this->assertArrayNotHasKey('bar', $props);
351+
$this->assertFalse(isset($page->mergeProps));
352+
}
353+
354+
public function test_exclude_merge_props_from_partial_except_response(): void
355+
{
356+
$request = Request::create('/user/123', 'GET');
357+
$request->headers->add(['X-Inertia' => 'true']);
358+
$request->headers->add(['X-Inertia-Partial-Component' => 'User/Edit']);
359+
$request->headers->add(['X-Inertia-Partial-Except' => 'foo']);
360+
361+
$user = ['name' => 'Jonathan'];
362+
$response = new Response(
363+
'User/Edit',
364+
[
365+
'user' => $user,
366+
'foo' => new MergeProp('foo value'),
367+
'bar' => new MergeProp('bar value'),
368+
],
369+
'app',
370+
'123'
371+
);
372+
$response = $response->toResponse($request);
373+
$page = $response->getData();
374+
375+
$props = get_object_vars($page->props);
376+
377+
$this->assertInstanceOf(JsonResponse::class, $response);
378+
379+
$this->assertSame('Jonathan', $props['user']->name);
380+
$this->assertArrayNotHasKey('foo', $props);
381+
$this->assertArrayHasKey('bar', $props);
382+
$this->assertSame(['bar'], $page->mergeProps);
383+
}
384+
323385
public function test_xhr_response(): void
324386
{
325387
$request = Request::create('/user/123', 'GET');

0 commit comments

Comments
 (0)