Skip to content

Commit ca641e9

Browse files
committed
Feature/translations (#764)
1 parent e1ecc73 commit ca641e9

File tree

6 files changed

+159
-13
lines changed

6 files changed

+159
-13
lines changed

src/Entities/BaseResource.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,12 @@ public static function getPublishAction(): Action
134134
->keyBindings(['command+p', 'ctrl+p'])
135135
->color('secondary')
136136
->action(function ($livewire): void {
137-
// $livewire instanceof CreateRecord ? $livewire->create() : $livewire->save();
138-
$livewire->redirect(static::getUrl('view', ['record' => $livewire->record]));
139-
});
140-
// ->visible(fn ($livewire): bool => $livewire instanceof CreateRecord || $livewire instanceof EditRecord);
137+
$livewire->data['status'] = 'published';
138+
$livewire->data['published_at'] = now();
139+
$livewire->save();
140+
$livewire->redirect(static::getUrl('view', ['record' => $livewire->record, 'lang' => $livewire->lang]));
141+
})
142+
->visible(fn ($livewire): bool => $livewire instanceof CreateRecord || $livewire instanceof EditRecord);
141143
}
142144

143145
public static function getSaveAndCreateAnotherAction(): Action
@@ -148,7 +150,7 @@ public static function getSaveAndCreateAnotherAction(): Action
148150
->button()
149151
->action(function ($livewire): void {
150152
$livewire instanceof CreateRecord ? $livewire->create() : $livewire->save();
151-
$livewire->redirect(static::getUrl('create'));
153+
$livewire->redirect(static::getUrl('create', ['lang' => $livewire->lang]));
152154
})
153155
->visible(fn ($livewire): bool => $livewire instanceof CreateRecord);
154156
}
@@ -160,7 +162,7 @@ public static function getCancelAction(): Action
160162
->keyBindings(['escape'])
161163
->color('secondary')
162164
->outlined()
163-
->url(fn () => static::getUrl('index'));
165+
->url(fn () => static::getUrl('index', ['lang' => request()->query('lang')]));
164166
// ->visible(fn ($livewire): bool => $livewire instanceof CreateRecord);
165167
}
166168

@@ -173,7 +175,7 @@ public static function getDeleteAction(): Action
173175
->extraAttributes(attributes: ['class' => 'w-full'])
174176
->action(function ($livewire): void {
175177
$livewire->record->delete();
176-
$livewire->redirect(static::getUrl('index'));
178+
$livewire->redirect(static::getUrl('index', ['lang' => request()->query('lang')]));
177179
})
178180
->keyBindings(['delete'])
179181
->visible(fn ($livewire): bool => $livewire instanceof EditRecord)
@@ -187,7 +189,7 @@ public static function getEditAction(): Action
187189
->color('primary')
188190
->extraAttributes(attributes: ['class' => 'w-full'])
189191
->keyBindings(['command+e', 'ctrl+e'])
190-
->url(fn ($record) => static::getUrl('edit', ['record' => $record]))
192+
->url(fn ($record, $livewire) => static::getUrl('edit', ['record' => $record, 'lang' => $livewire->lang]))
191193
->visible(fn ($livewire): bool => $livewire instanceof ViewRecord);
192194
}
193195

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
namespace Moox\Core\Entities\Items\Draft;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Database\Eloquent\SoftDeletes;
7+
use Illuminate\Database\Eloquent\Relations\MorphTo;
8+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
9+
use Astrotomic\Translatable\Contracts\Translatable as TranslatableContract;
10+
use Astrotomic\Translatable\Translatable;
11+
12+
abstract class BaseDraftTranslationModel extends Model
13+
{
14+
use SoftDeletes;
15+
16+
public function getCasts(): array
17+
{
18+
return array_merge(parent::getCasts(), [
19+
'to_publish_at' => 'datetime',
20+
'published_at' => 'datetime',
21+
'to_unpublish_at' => 'datetime',
22+
'unpublished_at' => 'datetime',
23+
'restored_at' => 'datetime'
24+
], $this->getCustomCasts());
25+
}
26+
27+
/**
28+
* Get custom casts for child models to extend.
29+
*/
30+
protected function getCustomCasts(): array
31+
{
32+
return [];
33+
}
34+
35+
public function publishedBy(): MorphTo
36+
{
37+
return $this->morphTo();
38+
}
39+
40+
public function unpublishedBy(): MorphTo
41+
{
42+
return $this->morphTo();
43+
}
44+
45+
public function deletedBy(): MorphTo
46+
{
47+
return $this->morphTo();
48+
}
49+
50+
public function restoredBy(): MorphTo
51+
{
52+
return $this->morphTo();
53+
}
54+
55+
public static function getResourceName(): string
56+
{
57+
$className = class_basename(static::class);
58+
59+
return strtolower($className);
60+
}
61+
}

src/Entities/Items/Draft/Pages/BaseCreateDraft.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,26 @@ protected function resolveRecord($key): Model
8484

8585
return $query->find($key) ?? $model::make();
8686
}
87+
88+
public function getHeaderActions(): array
89+
{
90+
$languages = \Moox\Localization\Models\Localization::all();
91+
92+
return [
93+
\Filament\Actions\ActionGroup::make(
94+
$languages->map(fn ($localization) => \Filament\Actions\Action::make('language_'.$localization->language->alpha2)
95+
->icon('flag-'.$localization->language->alpha2)
96+
->label('')
97+
->color('transparent')
98+
->extraAttributes(['class' => 'bg-transparent hover:bg-transparent flex items-center gap-1'])
99+
->url(fn () => $this->getResource()::getUrl('create', ['lang' => $localization->language->alpha2]))
100+
)
101+
->toArray()
102+
)
103+
->color('transparent')
104+
->label('Language')
105+
->icon('flag-'.$this->lang)
106+
->extraAttributes(['class' => '']),
107+
];
108+
}
87109
}

