Skip to content

Commit 4c93702

Browse files
feat. Tag translatable
1 parent 7210ba1 commit 4c93702

File tree

8 files changed

+86
-222
lines changed

8 files changed

+86
-222
lines changed

packages/tag/src/Resources/TagResource.php

Lines changed: 70 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,37 @@
44

55
namespace Moox\Tag\Resources;
66

7-
use Camya\Filament\Forms\Components\TitleWithSlugInput;
8-
use Filament\Forms\Components\Actions;
9-
use Filament\Forms\Components\Actions\Action;
10-
use Filament\Forms\Components\ColorPicker;
11-
use Filament\Forms\Components\DateTimePicker;
12-
use Filament\Forms\Components\FileUpload;
13-
use Filament\Forms\Components\Grid;
14-
use Filament\Forms\Components\MarkdownEditor;
15-
use Filament\Forms\Components\Section;
16-
use Filament\Forms\Components\TextInput;
7+
use Override;
8+
use Filament\Forms\Set;
179
use Filament\Forms\Form;
10+
use Moox\Tag\Models\Tag;
11+
use Filament\Tables\Table;
12+
use Illuminate\Support\Str;
1813
use Filament\Resources\Resource;
19-
use Filament\Tables\Actions\DeleteBulkAction;
14+
use Filament\Forms\Components\Grid;
15+
use Filament\Forms\Components\Actions;
16+
use Filament\Forms\Components\Section;
2017
use Filament\Tables\Actions\EditAction;
21-
use Filament\Tables\Actions\RestoreBulkAction;
2218
use Filament\Tables\Actions\ViewAction;
19+
use Filament\Tables\Columns\TextColumn;
20+
use Filament\Forms\Components\TextInput;
2321
use Filament\Tables\Columns\ColorColumn;
2422
use Filament\Tables\Columns\ImageColumn;
25-
use Filament\Tables\Columns\TextColumn;
26-
use Filament\Tables\Table;
23+
use Filament\Forms\Components\FileUpload;
2724
use Illuminate\Database\Eloquent\Builder;
28-
use Illuminate\Database\Eloquent\SoftDeletes;
2925
use Moox\Core\Traits\Tabs\TabsInResource;
30-
use Moox\Tag\Models\Tag;
31-
use Moox\Tag\Resources\TagResource\Pages\CreateTag;
26+
use Filament\Forms\Components\ColorPicker;
27+
use Filament\Forms\Components\Actions\Action;
28+
use Filament\Forms\Components\DateTimePicker;
29+
use Filament\Forms\Components\MarkdownEditor;
30+
use Filament\Tables\Actions\DeleteBulkAction;
31+
use Illuminate\Database\Eloquent\SoftDeletes;
32+
use Filament\Tables\Actions\RestoreBulkAction;
3233
use Moox\Tag\Resources\TagResource\Pages\EditTag;
33-
use Moox\Tag\Resources\TagResource\Pages\ListTags;
3434
use Moox\Tag\Resources\TagResource\Pages\ViewTag;
35-
use Override;
35+
use Moox\Tag\Resources\TagResource\Pages\ListTags;
36+
use Moox\Tag\Resources\TagResource\Pages\CreateTag;
37+
use Camya\Filament\Forms\Components\TitleWithSlugInput;
3638

