Skip to content

Commit 29d4211

Browse files
[6.x] Add pagination to package changelogs (#13692)
1 parent 270bada commit 29d4211

4 files changed

Lines changed: 92 additions & 16 deletions

File tree

resources/js/components/updater/Updater.vue

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,27 @@
4242
:package="package"
4343
:show-actions="showActions"
4444
/>
45+
46+
<Pagination
47+
v-if="meta.last_page > 1"
48+
class="mt-6"
49+
:resource-meta="meta"
50+
:per-page="perPage"
51+
@page-selected="setPage"
52+
@per-page-changed="setPerPage"
53+
/>
4554
</div>
4655
</template>
4756

4857
<script>
4958
import Release from './Release.vue';
50-
import { Icon } from '@/components/ui';
59+
import { Icon, Pagination } from '@/components/ui';
5160
5261
export default {
5362
components: {
5463
Release,
5564
Icon,
65+
Pagination,
5666
},
5767
5868
props: ['slug', 'package', 'name'],
@@ -64,6 +74,9 @@ export default {
6474
currentVersion: null,
6575
latestRelease: null,
6676
showingUnlicensedReleases: false,
77+
page: 1,
78+
perPage: 10,
79+
meta: {},
6780
};
6881
},
6982
@@ -113,12 +126,34 @@ export default {
113126
getChangelog() {
114127
this.gettingChangelog = true;
115128
116-
this.$axios.get(cp_url(`/updater/${this.slug}/changelog`)).then((response) => {
117-
this.gettingChangelog = false;
118-
this.changelog = response.data.changelog;
119-
this.currentVersion = response.data.currentVersion;
120-
this.latestRelease = response.data.changelog[0];
121-
});
129+
this.$axios
130+
.get(cp_url(`/updater/${this.slug}/changelog`), {
131+
params: {
132+
page: this.page,
133+
perPage: this.perPage,
134+
},
135+
})
136+
.then((response) => {
137+
this.gettingChangelog = false;
138+
this.changelog = response.data.changelog;
139+
this.currentVersion = response.data.currentVersion;
140+
this.meta = response.data.meta;
141+
142+
if (this.page === 1 && response.data.changelog.length > 0) {
143+
this.latestRelease = response.data.changelog[0];
144+
}
145+
});
146+
},
147+
148+
setPage(page) {
149+
this.page = page;
150+
this.getChangelog();
151+
},
152+
153+
setPerPage(perPage) {
154+
this.perPage = perPage;
155+
this.page = 1;
156+
this.getChangelog();
122157
},
123158
},
124159
};

src/Http/Controllers/CP/Updater/UpdateProductController.php

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

55
use Facades\Statamic\Marketplace\Marketplace;
6+
use Illuminate\Http\Request;
67
use Inertia\Inertia;
78
use Statamic\Http\Controllers\CP\CpController;
89

@@ -33,7 +34,7 @@ public function show($marketplaceProductSlug)
3334
*
3435
* @param string $slug
3536
*/
36-
public function changelog($marketplaceProductSlug)
37+
public function changelog(Request $request, $marketplaceProductSlug)
3738
{
3839
$this->authorize('view updates');
3940

@@ -43,9 +44,15 @@ public function changelog($marketplaceProductSlug)
4344

4445
$changelog = $product->changelog();
4546

47+
$paginated = $changelog->paginate(
48+
$request->input('page', 1),
49+
$request->input('perPage', 10)
50+
);
51+
4652
return [
47-
'changelog' => $changelog->get(),
53+
'changelog' => $paginated['data'],
4854
'currentVersion' => $changelog->currentVersion(),
55+
'meta' => $paginated['meta'],
4956
];
5057
}
5158
}

src/Marketplace/Marketplace.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,23 @@ public function packages(array $packages)
2727
});
2828
}
2929

30-
public function releases($package)
30+
public function releases($package, $params = [])
3131
{
3232
$uri = "packages/$package/releases";
33+
$hash = md5(json_encode($params));
3334

34-
return Cache::rememberWithExpiration("marketplace-$uri", function () use ($uri) {
35-
$fallback = [5 => collect()];
35+
return Cache::rememberWithExpiration("marketplace-$uri-$hash", function () use ($uri, $params) {
36+
$fallback = [5 => ['data' => collect(), 'meta' => null]];
3637

3738
try {
38-
if (! $response = Client::get($uri)) {
39+
if (! $response = Client::get($uri, $params)) {
3940
return $fallback;
4041
}
4142

42-
return [60 => collect($response['data'])];
43+
return [60 => [
44+
'data' => collect($response['data']),
45+
'meta' => $response['meta'] ?? null,
46+
]];
4347
} catch (RequestException $e) {
4448
return $fallback;
4549
}

src/Updater/Changelog.php

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,46 @@ abstract public function item();
2727
* @return \Illuminate\Support\Collection
2828
*/
2929
public function get()
30+
{
31+
return $this->transformReleases(
32+
Marketplace::releases($this->item())['data']
33+
);
34+
}
35+
36+
/**
37+
* Get paginated changelog.
38+
*
39+
* @return array
40+
*/
41+
public function paginate($page = 1, $perPage = 10)
42+
{
43+
$response = Marketplace::releases($this->item(), [
44+
'page' => $page,
45+
'perPage' => $perPage,
46+
]);
47+
48+
return [
49+
'data' => $this->transformReleases($response['data'], $page),
50+
'meta' => $response['meta'],
51+
];
52+
}
53+
54+
/**
55+
* Transform releases into changelog format.
56+
*
57+
* @return \Illuminate\Support\Collection
58+
*/
59+
protected function transformReleases($releases, $page = 1)
3060
{
3161
$type = null;
3262

33-
return Marketplace::releases($this->item())->map(function ($release, $index) use (&$type) {
63+
return $releases->map(function ($release, $index) use (&$type, $page) {
3464
$type = $type === 'downgrade' ? $type : $this->parseReleaseType($release['version'], $index);
3565

3666
return (object) [
3767
'version' => $release['version'],
3868
'type' => $type,
39-
'latest' => $index === 0,
69+
'latest' => $page === 1 && $index === 0,
4070
'licensed' => $this->isLicensed($release['version']),
4171
'date' => Carbon::parse($release['date'])->toIso8601String(),
4272
'body' => $release['changelog'],

0 commit comments

Comments
 (0)