Skip to content

Commit 34fa82f

Browse files
authored
Merge pull request #16 from shevelev-anatoliy/master
MoonShine v3.x support
2 parents 84fa662 + fc7e3d2 commit 34fa82f

4 files changed

+179
-19
lines changed

src/Commands/MoonShineCommand.php

+22-7
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,38 @@
55
namespace Leeto\Seo\Commands;
66

77
use Illuminate\Console\Command;
8-
use MoonShine\MoonShine;
98

109
final class MoonShineCommand extends Command
1110
{
1211
protected $signature = 'seo:moonshine';
1312

1413
public function handle(): int
1514
{
16-
$stub = 'moonshine_seo_resource.stub';
15+
$version = $this->choice(
16+
'Choose MoonShine version (default v3)',
17+
[
18+
1 => 'v1',
19+
2 => 'v2',
20+
3 => 'v3',
21+
],
22+
'v3'
23+
);
24+
25+
$stub = "moonshine_seo_resource_{$version}.stub";
26+
27+
if ($version === 'v3') {
28+
/** @var \MoonShine\Contracts\Core\DependencyInjection\ConfiguratorContract $config */
29+
$config = app(\MoonShine\Contracts\Core\DependencyInjection\ConfiguratorContract::class);
1730

18-
if($this->confirm('MoonShine v2?')) {
19-
$stub = 'moonshine_seo_resource_v2.stub';
31+
$resource = $config->getDir() . '/Resources/SeoResource.php';
32+
$namespace = $config->getNamespace('\Resources');
33+
} else {
34+
$resource = \MoonShine\MoonShine::dir() . '/Resources/SeoResource.php';
35+
$namespace = \MoonShine\MoonShine::namespace('\Resources');
2036
}
2137

22-
$resource = MoonShine::dir('/Resources/SeoResource.php');
23-
$contents = $this->laravel['files']->get(__DIR__ . '/../../stubs/' . $stub);
24-
$contents = str_replace('{namespace}', MoonShine::namespace('\Resources'), $contents);
38+
$contents = $this->laravel['files']->get(__DIR__ . "/../../stubs/{$stub}");
39+
$contents = str_replace('{namespace}', $namespace, $contents);
2540

2641
$this->laravel['files']->put(
2742
$resource,

stubs/moonshine_seo_resource.stub stubs/moonshine_seo_resource_v1.stub

+6-6
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@ namespace {namespace};
77
use Illuminate\Database\Eloquent\Model;
88

99
use Illuminate\Validation\Rule;
10+
use Leeto\Seo\Models\Seo;
11+
use Leeto\Seo\Rules\UrlRule;
1012
use MoonShine\Actions\ExportAction;
13+
use MoonShine\Actions\FiltersAction;
1114
use MoonShine\Actions\ImportAction;
15+
use MoonShine\Decorations\Block;
16+
use MoonShine\Fields\ID;
1217
use MoonShine\Fields\Text;
1318
use MoonShine\Fields\TinyMce;
1419
use MoonShine\Filters\TextFilter;
15-
use MoonShine\Resources\Resource;
16-
use MoonShine\Fields\ID;
17-
use MoonShine\Decorations\Block;
18-
use MoonShine\Actions\FiltersAction;
19-
use Leeto\Seo\Rules\UrlRule;
20-
use Leeto\Seo\Models\Seo;
2120
use MoonShine\ItemActions\ItemAction;
21+
use MoonShine\Resources\Resource;
2222

2323
class SeoResource extends Resource
2424
{

stubs/moonshine_seo_resource_v2.stub

+5-6
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@ declare(strict_types=1);
55
namespace {namespace};
66

77
use Illuminate\Database\Eloquent\Model;
8-
98
use Illuminate\Validation\Rule;
9+
use Leeto\Seo\Models\Seo;
10+
use Leeto\Seo\Rules\UrlRule;
11+
use MoonShine\ActionButtons\ActionButton;
12+
use MoonShine\Decorations\Block;
13+
use MoonShine\Fields\ID;
1014
use MoonShine\Fields\Text;
1115
use MoonShine\Fields\TinyMce;
1216
use MoonShine\Resources\ModelResource;
13-
use MoonShine\Fields\ID;
14-
use MoonShine\ActionButtons\ActionButton;
15-
use MoonShine\Decorations\Block;
16-
use Leeto\Seo\Rules\UrlRule;
17-
use Leeto\Seo\Models\Seo;
1817

1918
class SeoResource extends ModelResource
2019
{

stubs/moonshine_seo_resource_v3.stub

+146
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace {namespace};
6+
7+
use Illuminate\Validation\Rule;
8+
use Leeto\Seo\Models\Seo;
9+
use Leeto\Seo\Rules\UrlRule;
10+
use MoonShine\ImportExport\Contracts\HasImportExportContract;
11+
use MoonShine\ImportExport\ExportHandler;
12+
use MoonShine\ImportExport\ImportHandler;
13+
use MoonShine\ImportExport\Traits\ImportExportConcern;
14+
use MoonShine\Laravel\Handlers\Handler;
15+
use MoonShine\Laravel\Resources\ModelResource;
16+
use MoonShine\Support\Enums\PageType;
17+
use MoonShine\Support\ListOf;
18+
use MoonShine\TinyMce\Fields\TinyMce;
19+
use MoonShine\UI\Components\ActionButton;
20+
use MoonShine\UI\Components\Layout\Box;
21+
use MoonShine\UI\Fields\ID;
22+
use MoonShine\UI\Fields\Text;
23+
24+
class SeoResource extends ModelResource implements HasImportExportContract
25+
{
26+
use ImportExportConcern;
27+
28+
protected string $model = Seo::class;
29+
30+
protected string $title = 'Seo';
31+
32+
protected string $column = 'title';
33+
34+
protected bool $detailInModal = true;
35+
36+
protected ?PageType $redirectAfterSave = PageType::INDEX;
37+
38+
protected function formFields(): iterable
39+
{
40+
return [
41+
Box::make([
42+
ID::make(),
43+
Text::make('Url')
44+
->required(),
45+
Text::make('Title')
46+
->required(),
47+
Text::make('Description'),
48+
Text::make('Keywords'),
49+
TinyMce::make('Text'),
50+
])
51+
];
52+
}
53+
54+
protected function indexFields(): iterable
55+
{
56+
return [
57+
ID::make()
58+
->sortable(),
59+
Text::make('Url'),
60+
Text::make('Title'),
61+
Text::make('Description'),
62+
Text::make('Keywords'),
63+
];
64+
}
65+
66+
protected function detailFields(): iterable
67+
{
68+
return [
69+
ID::make(),
70+
Text::make('Url'),
71+
Text::make('Title'),
72+
Text::make('Description'),
73+
Text::make('Keywords'),
74+
TinyMce::make('Text')
75+
];
76+
}
77+
78+
protected function exportFields(): iterable
79+
{
80+
return [
81+
ID::make(),
82+
Text::make('Url'),
83+
Text::make('Title'),
84+
Text::make('Description'),
85+
Text::make('Keywords'),
86+
];
87+
}
88+
89+
protected function importFields(): iterable
90+
{
91+
return $this->exportFields();
92+
}
93+
94+
protected function rules($item): array
95+
{
96+
return [
97+
'title' => [
98+
'required',
99+
'string',
100+
'min:3'
101+
],
102+
'url' => [
103+
'required',
104+
'string',
105+
new UrlRule,
106+
Rule::unique('seo')->ignoreModel($item)
107+
]
108+
];
109+
}
110+
111+
public function search(): array
112+
{
113+
return ['id', 'url', 'title'];
114+
}
115+
116+
public function filters(): array
117+
{
118+
return [
119+
Text::make('Url'),
120+
Text::make('Title'),
121+
];
122+
}
123+
124+
public function import(): ?Handler
125+
{
126+
return ImportHandler::make('Импорт')
127+
->notifyUsers(fn() => [auth()->id()]);
128+
}
129+
130+
public function export(): ?Handler
131+
{
132+
return ExportHandler::make('Экспорт')
133+
->filename('seo_resource_export__' . date('Ymd-His'))
134+
->dir('export_files')
135+
->notifyUsers(fn() => [auth()->id()]);
136+
}
137+
138+
public function indexButtons(): ListOf
139+
{
140+
return parent::indexButtons()->add(
141+
ActionButton::make('На страницу', static fn (Seo $item) => $item->url)
142+
->icon('arrow-top-right-on-square')
143+
->blank()
144+
);
145+
}
146+
}

0 commit comments

Comments
 (0)