3739
class TagResource extends Resource
3840
{
@@ -64,48 +66,72 @@ public static function form(Form $form): Form
6466
->schema([
6567
Section::make()
6668
->schema([
67-
TitleWithSlugInput::make(
68-
fieldTitle: 'title',
69-
fieldSlug: 'slug',
70-
)
71-
->afterStateHydrated(function ($component) {
69+
70+
TextInput::make('title')
71+
->live(onBlur: true)
72+
->label(__('core::core.title'))
73+
->required()
74+
->afterStateHydrated(function (TextInput $component) {
7275
$lang = request()->get('lang');
73-
if ($lang && $component->getRecord()) {
74-
$component->state([
75-
'title' => $component->getRecord()->getTranslation('title', $lang),
76-
'slug' => $component->getRecord()->getTranslation('slug', $lang),
77-
]);
76+
if ($lang && $component->getRecord()->hasTranslation($lang)) {
77+
$component->state($component->getRecord()->translateOrNew($lang)->title);
78+
} else {
79+
$component->state($component->getRecord()->title ?? '');
7880
}
7981
})
80-
->afterStateHydrated(function ($component) {
82+
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
83+
->dehydrateStateUsing(function (string $state, $record, $livewire) {
84+
if (!$livewire->selectedLang) {
85+
$record->title = $state;
86+
return $state;
87+
}
88+
89+
$record->translateOrNew($livewire->selectedLang)->title = $state;
90+
return $state;
91+
}),
92+
TextInput::make('slug')
93+
->label(__('core::core.slug'))
94+
->required()
95+
->afterStateHydrated(function (TextInput $component) {
8196
$lang = request()->get('lang');
82-
if ($lang && $component->getRecord()) {
83-
$component->state([
84-
'title' => $component->getRecord()->getTranslation('title', $lang),
85-
'slug' => $component->getRecord()->getTranslation('slug', $lang),
86-
]);
97+
if ($lang && $component->getRecord()->hasTranslation($lang)) {
98+
$component->state($component->getRecord()->translateOrNew($lang)->slug);
99+
} else {
100+
$component->state($component->getRecord()->slug ?? '');
87101
}
88102
})
89-
->dehydrateStateUsing(function ($state) {
90-
$lang = request()->get('lang');
91-
92-
return [
93-
'title' => [$lang => $state['title']],
94-
'slug' => [$lang => $state['slug']],
95-
];
103+
->dehydrateStateUsing(function (string $state, $record, $livewire) {
104+
if (!$livewire->selectedLang) {
105+
$record->slug = $state;
106+
return $state;
107+
}
108+
109+
$record->translateOrNew($livewire->selectedLang)->slug = $state;
110+
return $state;
96111
}),
97112
FileUpload::make('featured_image_url')
98113
->label(__('core::core.featured_image_url')),
99114
MarkdownEditor::make('content')
100115
->label(__('core::core.content'))
116+
->required()
101117
->afterStateHydrated(function (MarkdownEditor $component) {
102118
$lang = request()->get('lang');
103119
if ($lang && $component->getRecord()->hasTranslation($lang)) {
104-
$component->state($component->getRecord()->translate($lang)->content);
120+
$component->state($component->getRecord()->translateOrNew($lang)->content);
105121
} else {
106-
$component->state($component->getRecord()->translate($lang)->content);
122+
$component->state($component->getRecord()->content ?? '');
107123
}
124+
})
125+
->dehydrateStateUsing(function (string $state, $record, $livewire) {
126+
if (!$livewire->selectedLang) {
127+
$record->content = $state;
128+
return $state;
129+
}
130+
131+
$record->translateOrNew($livewire->selectedLang)->content = $state;
132+
return $state;
108133
}),
134+
109135
]),
110136
])
111137
->columnSpan(['lg' => 2]),

packages/tag/src/Resources/TagResource/Pages/EditTag.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@ class EditTag extends EditRecord
1212
{
1313
protected static string $resource = TagResource::class;
1414

15+
public ?string $selectedLang = null;
16+
17+
public function mount($record): void
18+
{
19+
parent::mount($record);
20+
$this->selectedLang = request()->get('lang');
21+
}
22+
1523
protected function getHeaderActions(): array
1624
{
1725
return [

packages/tag/src/Resources/TagResource/Pages/ViewTag.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ class ViewTag extends ViewRecord
1515
{
1616
protected static string $resource = TagResource::class;
1717

18+
public ?string $selectedLang = null;
19+
20+
public function mount($record): void
21+
{
22+
parent::mount($record);
23+
$this->selectedLang = request()->get('lang');
24+
}
25+
1826
protected function getHeaderActions(): array
1927
{
2028
return [

packages/tag/src/Resources/TagTranslationResource.php

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

packages/tag/src/Resources/TagTranslationResource/Pages/CreateTagTranslation.php

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

packages/tag/src/Resources/TagTranslationResource/Pages/EditTagTranslation.php

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

packages/tag/src/Resources/TagTranslationResource/Pages/ListTagTranslations.php

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

packages/tag/src/TagTranslationPlugin.php

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

0 commit comments

Comments
 (0)