Skip to content

Commit 9f20f7a

Browse files
committed
feat: use spatie's laravel-translatable package and filament plugin
1 parent c6b4543 commit 9f20f7a

5 files changed

Lines changed: 100 additions & 29 deletions

File tree

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,19 @@
4444
"php": "^8.3",
4545
"bezhansalleh/filament-language-switch": "^3.1",
4646
"bezhansalleh/filament-shield": "^3.3",
47-
"cactus-galaxy/filament-astrotomic": "^0.3.0",
4847
"datalinx/php-utils": "^2.5",
4948
"dutchcodingcompany/filament-developer-logins": "^1.6",
5049
"eclipsephp/world-plugin": "dev-main",
5150
"filament/filament": "^3.3",
5251
"filament/spatie-laravel-media-library-plugin": "^3.2",
52+
"filament/spatie-laravel-translatable-plugin": "^3.2",
5353
"laravel/framework": "^11.0",
5454
"laravel/horizon": "^5.31",
5555
"laravel/telescope": "^5.5",
5656
"laravel/tinker": "^2.10",
5757
"pxlrbt/filament-environment-indicator": "^2.1",
5858
"spatie/laravel-package-tools": "^1.18",
59+
"spatie/laravel-translatable": "^6.11",
5960
"tangodev-it/filament-emoji-picker": "^1.0"
6061
},
6162
"require-dev": {

src/Http/Middleware/SetupPanel.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
use Closure;
66
use Eclipse\Core\Models\Locale;
7+
use Filament\Facades\Filament;
8+
use Filament\SpatieLaravelTranslatablePlugin;
79
use Illuminate\Http\Request;
8-
use Illuminate\Support\Facades\Config;
910
use Symfony\Component\HttpFoundation\Response;
1011

1112
class SetupPanel
@@ -17,8 +18,18 @@ class SetupPanel
1718
*/
1819
public function handle(Request $request, Closure $next): Response
1920
{
20-
// Set available languages for the Translatable package
21-
Config::set('translatable.locales', Locale::getAvailableLocales()->pluck('id')->toArray());
21+
$localeIds = Locale::getAvailableLocales()->pluck('id')->toArray();
22+
23+
$panel = Filament::getPanel();
24+
25+
if ($panel) {
26+
// Set locales for the Translatable plugin
27+
$panel
28+
->plugin(
29+
SpatieLaravelTranslatablePlugin::make()
30+
->defaultLocales($localeIds)
31+
);
32+
}
2233

2334
return $next($request);
2435
}

src/Providers/AdminPanelProvider.php

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
namespace Eclipse\Core\Providers;
44

5-
use Astrotomic\Translatable\Translatable;
65
use BezhanSalleh\FilamentLanguageSwitch\LanguageSwitch;
76
use BezhanSalleh\FilamentShield\Facades\FilamentShield;
87
use BezhanSalleh\FilamentShield\FilamentShieldPlugin;
98
use BezhanSalleh\FilamentShield\Middleware\SyncShieldTenant;
10-
use CactusGalaxy\FilamentAstrotomic\FilamentAstrotomicTranslatablePlugin;
119
use DutchCodingCompany\FilamentDeveloperLogins\FilamentDeveloperLoginsPlugin;
1210
use Eclipse\Core\Filament\Pages\EditProfile;
1311
use Eclipse\Core\Http\Middleware\SetupPanel;
@@ -17,6 +15,7 @@
1715
use Eclipse\Core\Models\User\Permission;
1816
use Eclipse\Core\Models\User\Role;
1917
use Eclipse\Core\Policies\User\RolePolicy;
18+
use Eclipse\Core\Services\PluginRegistry;
2019
use Eclipse\World\EclipseWorld;
2120
use Filament\Http\Middleware\Authenticate;
2221
use Filament\Http\Middleware\DisableBladeIconComponents;
@@ -31,19 +30,17 @@
3130
use Filament\Support\Enums\MaxWidth;
3231
use Filament\Support\Enums\Platform;
3332
use Filament\Support\Facades\FilamentView;
34-
use Filament\Tables;
33+
use Filament\Tables\Columns\Column;
3534
use Filament\Widgets;
3635
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
3736
use Illuminate\Cookie\Middleware\EncryptCookies;
38-
use Illuminate\Database\Eloquent\Builder;
3937
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
4038
use Illuminate\Routing\Middleware\SubstituteBindings;
4139
use Illuminate\Session\Middleware\AuthenticateSession;
4240
use Illuminate\Session\Middleware\StartSession;
4341
use Illuminate\Support\Facades\Blade;
4442
use Illuminate\Support\Facades\Config;
4543
use Illuminate\Support\Facades\Gate;
46-
use Illuminate\Support\Str;
4744
use Illuminate\View\Middleware\ShareErrorsFromSession;
4845
use pxlrbt\FilamentEnvironmentIndicator\EnvironmentIndicatorPlugin;
4946

@@ -53,7 +50,7 @@ public function panel(Panel $panel): Panel
5350
{
5451
$package_src = __DIR__.'/../../src/';
5552

56-
return $panel
53+
$panel
5754
->default()
5855
->id('admin')
5956
->path('admin')
@@ -115,7 +112,6 @@ public function panel(Panel $panel): Panel
115112
->enabled(app()->isLocal())
116113
->modelClass(User::class)
117114
->users(config('eclipse.developer_logins') ?: []),
118-
FilamentAstrotomicTranslatablePlugin::make(),
119115
EclipseWorld::make(),
120116
])
121117
->navigationGroups([
@@ -138,13 +134,24 @@ public function panel(Panel $panel): Panel
138134
// Always visible for local env, otherwise the viewHorizon permission is required
139135
->visible(fn (User $user): bool => app()->isLocal() || $user->can('viewHorizon')),
140136
]);
137+
138+
// Add plugins from the plugin registry
139+
foreach (app(PluginRegistry::class)->getPlugins() as $plugin) {
140+
$panel->plugin($plugin)->getPlugin();
141+
}
142+
143+
return $panel;
141144
}
142145

