Skip to content

Commit 282dcec

Browse files
[6.x] Lazy-load actions for collections, submissions & terms (#14097)
Co-authored-by: Jason Varga <jason@pixelfear.com>
1 parent f92e17d commit 282dcec

7 files changed

Lines changed: 112 additions & 18 deletions

File tree

resources/js/components/collections/Listing.vue

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,43 @@
2424
<aside class="flex items-center gap-2">
2525
<ItemActions
2626
:url="collection.actions_url"
27-
:actions="collection.actions"
2827
:item="collection.id"
2928
@started="actionStarted"
3029
@completed="actionCompleted"
31-
v-slot="{ actions }"
30+
v-slot="{ actions, loadActions, shouldShowSkeleton }"
3231
>
33-
<Dropdown placement="left-start">
32+
<Dropdown
33+
placement="left-start"
34+
@mouseover="loadActions"
35+
@focus="loadActions"
36+
@click="loadActions"
37+
>
3438
<DropdownMenu>
3539
<DropdownItem v-if="collection.available_in_selected_site" :text="__('View')" icon="eye" :href="collection.entries_url" />
3640
<DropdownItem v-if="collection.available_in_selected_site && collection.url" :text="__('Visit URL')" icon="external-link" target="_blank" :href="collection.url" />
3741
<DropdownItem v-if="collection.editable" :text="__('Configure')" icon="cog" :href="collection.edit_url" />
3842
<DropdownItem v-if="collection.blueprint_editable" :text="__('Edit Blueprints')" icon="blueprint-edit" :href="collection.blueprints_url" />
3943
<DropdownItem v-if="collection.editable" :text="__('Scaffold Views')" icon="scaffold" :href="collection.scaffold_url" />
40-
<DropdownSeparator v-if="actions.length" />
41-
<DropdownItem
42-
v-for="action in actions"
43-
:key="action.handle"
44-
:text="__(action.title)"
45-
:icon="action.icon"
46-
:variant="action.dangerous ? 'destructive' : 'default'"
47-
@click="action.run"
48-
/>
44+
<DropdownSeparator v-if="shouldShowSkeleton || actions.length" />
45+
<template v-if="shouldShowSkeleton">
46+
<div v-for="index in 3" :key="index" class="contents">
47+
<ui-skeleton class="m-1 size-5" />
48+
<ui-skeleton
49+
class="mx-2 my-1.5 h-5"
50+
:class="index === 1 ? 'w-28' : index === 2 ? 'w-36' : 'w-24'"
51+
/>
52+
</div>
53+
</template>
54+
<template v-else>
55+
<DropdownItem
56+
v-for="action in actions"
57+
:key="action.handle"
58+
:text="__(action.title)"
59+
:icon="action.icon"
60+
:variant="action.dangerous ? 'destructive' : 'default'"
61+
@click="action.run"
62+
/>
63+
</template>
4964
</DropdownMenu>
5065
</Dropdown>
5166
</ItemActions>

src/Http/Controllers/CP/Collections/CollectionsController.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ private function collections()
9494
'editable' => User::current()->can('edit', $collection),
9595
'blueprint_editable' => User::current()->can('configure fields'),
9696
'available_in_selected_site' => $collection->sites()->contains(Site::selected()->handle()),
97-
'actions' => Action::for($collection),
9897
'actions_url' => cp_route('collections.actions.run'),
9998
'icon' => $collection->icon(),
10099
'create_label' => $collection->createLabel(),

src/Http/Resources/CP/Submissions/ListedSubmission.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Statamic\Http\Resources\CP\Submissions;
44

55
use Illuminate\Http\Resources\Json\JsonResource;
6-
use Statamic\Facades\Action;
76
use Statamic\Facades\User;
87

98
class ListedSubmission extends JsonResource
@@ -36,7 +35,6 @@ public function toArray($request)
3635
])),
3736
'url' => cp_route('forms.submissions.show', [$form->handle(), $this->resource->id()]),
3837
'deleteable' => User::current()->can('delete', $this->resource),
39-
'actions' => Action::for($this->resource),
4038
];
4139
}
4240

src/Http/Resources/CP/Taxonomies/ListedTerm.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace Statamic\Http\Resources\CP\Taxonomies;
44

