Skip to content

Commit 1deb402

Browse files
fix tag translation
1 parent 58983d9 commit 1deb402

File tree

4 files changed

+138
-77
lines changed

4 files changed

+138
-77
lines changed

packages/tag/src/Resources/TagResource.php

Lines changed: 30 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use Moox\Tag\Resources\TagResource\Pages\ListTags;
3535
use Moox\Tag\Resources\TagResource\Pages\ViewTag;
3636
use Override;
37+
use Illuminate\Validation\Rules\Unique;
3738

3839
class TagResource extends Resource
3940
{
@@ -71,71 +72,28 @@ public static function form(Form $form): Form
7172
->live(onBlur: true)
7273
->label(__('core::core.title'))
7374
->required()
74-
->afterStateHydrated(function (TextInput $component) {
75-
$lang = request()->get('lang');
76-
if ($lang && $component->getRecord()->hasTranslation($lang)) {
77-
$component->state($component->getRecord()->translateOrNew($lang)->title);
78-
} else {
79-
$component->state($component->getRecord()->title ?? '');
80-
}
81-
})
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-
87-
return $state;
88-
}
89-
90-
$record->translateOrNew($livewire->selectedLang)->title = $state;
91-
92-
return $state;
93-
}),
75+
->afterStateUpdated(fn (Set $set, ?string $state) =>
76+
$set('slug', Str::slug($state))
77+
),
9478
TextInput::make('slug')
9579
->label(__('core::core.slug'))
9680
->required()
97-
->afterStateHydrated(function (TextInput $component) {
98-
$lang = request()->get('lang');
99-
if ($lang && $component->getRecord()->hasTranslation($lang)) {
100-
$component->state($component->getRecord()->translateOrNew($lang)->slug);
101-
} else {
102-
$component->state($component->getRecord()->slug ?? '');
103-
}
104-
})
105-
->dehydrateStateUsing(function (string $state, $record, $livewire) {
106-
if (! $livewire->selectedLang) {
107-
$record->slug = $state;
108-
109-
return $state;
110-
}
111-
112-
$record->translateOrNew($livewire->selectedLang)->slug = $state;
113-
114-
return $state;
115-
}),
81+
->unique(
82+
modifyRuleUsing: function (Unique $rule) {
83+
return $rule
84+
->where('locale', request()->query('lang', app()->getLocale()))
85+
->whereNull('tag_translations.tag_id');
86+
},
87+
table: 'tag_translations',
88+
column: 'slug',
89+
ignoreRecord: true,
90+
ignorable: fn ($record) => $record?->translations()
91+
->where('locale', request()->query('lang', app()->getLocale()))
92+
->first()
93+
),
11694
MarkdownEditor::make('content')
11795
->label(__('core::core.content'))
118-
->required()
119-
->afterStateHydrated(function (MarkdownEditor $component) {
120-
$lang = request()->get('lang');
121-
if ($lang && $component->getRecord()->hasTranslation($lang)) {
122-
$component->state($component->getRecord()->translateOrNew($lang)->content);
123-
} else {
124-
$component->state($component->getRecord()->content ?? '');
125-
}
126-
})
127-
->dehydrateStateUsing(function (string $state, $record, $livewire) {
128-
if (! $livewire->selectedLang) {
129-
$record->content = $state;
130-
131-
return $state;
132-
}
133-
134-
$record->translateOrNew($livewire->selectedLang)->content = $state;
135-
136-
return $state;
137-
}),
138-
96+
->required(),
13997
]),
14098
])
14199
->columnSpan(['lg' => 2]),
@@ -181,7 +139,7 @@ public static function form(Form $form): Form
181139
->color('primary')
182140
->button()
183141
->extraAttributes(['class' => 'w-full'])
184-
->url(fn ($record): string => static::getUrl('edit', ['record' => $record]))
142+
->url(fn ($record): string => static::getUrl('edit', ['record' => $record, 'lang' => request()->get('lang')]))
185143
->visible(fn ($livewire, $record): bool => $livewire instanceof ViewTag && ! $record->trashed()),
186144
Action::make('restore')
187145
->label(__('core::core.restore'))
@@ -233,6 +191,7 @@ public static function table(Table $table): Table
233191
->label(__('core::core.image'))
234192
->defaultImageUrl(url('/moox/core/assets/noimage.svg'))
235193
->alignment('center'),
194+
TextColumn::make('translations.locale'),
236195
TextColumn::make('title')
237196
->label(__('core::core.title'))
238197
->searchable()
@@ -255,10 +214,10 @@ public static function table(Table $table): Table
255214
->state(function ($record) {
256215
$lang = request()->get('lang');
257216
if ($lang && $record->hasTranslation($lang)) {
258-
return $record->translate($lang)->title;
217+
return $record->translate($lang)->slug;
259218
}
260219

261-
return $record->title;
220+
return $record->slug;
262221
}),
263222
TextColumn::make('content')
264223
->label(__('core::core.content'))
@@ -269,10 +228,9 @@ public static function table(Table $table): Table
269228
->state(function ($record) {
270229
$lang = request()->get('lang');
271230
if ($lang && $record->hasTranslation($lang)) {
272-
return $record->translate($lang)->title;
231+
return $record->translate($lang)->content;
273232
}
274-
275-
return $record->title;
233+
return $record->content;
276234
}),
277235
TextColumn::make('count')
278236
->label(__('core::core.count'))
@@ -288,16 +246,14 @@ public static function table(Table $table): Table
288246
->toggleable(),
289247
])
290248
->actions([
291-
ViewAction::make()->url(
292-
fn ($record) => request()->has('lang')
293-
? route('filament.admin.resources.tags.view', ['record' => $record, 'lang' => request()->get('lang')])
294-
: route('filament.admin.resources.tags.view', $record)
249+
ViewAction::make()->url(fn ($record) => request()->has('lang')
250+
? static::getUrl('view', ['record' => $record, 'lang' => request()->get('lang')])
251+
: static::getUrl('view', ['record' => $record])
295252
),
296253
EditAction::make()
297-
->url(
298-
fn ($record) => request()->has('lang')
299-
? route('filament.admin.resources.tags.edit', ['record' => $record, 'lang' => request()->get('lang')])
300-
: route('filament.admin.resources.tags.edit', $record)
254+
->url(fn ($record) => request()->has('lang')
255+
? static::getUrl('edit', ['record' => $record, 'lang' => request()->get('lang')])
256+
: static::getUrl('edit', ['record' => $record])
301257
)
302258
->hidden(fn (): bool => in_array(static::getCurrentTab(), ['trash', 'deleted'])),
303259
])

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

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,57 @@
77
use Filament\Resources\Pages\CreateRecord;
88
use Moox\Tag\Resources\TagResource;
99
use Override;
10+
use Illuminate\Database\Eloquent\Model;
1011

1112
class CreateTag extends CreateRecord
1213
{
1314
protected static string $resource = TagResource::class;
1415

16+
public ?string $selectedLang = null;
17+
18+
#[Override]
19+
public function mount(): void
20+
{
21+
$this->selectedLang = request()->query('lang');
22+
parent::mount();
23+
}
24+
25+
#[Override]
26+
protected function handleRecordCreation(array $data): Model
27+
{
28+
$model = static::getModel();
29+
// Create new record instance
30+
$record = new $model();
31+
32+
// Get translatable attributes
33+
$translatableAttributes = ['title', 'slug', 'content'];
34+
$translationData = array_intersect_key($data, array_flip($translatableAttributes));
35+
$nonTranslatableData = array_diff_key($data, array_flip($translatableAttributes));
36+
37+
// Fill non-translatable data
38+
$record->fill($nonTranslatableData);
39+
$record->save();
40+
// Handle translations
41+
if ($this->selectedLang) {
42+
$record->translateOrNew($this->selectedLang)->fill($translationData);
43+
} else {
44+
$record->translateOrNew(app()->getLocale())->fill($translationData);
45+
}
46+
47+
$record->save();
48+
49+
return $record;
50+
}
51+
52+
#[Override]
53+
protected function getRedirectUrl(): string
54+
{
55+
return $this->getResource()::getUrl('index', ['lang' => $this->selectedLang]);
56+
}
57+
1558
#[Override]
1659
protected function getFormActions(): array
1760
{
1861
return [];
1962
}
20-
}
63+
}

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

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,62 @@
77
use Filament\Resources\Pages\EditRecord;
88
use Moox\Tag\Resources\TagResource;
99
use Override;
10+
use Illuminate\Database\Eloquent\Model;
1011

1112
class EditTag extends EditRecord
1213
{
1314
protected static string $resource = TagResource::class;
1415

1516
public ?string $selectedLang = null;
1617

18+
#[Override]
1719
public function mount($record): void
1820
{
21+
$this->selectedLang = request()->query('lang');
1922
parent::mount($record);
20-
$this->selectedLang = request()->get('lang');
23+
}
24+
25+
protected function mutateFormDataBeforeFill(array $data): array
26+
{
27+
if ($this->selectedLang && $this->record->hasTranslation($this->selectedLang)) {
28+
$translation = $this->record->translate($this->selectedLang);
29+
return array_merge($data, [
30+
'title' => $translation->title,
31+
'slug' => $translation->slug,
32+
'content' => $translation->content,
33+
]);
34+
}
35+
36+
return $data;
37+
}
38+
39+
#[Override]
40+
protected function handleRecordUpdate(Model $record, array $data): Model
41+
{
42+
// Get translatable attributes
43+
$translatableAttributes = ['title', 'slug', 'content'];
44+
$translationData = array_intersect_key($data, array_flip($translatableAttributes));
45+
$nonTranslatableData = array_diff_key($data, array_flip($translatableAttributes));
46+
47+
// Update non-translatable data
48+
$record->fill($nonTranslatableData);
49+
50+
// Handle translations
51+
if ($this->selectedLang) {
52+
$record->translateOrNew($this->selectedLang)->fill($translationData);
53+
} else {
54+
$record->translateOrNew(app()->getLocale())->fill($translationData);
55+
}
56+
57+
$record->save();
58+
59+
return $record;
60+
}
61+
62+
#[Override]
63+
protected function getRedirectUrl(): string
64+
{
65+
return $this->getResource()::getUrl('index', ['lang' => $this->selectedLang]);
2166
}
2267

2368
protected function getHeaderActions(): array

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

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,28 @@ class ViewTag extends ViewRecord
1717

1818
public ?string $selectedLang = null;
1919

20+
#[Override]
2021
public function mount($record): void
2122
{
23+
$this->selectedLang = request()->query('lang');
2224
parent::mount($record);
23-
$this->selectedLang = request()->get('lang');
2425
}
2526

27+
protected function mutateFormDataBeforeFill(array $data): array
28+
{
29+
if ($this->selectedLang && $this->record->hasTranslation($this->selectedLang)) {
30+
$translation = $this->record->translate($this->selectedLang);
31+
return array_merge($data, [
32+
'title' => $translation->title,
33+
'slug' => $translation->slug,
34+
'content' => $translation->content,
35+
]);
36+
}
37+
38+
return $data;
39+
}
40+
41+
#[Override]
2642
protected function getHeaderActions(): array
2743
{
2844
return [
@@ -46,4 +62,5 @@ private function isRecordTrashed(): bool
4662
{
4763
return $this->record instanceof Model && method_exists($this->record, 'trashed') && $this->record->trashed();
4864
}
65+
4966
}

0 commit comments

Comments
 (0)