143146
public function register(): void
144147
{
145148
parent::register();
146149

147150
FilamentView::registerRenderHook('panels::body.end', fn (): string => Blade::render("@vite('resources/js/app.js')"));
151+
152+
$this->app->singleton(PluginRegistry::class, function () {
153+
return new PluginRegistry;
154+
});
148155
}
149156

150157
/**
@@ -163,28 +170,19 @@ public function boot(): void
163170
->setPermissionClass(Permission::class)
164171
->setRoleClass(Role::class);
165172

173+
// Set common settings for Filament table columns
174+
Column::configureUsing(function (Column $column) {
175+
$column
176+
->toggleable()
177+
->sortable();
178+
});
179+
166180
// Prohibit Filament Shield's destructive commands in production
167181
FilamentShield::prohibitDestructiveCommands($this->app->isProduction());
168182

169183
// Load customized translations for Filament Shield
170184
$this->loadTranslationsFrom(__DIR__.'/../../resources/lang/vendor/filament-shield', 'filament-shield');
171185

172-
// Configure search for translatable model attributes
173-
Tables\Columns\TextColumn::configureUsing(function (Tables\Columns\TextColumn $column): void {
174-
if (Str::match('@^translations?\.(\w+)$@', $column->getName())) {
175-
$column
176-
->searchable(query: function (Builder $query, string $search) use ($column): Builder {
177-
$columnName = Str::after($column->getName(), '.');
178-
if ($query->hasNamedScope('whereTranslationLike')) {
179-
/* @var Translatable $query */
180-
return $query->whereTranslationLike($columnName, "%{$search}%");
181-
}
182-
183-
return $query->where($columnName, 'like', "%{$search}%");
184-
});
185-
}
186-
});
187-
188186
// Configure language switcher
189187
LanguageSwitch::configureUsing(function (LanguageSwitch $switch) {
190188
$availableLocales = Locale::getAvailableLocales();

src/Services/PluginRegistry.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace Eclipse\Core\Services;
4+
5+
use Filament\Contracts\Plugin;
6+
use InvalidArgumentException;
7+
8+
/**
9+
* Registry for managing Filament plugins in the application.
10+
*
11+
* This class serves as a central registry for Filament plugins, allowing them to be:
12+
* - Registered in the AppServiceProvider during application bootstrap
13+
* - Retrieved and configured in the AdminPanelProvider for the admin panel setup
14+
* - Managed as a collection that can be accessed throughout the application
15+
*
16+
* The registry supports adding both single plugins and arrays of plugins,
17+
* ensuring type safety by validating that all registered items implement
18+
* the Filament\Contracts\Plugin interface.
19+
*/
20+
class PluginRegistry
21+
{
22+
/**
23+
* @var Plugin[]
24+
*/
25+
protected array $plugins = [];
26+
27+
/**
28+
* Add plugin to registry
29+
*
30+
* @param Plugin|Plugin[] $plugin Plugin instance or array of plugins
31+
*/
32+
public function addPlugin(Plugin|array $plugin): void
33+
{
34+
if (is_array($plugin)) {
35+
foreach ($plugin as $p) {
36+
if (! $p instanceof Plugin) {
37+
throw new InvalidArgumentException('Plugin must be an instance of Filament\\Contracts\\Plugin!');
38+
}
39+
$this->plugins[] = $p;
40+
}
41+
} else {
42+
$this->plugins[] = $plugin;
43+
}
44+
}
45+
46+
/**
47+
* Get all registered plugins
48+
*
49+
* @return Plugin[]
50+
*/
51+
public function getPlugins(): array
52+
{
53+
return $this->plugins;
54+
}
55+
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
<?php
22

33
use Eclipse\Core\Models\Locale;
4+
use Filament\Contracts\Plugin;
5+
use Filament\Facades\Filament;
46

57
test('panel is set up correctly', function () {
68

79
// Send a request to load the panel and middleware
810
$this->get('/admin/login')->assertStatus(200);
911

10-
expect(Config::get('translatable.locales'))
11-
->toBeArray()
12+
/** @var \Filament\SpatieLaravelTranslatablePlugin $plugin */
13+
$plugin = Filament::getPanel()->getPlugin('spatie-laravel-translatable');
14+
15+
expect($plugin)
16+
->toBeInstanceOf(Plugin::class)
17+
->and($plugin->getDefaultLocales())
1218
->toContain(...Locale::getAvailableLocales()->pluck('id')->toArray());
1319
});

0 commit comments

Comments
 (0)