src/Entities/Items/Draft/Pages/BaseEditDraft.php

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
use Illuminate\Database\Eloquent\Model;
88
use Moox\Core\Traits\CanResolveResourceClass;
99

10+
/**
11+
* @phpstan-type TranslatableModel = Model&TranslatableContract
12+
*
13+
* @phpstan-property-read array<string> $translatedAttributes
14+
*/
1015
abstract class BaseEditDraft extends EditRecord
1116
{
1217
use CanResolveResourceClass;
@@ -27,19 +32,25 @@ public function mount($record): void
2732
public function mutateFormDataBeforeFill(array $data): array
2833
{
2934
$record = $this->getRecord();
35+
36+
if (! method_exists($record, 'getTranslation') || ! property_exists($record, 'translatedAttributes')) {
37+
return $data;
38+
}
39+
3040
$translatable = $record->translatedAttributes;
3141
$values = [];
3242
foreach ($translatable as $attr) {
33-
$values[$attr] = $record->$attr;
43+
$translation = $record->getTranslation($this->lang, false);
44+
$values[$attr] = $translation ? $translation->$attr : $record->$attr;
3445
}
35-
46+
3647
return $values;
3748
}
3849

3950
protected function handleRecordUpdate(Model $record, array $data): Model
4051
{
4152
/** @var Model&TranslatableContract $record */
42-
if (! $this->lang || ! ($record instanceof TranslatableContract)) {
53+
if (! $this->lang) {
4354
return parent::handleRecordUpdate($record, $data);
4455
}
4556

@@ -68,7 +79,7 @@ public function mutateFormDataBeforeSave(array $data): array
6879
/** @var Model&TranslatableContract $model */
6980
$model = $this->getRecord();
7081

71-
if (! ($model instanceof TranslatableContract) || ! property_exists($model, 'translatedAttributes')) {
82+
if (! property_exists($model, 'translatedAttributes')) {
7283
return $data;
7384
}
7485

@@ -89,4 +100,27 @@ public function mutateFormDataBeforeSave(array $data): array
89100

90101
return $data;
91102
}
103+
104+
public function getHeaderActions(): array
105+
{
106+
$languages = \Moox\Localization\Models\Localization::with('language')->get();
107+
$languageCodes = $languages->map(fn ($localization) => $localization->language->alpha2);
108+
109+
return [
110+
\Filament\Actions\ActionGroup::make(
111+
$languages->map(fn ($localization) => \Filament\Actions\Action::make('language_'.$localization->language->alpha2)
112+
->icon('flag-'.$localization->language->alpha2)
113+
->label('')
114+
->color('transparent')
115+
->extraAttributes(['class' => 'bg-transparent hover:bg-transparent flex items-center gap-1'])
116+
->url(fn () => $this->getResource()::getUrl('edit', ['record' => $this->record, 'lang' => $localization->language->alpha2]))
117+
)
118+
->toArray()
119+
)
120+
->color('transparent')
121+
->label('Language')
122+
->icon('flag-'.$this->lang)
123+
->extraAttributes(['class' => '']),
124+
];
125+
}
92126
}

src/Entities/Items/Draft/Pages/BaseViewDraft.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Moox\Core\Entities\Items\Draft\Pages;
44

5+
use Filament\Actions\RestoreAction;
56
use Filament\Resources\Pages\ViewRecord;
67
use Moox\Core\Traits\CanResolveResourceClass;
78

@@ -39,4 +40,30 @@ public function mutateFormDataBeforeFill(array $data): array
3940

4041
return $values;
4142
}
43+
44+
public function getHeaderActions(): array
45+
{
46+
$localizations = \Moox\Localization\Models\Localization::with('language')->get();
47+
48+
return [
49+
\Filament\Actions\ActionGroup::make(
50+
$localizations->map(fn ($localization) => \Filament\Actions\Action::make('language_'.$localization->language->alpha2)
51+
->icon('flag-'.$localization->language->alpha2)
52+
->label('')
53+
->color('transparent')
54+
->extraAttributes(['class' => 'bg-transparent hover:bg-transparent flex items-center gap-1'])
55+
->url(fn () => $this->getResource()::getUrl('view', ['record' => $this->record, 'lang' => $localization->language->alpha2]))
56+
)
57+
->toArray()
58+
)
59+
->color('transparent')
60+
->label('Language')
61+
->icon('flag-'.$this->lang)
62+
->extraAttributes(['class' => '']),
63+
64+
RestoreAction::make(),
65+
66+
67+
];
68+
}
4269
}

src/Traits/Taxonomy/HasResourceTaxonomy.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use Illuminate\Database\Eloquent\Builder;
1010
use Illuminate\Database\Eloquent\Model;
1111
use Illuminate\Support\Facades\DB;
12-
use Moox\Core\Forms\TaxonomyCreateForm as CoreTaxonomyCreateForm;
12+
use Moox\Category\Moox\Entities\Categories\Category\Forms\TaxonomyCreateForm as CoreTaxonomyCreateForm;
1313
use Moox\Core\Services\TaxonomyService;
1414

1515
trait HasResourceTaxonomy

0 commit comments

Comments
 (0)