55
use Illuminate\Http\Resources\Json\JsonResource;
6-
use Statamic\Facades\Action;
76
use Statamic\Facades\User;
87

98
class ListedTerm extends JsonResource
@@ -28,7 +27,6 @@ public function columns($columns)
2827
public function toArray($request)
2928
{
3029
$term = $this->resource;
31-
$taxonomy = $term->taxonomy();
3230

3331
return [
3432
'id' => $term->id(),
@@ -45,7 +43,6 @@ public function toArray($request)
4543
'taxonomy' => $term->taxonomy()->toArray(),
4644
'viewable' => User::current()->can('view', $term),
4745
'editable' => User::current()->can('edit', $term),
48-
'actions' => Action::for($term, ['taxonomy' => $taxonomy->handle()]),
4946
];
5047
}
5148

tests/Feature/Collections/ViewCollectionListingTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,23 @@ public function it_shows_a_list_of_collections()
109109
*/
110110
}
111111

112+
#[Test]
113+
public function it_does_not_eager_load_actions_in_listing()
114+
{
115+
$this->createCollection('bar');
116+
117+
$user = tap(User::make()->makeSuper())->save();
118+
119+
$this
120+
->actingAs($user)
121+
->get(cp_route('collections.index'))
122+
->assertSuccessful()
123+
->assertInertia(fn ($page) => $page
124+
->component('collections/Index')
125+
->has('collections', 1)
126+
->missing('collections.0.actions'));
127+
}
128+
112129
#[Test]
113130
public function it_shows_no_results_when_there_are_no_collections()
114131
{
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Tests\Feature\Forms;
4+
5+
use PHPUnit\Framework\Attributes\Test;
6+
use Statamic\Facades\Form;
7+
use Statamic\Facades\FormSubmission;
8+
use Statamic\Facades\User;
9+
use Tests\PreventSavingStacheItemsToDisk;
10+
use Tests\TestCase;
11+
12+
class ViewSubmissionsListingTest extends TestCase
13+
{
14+
use PreventSavingStacheItemsToDisk;
15+
16+
protected function resolveApplicationConfiguration($app)
17+
{
18+
parent::resolveApplicationConfiguration($app);
19+
20+
$app['config']['statamic.forms.forms'] = $this->fakeStacheDirectory.'/forms';
21+
}
22+
23+
#[Test]
24+
public function it_does_not_eager_load_actions_in_submissions_listing()
25+
{
26+
$user = tap(User::make()->makeSuper())->save();
27+
$form = tap(Form::make('test'))->save();
28+
FormSubmission::make()->form($form)->data(['foo' => 'bar'])->save();
29+
30+
$this
31+
->actingAs($user)
32+
->getJson(cp_route('forms.submissions.index', $form->handle()))
33+
->assertSuccessful()
34+
->assertJsonCount(1, 'data')
35+
->assertJsonMissingPath('data.0.actions');
36+
}
37+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Tests\Feature\Taxonomies;
4+
5+
use PHPUnit\Framework\Attributes\Test;
6+
use Statamic\Facades\Taxonomy;
7+
use Statamic\Facades\Term;
8+
use Statamic\Facades\User;
9+
use Tests\PreventSavingStacheItemsToDisk;
10+
use Tests\TestCase;
11+
12+
class ViewTermsListingTest extends TestCase
13+
{
14+
use PreventSavingStacheItemsToDisk;
15+
16+
#[Test]
17+
public function it_does_not_eager_load_actions_in_listing()
18+
{
19+
$user = tap(User::make()->makeSuper())->save();
20+
21+
$taxonomy = tap(Taxonomy::make('tags'))->save();
22+
tap(Term::make()->taxonomy('tags')->inDefaultLocale()->slug('alfa')->data(['title' => 'alfa']))->save();
23+
24+
$this
25+
->actingAs($user)
26+
->getJson(cp_route('taxonomies.terms.index', $taxonomy->handle()))
27+
->assertSuccessful()
28+
->assertJsonCount(1, 'data')
29+
->assertJsonMissingPath('data.0.actions');
30+
}
31+
}

0 commit comments

Comments
 (0)