Skip to content

Commit bca7d1a

Browse files
authored
Merge pull request #5 from justbetter/feature/detour-pagination
Feature/detour pagination
2 parents 73436fb + 2f20222 commit bca7d1a

31 files changed

+512
-163
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ return [
5353
];
5454
```
5555

56+
Or set via environment variable:
57+
58+
```env
59+
STATAMIC_DETOUR_DRIVER=file
60+
```
61+
5662
#### Eloquent Driver
5763

5864
Store redirects in the database. This is recommended for larger sites with many redirects for better performance.
@@ -63,6 +69,12 @@ return [
6369
];
6470
```
6571

72+
Or set via environment variable:
73+
74+
```env
75+
STATAMIC_DETOUR_DRIVER=eloquent
76+
```
77+
6678
When using the Eloquent driver, run the migrations:
6779

6880
```bash

config/statamic-detour.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
return [
77

8-
'driver' => 'file',
8+
'driver' => env('STATAMIC_DETOUR_DRIVER', 'file'),
99

1010
'drivers' => [
1111
'file' => FileRepository::class,

resources/js/components/Detours.vue

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
<template>
22
<div>
3-
<publish-form :title="''" :action="action" :blueprint="blueprint" :meta="meta" :values="values"
4-
@saved="addItem($event)"></publish-form>
5-
6-
<table class="min-w-full border border-gray-200">
3+
<publish-form :title="''" :action="action" :blueprint="blueprint" :meta="meta" :values="values" @saved="addItem($event)"></publish-form>
4+
<table class="min-w-full border border-gray-200">
75
<thead class="bg-gray-50">
86
<tr>
97
<th class="px-4 py-3 text-left text-sm font-semibold text-gray-700">{{ __('From') }}</th>
@@ -15,7 +13,7 @@
1513
</tr>
1614
</thead>
1715
<tbody class="divide-y divide-gray-200">
18-
<tr class="hover:bg-gray-50 text-gray-900" v-for="item, id in detours" :key="id">
16+
<tr class="hover:bg-gray-50 text-gray-900" v-for="(item, id) in detours" :key="id">
1917
<td class="px-4 py-3 text-sm">{{ item.from }}</td>
2018
<td class="px-4 py-3 text-sm">{{ item.to }}</td>
2119
<td class="px-4 py-3 text-sm">{{ item.type }}</td>
@@ -62,7 +60,7 @@ export default ({
6260
methods: {
6361
deleteItem(id, type = 'delete') {
6462
if (type == 'delete') {
65-
delete this.detours[id];
63+
delete this.detours[id];
6664
}
6765
6866
this.$forceUpdate();
@@ -76,7 +74,7 @@ export default ({
7674
deleteDetour(id) {
7775
const url = cp_url('/detours/' + id);
7876
Statamic.$axios.delete(url).then(() => this.deleteItem(id));
79-
}
77+
},
8078
}
8179
})
82-
</script>
80+
</script>

resources/js/cp.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Detours from './components/Detours.vue';
22

33
Statamic.booting(() => {
4-
Statamic.$components.register('detours', Detours);
4+
Statamic.$components.register('Detours', Detours);
55
});
Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
@extends('statamic::layout')
22

33
@section('content')
4-
<detours
5-
action="{{ $action }}"
6-
:blueprint='@json($blueprint)'
7-
:meta='@json($meta)'
8-
:values='@json($values)'
9-
:items="@js($data)"
10-
/>
11-
@endsection
4+
<div>
5+
<Detours
6+
action="{{ $action }}"
7+
:blueprint='@json($blueprint)'
8+
:meta='@json($meta)'
9+
:values='@json($values)'
10+
:items='@json($data)'
11+
></Detours>
12+
<div class="mt-4">
13+
{{ $paginator->withQueryString()->links('pagination::simple-tailwind') }}
14+
</div>
15+
</div>
16+
@endsection

src/Actions/GenerateUrl.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace JustBetter\Detour\Actions;
4+
5+
use JustBetter\Detour\Contracts\GeneratesUrl;
6+
use JustBetter\Detour\Data\Detour;
7+
use JustBetter\Detour\Enums\Type;
8+
9+
class GenerateUrl implements GeneratesUrl
10+
{
11+
public function generate(Detour $detour, string $path): ?string
12+
{
13+
if ($detour->isType(Type::Regex)) {
14+
if (! str_contains($detour->to, '$')) {
15+
return $detour->to;
16+
}
17+
18+
return preg_replace($detour->from, $detour->to, $path);
19+
}
20+
21+
return $detour->to;
22+
}
23+
24+
public static function bind(): void
25+
{
26+
app()->singleton(GeneratesUrl::class, static::class);
27+
}
28+
}

src/Actions/HandleDetour.php

Lines changed: 0 additions & 67 deletions
This file was deleted.

src/Actions/ListDetours.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use JustBetter\Detour\Contracts\ListsDetours;
66
use JustBetter\Detour\Contracts\ResolvesRepository;
7+
use JustBetter\Detour\Data\Paginate;
78
use Statamic\Fields\Blueprint;
89

910
class ListDetours implements ListsDetours
@@ -12,18 +13,21 @@ public function __construct(
1213
protected ResolvesRepository $resolvesRepository
1314
) {}
1415

15-
public function list(): array
16+
public function list(int $size, int $page): array
1617
{
1718
$repository = $this->resolvesRepository->resolve();
1819

1920
// @phpstan-ignore-next-line
2021
$oldDirectory = Blueprint::directory();
21-
$values = $repository->get();
22+
23+
$paginate = Paginate::make(['size' => $size, 'page' => $page])->validate();
24+
25+
$paginator = $repository->paginate($paginate);
2226

2327
// @phpstan-ignore-next-line
2428
$blueprint = Blueprint::setDirectories(__DIR__.'/../../resources/blueprints')->find('detour');
2529
$fields = $blueprint->fields();
26-
$fields = $fields->addValues($values);
30+
$fields = $fields->addValues($paginator->items());
2731
$fields = $fields->preProcess();
2832

2933
if ($oldDirectory) {
@@ -35,8 +39,9 @@ public function list(): array
3539
'blueprint' => $blueprint->toPublishArray(),
3640
'values' => $fields->values(),
3741
'meta' => $fields->meta(),
38-
'data' => $values,
42+
'data' => $paginator->items(),
3943
'action' => cp_route('justbetter.detours.store'),
44+
'paginator' => $paginator,
4045
];
4146
}
4247

src/Actions/MatchDetour.php

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace JustBetter\Detour\Actions;
4+
5+
use JustBetter\Detour\Contracts\MatchesDetour;
6+
use JustBetter\Detour\Contracts\ResolvesRepository;
7+
use JustBetter\Detour\Data\Detour;
8+
use Statamic\Facades\Site as SiteFacade;
9+
use Statamic\Sites\Site;
10+
11+
class MatchDetour implements MatchesDetour
12+
{
13+
public function __construct(protected ResolvesRepository $resolver) {}
14+
15+
public function match(string $path): ?Detour
16+
{
17+
$repository = $this->resolver->resolve();
18+
19+
/** @var Site $site */
20+
$site = SiteFacade::current();
21+
22+
$detours = $repository->get();
23+
24+
foreach ($detours as $detour) {
25+
if ($detour->matches($site->handle(), $path)) {
26+
return $detour;
27+
}
28+
}
29+
30+
return null;
31+
}
32+
33+
public static function bind(): void
34+
{
35+
app()->singleton(MatchesDetour::class, static::class);
36+
}
37+
}

src/Contracts/GeneratesUrl.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace JustBetter\Detour\Contracts;
4+
5+
use JustBetter\Detour\Data\Detour;
6+
7+
interface GeneratesUrl
8+
{
9+
public function generate(Detour $detour, string $path): ?string;
10+
}

0 commit comments

Comments
 (0)