From 68431c023737653962bdefb40b17775e9fa5e23a Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Tue, 17 Nov 2020 12:38:02 -0500 Subject: [PATCH 1/5] Lazy load columns in data on entry listings. --- resources/js/components/Listing.vue | 5 ++- resources/js/components/collections/View.vue | 2 + .../js/components/data-list/DataList.vue | 6 ++- resources/js/components/entries/Listing.vue | 1 + resources/views/collections/show.blade.php | 1 + .../CP/Collections/CollectionsController.php | 8 ++++ src/Http/Resources/CP/Entries/Entries.php | 40 ++++++++++++++++++- 7 files changed, 59 insertions(+), 4 deletions(-) diff --git a/resources/js/components/Listing.vue b/resources/js/components/Listing.vue index 6e766f668d..b8a990e243 100644 --- a/resources/js/components/Listing.vue +++ b/resources/js/components/Listing.vue @@ -16,6 +16,7 @@ export default { props: { initialSortColumn: String, initialSortDirection: String, + initialColumns: Array, filters: Array, }, @@ -25,7 +26,8 @@ export default { initializing: true, loading: true, items: [], - columns: [], + columns: this.initialColumns, + visibleColumns: this.initialColumns.filter(column => column.visible), sortColumn: this.initialSortColumn, sortDirection: this.initialSortDirection, meta: null, @@ -42,6 +44,7 @@ export default { perPage: this.perPage, search: this.searchQuery, filters: this.activeFilterParameters, + columns: this.visibleColumns.map(column => column.field).join(','), }, this.additionalParameters); }, diff --git a/resources/js/components/collections/View.vue b/resources/js/components/collections/View.vue index 6b7499ed1e..a264708524 100644 --- a/resources/js/components/collections/View.vue +++ b/resources/js/components/collections/View.vue @@ -89,6 +89,7 @@ :collection="handle" :initial-sort-column="sortColumn" :initial-sort-direction="sortDirection" + :initial-columns="columns" :filters="filters" :run-action-url="runActionUrl" :bulk-actions-url="bulkActionsUrl" @@ -183,6 +184,7 @@ export default { structured: { type: Boolean, default: false }, sortColumn: { type: String, required: true }, sortDirection: { type: String, required: true }, + columns: { type: Array, required: true }, filters: { type: Array, required: true }, runActionUrl: { type: String, required: true }, bulkActionsUrl: { type: String, required: true }, diff --git a/resources/js/components/data-list/DataList.vue b/resources/js/components/data-list/DataList.vue index 3a9426b40d..4d3a56d216 100644 --- a/resources/js/components/data-list/DataList.vue +++ b/resources/js/components/data-list/DataList.vue @@ -95,7 +95,11 @@ export default { sortColumn(column) { this.sharedState.sortColumn = column; - } + }, + + visibleColumns(columns) { + this.$emit('visible-columns-updated', columns); + }, }, diff --git a/resources/js/components/entries/Listing.vue b/resources/js/components/entries/Listing.vue index b9bb4b84f0..7acea92fac 100644 --- a/resources/js/components/entries/Listing.vue +++ b/resources/js/components/entries/Listing.vue @@ -12,6 +12,7 @@ :sort="false" :sort-column="sortColumn" :sort-direction="sortDirection" + @visible-columns-updated="visibleColumns = $event" >
diff --git a/resources/views/collections/show.blade.php b/resources/views/collections/show.blade.php index e6cddfd04e..0cdcd8f8c7 100644 --- a/resources/views/collections/show.blade.php +++ b/resources/views/collections/show.blade.php @@ -13,6 +13,7 @@ :blueprints='@json($blueprints)' sort-column="{{ $collection->sortField() }}" sort-direction="{{ $collection->sortDirection() }}" + :columns="{{ $columns->toJson() }}" :filters="{{ $filters->toJson() }}" run-action-url="{{ cp_route('collections.entries.actions.run', $collection->handle()) }}" bulk-actions-url="{{ cp_route('collections.entries.actions.bulk', $collection->handle()) }}" diff --git a/src/Http/Controllers/CP/Collections/CollectionsController.php b/src/Http/Controllers/CP/Collections/CollectionsController.php index c62871f1d0..5091ae4026 100644 --- a/src/Http/Controllers/CP/Collections/CollectionsController.php +++ b/src/Http/Controllers/CP/Collections/CollectionsController.php @@ -60,10 +60,18 @@ public function show(Request $request, $collection) $site = $request->site ? Site::get($request->site) : Site::selected(); + $columns = $collection + ->entryBlueprint() + ->columns() + ->setPreferred("collections.{$collection->handle()}.columns") + ->rejectUnlisted() + ->values(); + $viewData = [ 'collection' => $collection, 'blueprints' => $blueprints, 'site' => $site->handle(), + 'columns' => $columns, 'filters' => Scope::filters('entries', [ 'collection' => $collection->handle(), 'blueprints' => $blueprints->pluck('handle')->all(), diff --git a/src/Http/Resources/CP/Entries/Entries.php b/src/Http/Resources/CP/Entries/Entries.php index 7ac300b1af..e01e8a79d5 100644 --- a/src/Http/Resources/CP/Entries/Entries.php +++ b/src/Http/Resources/CP/Entries/Entries.php @@ -35,6 +35,42 @@ private function setColumns() $this->columns = $columns->rejectUnlisted()->values(); } + private function requestedColumns() + { + if (! $requested = $this->requestedColumnKeys()) { + return $this->columns; + } + + return $this->columns->keyBy('field')->only($requested)->values(); + } + + private function visibleColumns() + { + if (! $requested = $this->requestedColumnKeys()) { + return $this->columns; + } + + $columns = $this->columns->keyBy('field')->map->visible(false); + + return collect($requested) + ->map(function ($field) use ($columns) { + return $columns->get($field)->visible(true); + }) + ->merge($columns->except($requested)) + ->values(); + } + + private function requestedColumnKeys() + { + $columns = request('columns'); + + if (! $columns) { + return []; + } + + return explode(',', $columns); + } + public function toArray($request) { $this->setColumns(); @@ -43,11 +79,11 @@ public function toArray($request) 'data' => $this->collection->each(function ($entry) { $entry ->blueprint($this->blueprint) - ->columns($this->columns); + ->columns($this->requestedColumns()); }), 'meta' => [ - 'columns' => $this->columns, + 'columns' => $this->visibleColumns(), ], ]; } From 9de6c3fa99aa567a189b1d4fdb7b0d4ea5a15b24 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Tue, 17 Nov 2020 15:23:46 -0500 Subject: [PATCH 2/5] Extract requested columns methods to reusable trait. --- .../CP/Concerns/HasRequestedColumns.php | 42 +++++++++++++++++++ src/Http/Resources/CP/Entries/Entries.php | 39 ++--------------- 2 files changed, 45 insertions(+), 36 deletions(-) create mode 100644 src/Http/Resources/CP/Concerns/HasRequestedColumns.php diff --git a/src/Http/Resources/CP/Concerns/HasRequestedColumns.php b/src/Http/Resources/CP/Concerns/HasRequestedColumns.php new file mode 100644 index 0000000000..f0845f4c59 --- /dev/null +++ b/src/Http/Resources/CP/Concerns/HasRequestedColumns.php @@ -0,0 +1,42 @@ +requestedColumnKeys()) { + return $this->columns; + } + + return $this->columns->keyBy('field')->only($requested)->values(); + } + + protected function visibleColumns() + { + if (! $requested = $this->requestedColumnKeys()) { + return $this->columns; + } + + $columns = $this->columns->keyBy('field')->map->visible(false); + + return collect($requested) + ->map(function ($field) use ($columns) { + return $columns->get($field)->visible(true); + }) + ->merge($columns->except($requested)) + ->values(); + } + + protected function requestedColumnKeys() + { + $columns = request('columns'); + + if (! $columns) { + return []; + } + + return explode(',', $columns); + } +} diff --git a/src/Http/Resources/CP/Entries/Entries.php b/src/Http/Resources/CP/Entries/Entries.php index e01e8a79d5..8813894f0c 100644 --- a/src/Http/Resources/CP/Entries/Entries.php +++ b/src/Http/Resources/CP/Entries/Entries.php @@ -3,9 +3,12 @@ namespace Statamic\Http\Resources\CP\Entries; use Illuminate\Http\Resources\Json\ResourceCollection; +use Statamic\Http\Resources\CP\Concerns\HasRequestedColumns; class Entries extends ResourceCollection { + use HasRequestedColumns; + public $collects = ListedEntry::class; protected $blueprint; protected $columnPreferenceKey; @@ -35,42 +38,6 @@ private function setColumns() $this->columns = $columns->rejectUnlisted()->values(); } - private function requestedColumns() - { - if (! $requested = $this->requestedColumnKeys()) { - return $this->columns; - } - - return $this->columns->keyBy('field')->only($requested)->values(); - } - - private function visibleColumns() - { - if (! $requested = $this->requestedColumnKeys()) { - return $this->columns; - } - - $columns = $this->columns->keyBy('field')->map->visible(false); - - return collect($requested) - ->map(function ($field) use ($columns) { - return $columns->get($field)->visible(true); - }) - ->merge($columns->except($requested)) - ->values(); - } - - private function requestedColumnKeys() - { - $columns = request('columns'); - - if (! $columns) { - return []; - } - - return explode(',', $columns); - } - public function toArray($request) { $this->setColumns(); From 6224f643dfcdef4bc3397f6158f9ce3e5becd07e Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Tue, 17 Nov 2020 15:24:15 -0500 Subject: [PATCH 3/5] Lazy load columns in data on term listings. --- resources/js/components/terms/Listing.vue | 1 + resources/views/taxonomies/show.blade.php | 1 + .../Controllers/CP/Taxonomies/TaxonomiesController.php | 8 ++++++++ src/Http/Resources/CP/Taxonomies/Terms.php | 7 +++++-- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/resources/js/components/terms/Listing.vue b/resources/js/components/terms/Listing.vue index 1cdfef5bd2..abca13bd5e 100644 --- a/resources/js/components/terms/Listing.vue +++ b/resources/js/components/terms/Listing.vue @@ -12,6 +12,7 @@ :sort="false" :sort-column="sortColumn" :sort-direction="sortDirection" + @visible-columns-updated="visibleColumns = $event" >
diff --git a/resources/views/taxonomies/show.blade.php b/resources/views/taxonomies/show.blade.php index 3d6b7d497e..f27aa7bba8 100644 --- a/resources/views/taxonomies/show.blade.php +++ b/resources/views/taxonomies/show.blade.php @@ -46,6 +46,7 @@ taxonomy="{{ $taxonomy->handle() }}" initial-sort-column="{{ $taxonomy->sortField() }}" initial-sort-direction="{{ $taxonomy->sortDirection() }}" + :initial-columns="{{ $columns->toJson() }}" :filters="{{ $filters->toJson() }}" run-action-url="{{ cp_route('taxonomies.terms.actions.run', $taxonomy->handle()) }}" bulk-actions-url="{{ cp_route('taxonomies.terms.actions.bulk', $taxonomy->handle()) }}" diff --git a/src/Http/Controllers/CP/Taxonomies/TaxonomiesController.php b/src/Http/Controllers/CP/Taxonomies/TaxonomiesController.php index ad51164112..8b34ec9470 100644 --- a/src/Http/Controllers/CP/Taxonomies/TaxonomiesController.php +++ b/src/Http/Controllers/CP/Taxonomies/TaxonomiesController.php @@ -54,11 +54,19 @@ public function show($taxonomy) ]; }); + $columns = $taxonomy + ->termBlueprint() + ->columns() + ->setPreferred("taxonomies.{$taxonomy->handle()}.columns") + ->rejectUnlisted() + ->values(); + $viewData = [ 'taxonomy' => $taxonomy, 'hasTerms' => true, // todo $taxonomy->queryTerms()->count(), 'blueprints' => $blueprints, 'site' => Site::selected()->handle(), + 'columns' => $columns, 'filters' => Scope::filters('terms', [ 'taxonomy' => $taxonomy->handle(), 'blueprints' => $blueprints->pluck('handle')->all(), diff --git a/src/Http/Resources/CP/Taxonomies/Terms.php b/src/Http/Resources/CP/Taxonomies/Terms.php index 1a755bacdf..8ad27450c0 100644 --- a/src/Http/Resources/CP/Taxonomies/Terms.php +++ b/src/Http/Resources/CP/Taxonomies/Terms.php @@ -3,9 +3,12 @@ namespace Statamic\Http\Resources\CP\Taxonomies; use Illuminate\Http\Resources\Json\ResourceCollection; +use Statamic\Http\Resources\CP\Concerns\HasRequestedColumns; class Terms extends ResourceCollection { + use HasRequestedColumns; + public $collects = ListedTerm::class; protected $blueprint; protected $columnPreferenceKey; @@ -43,11 +46,11 @@ public function toArray($request) 'data' => $this->collection->each(function ($term) { $term ->blueprint($this->blueprint) - ->columns($this->columns); + ->columns($this->requestedColumns()); }), 'meta' => [ - 'columns' => $this->columns, + 'columns' => $this->visibleColumns(), ], ]; } From 1c84c4cfcbfd4cca16c7ef7bc0f80c63c4e031ac Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Tue, 17 Nov 2020 15:27:09 -0500 Subject: [PATCH 4/5] Fix JS errors in listings without column selector. --- resources/js/components/Listing.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/js/components/Listing.vue b/resources/js/components/Listing.vue index b8a990e243..b0da9f6799 100644 --- a/resources/js/components/Listing.vue +++ b/resources/js/components/Listing.vue @@ -16,7 +16,10 @@ export default { props: { initialSortColumn: String, initialSortDirection: String, - initialColumns: Array, + initialColumns: { + type: Array, + default: () => [], + }, filters: Array, }, From 8d348308aaa238599ae603f11101f80c426a1296 Mon Sep 17 00:00:00 2001 From: Jesse Leite Date: Tue, 17 Nov 2020 15:33:34 -0500 Subject: [PATCH 5/5] Lazy load columns in data on form submission listings. --- resources/js/components/forms/SubmissionListing.vue | 1 + resources/views/forms/show.blade.php | 1 + src/Http/Controllers/CP/Forms/FormsController.php | 9 ++++++++- src/Http/Resources/CP/Submissions/Submissions.php | 7 +++++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/resources/js/components/forms/SubmissionListing.vue b/resources/js/components/forms/SubmissionListing.vue index 9c7ab24905..4037e762e9 100644 --- a/resources/js/components/forms/SubmissionListing.vue +++ b/resources/js/components/forms/SubmissionListing.vue @@ -14,6 +14,7 @@ :sort="false" :sort-column="sortColumn" :sort-direction="sortDirection" + @visible-columns-updated="visibleColumns = $event" >
diff --git a/resources/views/forms/show.blade.php b/resources/views/forms/show.blade.php index dea546d5a4..69f4da61d5 100644 --- a/resources/views/forms/show.blade.php +++ b/resources/views/forms/show.blade.php @@ -54,6 +54,7 @@ bulk-actions-url="{{ cp_route('forms.submissions.actions.bulk', $form->handle()) }}" initial-sort-column="datestamp" initial-sort-direction="desc" + :initial-columns="{{ $columns->toJson() }}" v-cloak >
diff --git a/src/Http/Controllers/CP/Forms/FormsController.php b/src/Http/Controllers/CP/Forms/FormsController.php index edfb727cf6..0ccb950d3e 100644 --- a/src/Http/Controllers/CP/Forms/FormsController.php +++ b/src/Http/Controllers/CP/Forms/FormsController.php @@ -41,7 +41,14 @@ public function show($form) { $this->authorize('view', $form); - return view('statamic::forms.show', compact('form')); + $columns = $form + ->blueprint() + ->columns() + ->setPreferred("forms.{$form->handle()}.columns") + ->rejectUnlisted() + ->values(); + + return view('statamic::forms.show', compact('form', 'columns')); } /** diff --git a/src/Http/Resources/CP/Submissions/Submissions.php b/src/Http/Resources/CP/Submissions/Submissions.php index 2ae0544fb8..4045d34314 100644 --- a/src/Http/Resources/CP/Submissions/Submissions.php +++ b/src/Http/Resources/CP/Submissions/Submissions.php @@ -4,9 +4,12 @@ use Illuminate\Http\Resources\Json\ResourceCollection; use Statamic\CP\Column; +use Statamic\Http\Resources\CP\Concerns\HasRequestedColumns; class Submissions extends ResourceCollection { + use HasRequestedColumns; + public $collects = ListedSubmission::class; protected $blueprint; protected $columns; @@ -46,11 +49,11 @@ public function toArray($request) 'data' => $this->collection->each(function ($collection) { $collection ->blueprint($this->blueprint) - ->columns($this->columns); + ->columns($this->requestedColumns()); }), 'meta' => [ - 'columns' => $this->columns, + 'columns' => $this->visibleColumns(), ], ]; }