Compare commits

...

23 Commits

Author SHA1 Message Date
Lance Pioch
65ed06893b Remove unnecessary nullsafe operator on left side of ?? 2026-02-07 23:42:25 -05:00
Lance Pioch
59f21ff833 Use null-safe operator on user() calls for timezone access 2026-02-07 23:23:02 -05:00
Lance Pioch
f2d6b5af76 Allow schedule cron inputs to use a user-selected timezone (#1228)
Add a timezone dropdown (defaulting to the user's profile timezone) to the schedule form so cron inputs are interpreted in the chosen timezone. The selected timezone is used to compute next_run_at in UTC at save time with no database schema changes required.

Resolves #1228
2026-02-06 02:32:21 -05:00
Frogperson
a34bf9fd49 Add Daemon Base Directory field (#2151)
Co-authored-by: Boy132 <mail@boy132.de>
2026-02-05 08:00:25 -05:00
Boy132
7a9deba0e1 Fix notifications for DeleteAction on EditEgg page (#2165) 2026-02-04 22:20:22 +01:00
Charles
159bfe2210 exclude node actions (#2164) 2026-02-04 06:48:13 -05:00
stdpi
a821db8aae Improve file browser UI (#2086) 2026-02-04 05:40:45 -05:00
Lance Pioch
1556f8efb8 Allow all permissions to be toggled at once for api tokens (#2154) 2026-02-02 08:41:10 -05:00
Lance Pioch
57c2aa6f21 Fix the tabbing for username to password on login (#2155)
Co-authored-by: notCharles <charles@pelican.dev>
2026-02-02 08:40:55 -05:00
Charles
36de4c3786 composer update (#2161) 2026-01-31 19:37:54 -05:00
Boy132
26312e3897 Add basic api for plugins (#2146) 2026-02-01 00:10:57 +01:00
Boy132
a477c89025 Move username sanitization to model and make it less strict (#2150) 2026-02-01 00:07:26 +01:00
Boy132
93e81c26a9 Send server id to wings (#2157) 2026-01-31 22:54:06 +01:00
Boy132
23e91e8df3 Fix "visit website" button being invisible (#2158) 2026-01-31 22:53:56 +01:00
Boy132
833294bfaf Invisible button and tooltip fixes (#2149) 2026-01-29 15:37:05 +01:00
Lance Pioch
abaeeff86d Laravel 12.49.0 Shift (#2145)
Co-authored-by: Shift <shift@laravelshift.com>
2026-01-27 23:40:20 -05:00
Charles
dd77555c42 Add tooltips to actions across admin area (#2134)
Co-authored-by: Boy132 <mail@boy132.de>
2026-01-27 20:07:18 -05:00
Boy132
297ecb544d Replace icon strings with enum (#2113) 2026-01-27 11:36:07 +01:00
Boy132
e14bb7d030 Fix oauth provider "enabled" checks (#2142) 2026-01-27 11:27:19 +01:00
Boy132
c770937880 Migration to convert former stock egg uuids (#2108) 2026-01-23 16:40:24 +01:00
Boy132
426643eaa6 Add allocation to role permission models & make sure user can target node of allocation (#2124) 2026-01-23 16:37:01 +01:00
Boy132
3ca0f64e6e Set failed plugin installs to "not_installed" instead of errored (#2129) 2026-01-23 16:36:38 +01:00
Michael (Parker) Parker
8e8ce3b50f fix plugins in entrypoint (#2122) 2026-01-19 09:15:18 -05:00
169 changed files with 8117 additions and 1440 deletions

View File

@@ -0,0 +1,48 @@
<?php
namespace App\Console\Commands\Dev;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
class GenerateTablerIconsEnum extends Command
{
protected $signature = 'dev:generate-tabler-icons-enum';
protected $description = 'Generate an enum for tabler icons based on the secondnetwork/blade-tabler-icons svgs';
public function handle(): void
{
$files = File::files(base_path('vendor/secondnetwork/blade-tabler-icons/resources/svg'));
$files = array_filter($files, fn ($file) => $file->getExtension() === 'svg');
$enumContent = "<?php\n\n";
$enumContent .= "namespace App\\Enums;\n\n";
$enumContent .= "enum TablerIcon: string\n{\n";
foreach ($files as $file) {
$filename = pathinfo($file->getFilename(), PATHINFO_FILENAME);
// Letter V is duplicate, as "letter-v" and "letter-letter-v"
if (str($filename)->contains('letter-letter')) {
continue;
}
// Filled icons exist with "-f" and "-filled", we only want the later
if (str($filename)->endsWith('-f') && file_exists(base_path("vendor/secondnetwork/blade-tabler-icons/resources/svg/{$filename}illed.svg"))) {
continue;
}
$caseName = str($filename)->title()->replace('-', '');
$value = str($filename)->slug()->prepend('tabler-');
$enumContent .= " case $caseName = '$value';\n";
}
$enumContent .= "}\n";
File::put(base_path('app/Enums/TablerIcon.php'), $enumContent);
$this->info('Enum generated');
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Enums; namespace App\Enums;
use BackedEnum;
use Filament\Support\Contracts\HasColor; use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasIcon; use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
@@ -12,12 +13,12 @@ enum BackupStatus: string implements HasColor, HasIcon, HasLabel
case Successful = 'successful'; case Successful = 'successful';
case Failed = 'failed'; case Failed = 'failed';
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return match ($this) { return match ($this) {
self::InProgress => 'tabler-circle-dashed', self::InProgress => TablerIcon::CircleDashed,
self::Successful => 'tabler-circle-check', self::Successful => TablerIcon::CircleCheck,
self::Failed => 'tabler-circle-x', self::Failed => TablerIcon::CircleX,
}; };
} }

View File

@@ -2,6 +2,7 @@
namespace App\Enums; namespace App\Enums;
use BackedEnum;
use Filament\Support\Contracts\HasColor; use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasIcon; use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
@@ -23,20 +24,20 @@ enum ContainerStatus: string implements HasColor, HasIcon, HasLabel
// HTTP Based // HTTP Based
case Missing = 'missing'; case Missing = 'missing';
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return match ($this) { return match ($this) {
self::Created => 'tabler-heart-plus', self::Created => TablerIcon::HeartPlus,
self::Starting => 'tabler-heart-up', self::Starting => TablerIcon::HeartUp,
self::Running => 'tabler-heartbeat', self::Running => TablerIcon::Heartbeat,
self::Restarting => 'tabler-heart-bolt', self::Restarting => TablerIcon::HeartBolt,
self::Exited => 'tabler-heart-exclamation', self::Exited => TablerIcon::HeartExclamation,
self::Paused => 'tabler-heart-pause', self::Paused => TablerIcon::HeartPause,
self::Dead, self::Offline => 'tabler-heart-x', self::Dead, self::Offline => TablerIcon::HeartX,
self::Removing => 'tabler-heart-down', self::Removing => TablerIcon::HeartDown,
self::Missing => 'tabler-heart-search', self::Missing => TablerIcon::HeartSearch,
self::Stopping => 'tabler-heart-minus', self::Stopping => TablerIcon::HeartMinus,
}; };
} }

View File

@@ -11,6 +11,8 @@ enum CustomizationKey: string
case TopNavigation = 'top_navigation'; case TopNavigation = 'top_navigation';
case DashboardLayout = 'dashboard_layout'; case DashboardLayout = 'dashboard_layout';
case ButtonStyle = 'button_style';
public function getDefaultValue(): string|int|bool public function getDefaultValue(): string|int|bool
{ {
return match ($this) { return match ($this) {
@@ -20,6 +22,7 @@ enum CustomizationKey: string
self::ConsoleGraphPeriod => 30, self::ConsoleGraphPeriod => 30,
self::TopNavigation => config('panel.filament.default-navigation', 'sidebar'), self::TopNavigation => config('panel.filament.default-navigation', 'sidebar'),
self::DashboardLayout => 'grid', self::DashboardLayout => 'grid',
self::ButtonStyle => true,
}; };
} }

View File

@@ -2,6 +2,7 @@
namespace App\Enums; namespace App\Enums;
use BackedEnum;
use Filament\Support\Contracts\HasIcon; use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
@@ -11,12 +12,12 @@ enum PluginCategory: string implements HasIcon, HasLabel
case Theme = 'theme'; case Theme = 'theme';
case Language = 'language'; case Language = 'language';
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return match ($this) { return match ($this) {
self::Plugin => 'tabler-package', self::Plugin => TablerIcon::Package,
self::Theme => 'tabler-palette', self::Theme => TablerIcon::Palette,
self::Language => 'tabler-language', self::Language => TablerIcon::Language,
}; };
} }

View File

@@ -2,6 +2,7 @@
namespace App\Enums; namespace App\Enums;
use BackedEnum;
use Filament\Support\Contracts\HasColor; use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasIcon; use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
@@ -14,14 +15,14 @@ enum PluginStatus: string implements HasColor, HasIcon, HasLabel
case Errored = 'errored'; case Errored = 'errored';
case Incompatible = 'incompatible'; case Incompatible = 'incompatible';
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return match ($this) { return match ($this) {
self::NotInstalled => 'tabler-heart-off', self::NotInstalled => TablerIcon::HeartOff,
self::Disabled => 'tabler-heart-x', self::Disabled => TablerIcon::HeartX,
self::Enabled => 'tabler-heart-check', self::Enabled => TablerIcon::HeartCheck,
self::Errored => 'tabler-heart-broken', self::Errored => TablerIcon::HeartBroken,
self::Incompatible => 'tabler-heart-cancel', self::Incompatible => TablerIcon::HeartCancel,
}; };
} }

View File

@@ -5,6 +5,7 @@ namespace App\Enums;
enum RolePermissionModels: string enum RolePermissionModels: string
{ {
case ApiKey = 'apiKey'; case ApiKey = 'apiKey';
case Allocation = 'allocation';
case DatabaseHost = 'databaseHost'; case DatabaseHost = 'databaseHost';
case Database = 'database'; case Database = 'database';
case Egg = 'egg'; case Egg = 'egg';
@@ -34,4 +35,9 @@ enum RolePermissionModels: string
{ {
return RolePermissionPrefixes::Update->value . ' ' . $this->value; return RolePermissionPrefixes::Update->value . ' ' . $this->value;
} }
public function delete(): string
{
return RolePermissionPrefixes::Delete->value . ' ' . $this->value;
}
} }

View File

@@ -2,6 +2,7 @@
namespace App\Enums; namespace App\Enums;
use BackedEnum;
use Filament\Support\Contracts\HasColor; use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasIcon; use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
@@ -14,14 +15,13 @@ enum ServerState: string implements HasColor, HasIcon, HasLabel
case Suspended = 'suspended'; case Suspended = 'suspended';
case RestoringBackup = 'restoring_backup'; case RestoringBackup = 'restoring_backup';
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return match ($this) { return match ($this) {
self::Installing => 'tabler-heart-bolt', self::Installing => TablerIcon::HeartBolt,
self::InstallFailed => 'tabler-heart-x', self::InstallFailed, self::ReinstallFailed => TablerIcon::HeartX,
self::ReinstallFailed => 'tabler-heart-x', self::Suspended => TablerIcon::HeartCancel,
self::Suspended => 'tabler-heart-cancel', self::RestoringBackup => TablerIcon::HeartUp,
self::RestoringBackup => 'tabler-heart-up',
}; };
} }

View File

@@ -2,6 +2,8 @@
namespace App\Enums; namespace App\Enums;
use BackedEnum;
enum SubuserPermission: string enum SubuserPermission: string
{ {
case WebsocketConnect = 'websocket.connect'; case WebsocketConnect = 'websocket.connect';
@@ -67,21 +69,21 @@ enum SubuserPermission: string
return $this === self::WebsocketConnect; return $this === self::WebsocketConnect;
} }
public function getIcon(): ?string public function getIcon(): ?BackedEnum
{ {
[$group, $permission] = $this->split(); [$group, $permission] = $this->split();
return match ($group) { return match ($group) {
'control' => 'tabler-terminal-2', 'control' => TablerIcon::Terminal2,
'user' => 'tabler-users', 'user' => TablerIcon::Users,
'file' => 'tabler-files', 'file' => TablerIcon::Files,
'backup' => 'tabler-file-zip', 'backup' => TablerIcon::FileZip,
'allocation' => 'tabler-network', 'allocation' => TablerIcon::Network,
'startup' => 'tabler-player-play', 'startup' => TablerIcon::PlayerPlay,
'database' => 'tabler-database', 'database' => TablerIcon::Database,
'schedule' => 'tabler-clock', 'schedule' => TablerIcon::Clock,
'settings' => 'tabler-settings', 'settings' => TablerIcon::Settings,
'activity' => 'tabler-stack', 'activity' => TablerIcon::Stack,
default => null, default => null,
}; };
} }

5997
app/Enums/TablerIcon.php Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,7 @@
namespace App\Enums; namespace App\Enums;
use BackedEnum;
use Filament\Support\Contracts\HasColor; use Filament\Support\Contracts\HasColor;
use Filament\Support\Contracts\HasIcon; use Filament\Support\Contracts\HasIcon;
use Filament\Support\Contracts\HasLabel; use Filament\Support\Contracts\HasLabel;
@@ -24,11 +25,11 @@ enum WebhookType: string implements HasColor, HasIcon, HasLabel
}; };
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return match ($this) { return match ($this) {
self::Regular => 'tabler-world-www', self::Regular => TablerIcon::WorldWww,
self::Discord => 'tabler-brand-discord', self::Discord => TablerIcon::BrandDiscord,
}; };
} }
} }

View File

@@ -2,6 +2,7 @@
namespace App\Extensions\Captcha\Schemas; namespace App\Extensions\Captcha\Schemas;
use BackedEnum;
use Filament\Schemas\Components\Component; use Filament\Schemas\Components\Component;
interface CaptchaSchemaInterface interface CaptchaSchemaInterface
@@ -24,7 +25,7 @@ interface CaptchaSchemaInterface
*/ */
public function getSettingsForm(): array; public function getSettingsForm(): array;
public function getIcon(): ?string; public function getIcon(): null|string|BackedEnum;
public function validateResponse(?string $captchaResponse = null): void; public function validateResponse(?string $captchaResponse = null): void;
} }

View File

@@ -2,8 +2,10 @@
namespace App\Extensions\Captcha\Schemas\Turnstile; namespace App\Extensions\Captcha\Schemas\Turnstile;
use App\Enums\TablerIcon;
use App\Extensions\Captcha\Schemas\BaseSchema; use App\Extensions\Captcha\Schemas\BaseSchema;
use App\Extensions\Captcha\Schemas\CaptchaSchemaInterface; use App\Extensions\Captcha\Schemas\CaptchaSchemaInterface;
use BackedEnum;
use Exception; use Exception;
use Filament\Forms\Components\Toggle; use Filament\Forms\Components\Toggle;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
@@ -49,8 +51,8 @@ class TurnstileSchema extends BaseSchema implements CaptchaSchemaInterface
->label(trans('admin/setting.captcha.verify')) ->label(trans('admin/setting.captcha.verify'))
->columnSpan(2) ->columnSpan(2)
->inline(false) ->inline(false)
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->default(env('CAPTCHA_TURNSTILE_VERIFY_DOMAIN', true)), ->default(env('CAPTCHA_TURNSTILE_VERIFY_DOMAIN', true)),
@@ -61,9 +63,9 @@ class TurnstileSchema extends BaseSchema implements CaptchaSchemaInterface
]); ]);
} }
public function getIcon(): ?string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-cloudflare'; return TablerIcon::BrandCloudflare;
} }
/** /**

View File

@@ -3,6 +3,7 @@
namespace App\Extensions\Features\Schemas; namespace App\Extensions\Features\Schemas;
use App\Enums\SubuserPermission; use App\Enums\SubuserPermission;
use App\Enums\TablerIcon;
use App\Extensions\Features\FeatureSchemaInterface; use App\Extensions\Features\FeatureSchemaInterface;
use App\Facades\Activity; use App\Facades\Activity;
use App\Models\Server; use App\Models\Server;
@@ -73,7 +74,7 @@ class GSLTokenSchema implements FeatureSchemaInterface
} }
}, },
]) ])
->hintIcon('tabler-code', fn () => implode('|', $serverVariable->variable->rules)) ->hintIcon(TablerIcon::Code, fn () => implode('|', $serverVariable->variable->rules))
->label(fn () => $serverVariable->variable->name) ->label(fn () => $serverVariable->variable->name)
->prefix(fn () => '{{' . $serverVariable->variable->env_variable . '}}') ->prefix(fn () => '{{' . $serverVariable->variable->env_variable . '}}')
->helperText(fn () => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description), ->helperText(fn () => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description),

View File

@@ -2,6 +2,7 @@
namespace App\Extensions\Features\Schemas; namespace App\Extensions\Features\Schemas;
use App\Enums\TablerIcon;
use App\Extensions\Features\FeatureSchemaInterface; use App\Extensions\Features\FeatureSchemaInterface;
use Filament\Actions\Action; use Filament\Actions\Action;
use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Blade;
@@ -31,7 +32,7 @@ class PIDLimitSchema implements FeatureSchemaInterface
{ {
return Action::make($this->getId()) return Action::make($this->getId())
->requiresConfirmation() ->requiresConfirmation()
->icon('tabler-alert-triangle') ->icon(TablerIcon::AlertTriangle)
->modalHeading(fn () => user()?->isAdmin() ? 'Memory or process limit reached...' : 'Possible resource limit reached...') ->modalHeading(fn () => user()?->isAdmin() ? 'Memory or process limit reached...' : 'Possible resource limit reached...')
->modalDescription(new HtmlString(Blade::render( ->modalDescription(new HtmlString(Blade::render(
user()?->isAdmin() ? <<<'HTML' user()?->isAdmin() ? <<<'HTML'

View File

@@ -3,6 +3,7 @@
namespace App\Extensions\OAuth; namespace App\Extensions\OAuth;
use App\Models\User; use App\Models\User;
use BackedEnum;
use Filament\Schemas\Components\Component; use Filament\Schemas\Components\Component;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
use Laravel\Socialite\Contracts\User as OAuthUser; use Laravel\Socialite\Contracts\User as OAuthUser;
@@ -29,7 +30,7 @@ interface OAuthSchemaInterface
/** @return Step[] */ /** @return Step[] */
public function getSetupSteps(): array; public function getSetupSteps(): array;
public function getIcon(): ?string; public function getIcon(): null|string|BackedEnum;
public function getHexColor(): ?string; public function getHexColor(): ?string;

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -33,9 +35,9 @@ final class BitbucketSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-bitbucket-f'; return TablerIcon::BrandBitbucketFilled;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,13 +2,15 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use BackedEnum;
final class CommonSchema extends OAuthSchema final class CommonSchema extends OAuthSchema
{ {
public function __construct( public function __construct(
private readonly string $id, private readonly string $id,
private readonly ?string $name = null, private readonly ?string $name = null,
private readonly ?string $configName = null, private readonly ?string $configName = null,
private readonly ?string $icon = null, private readonly null|string|BackedEnum $icon = null,
private readonly ?string $hexColor = null, private readonly ?string $hexColor = null,
) {} ) {}
@@ -27,7 +29,7 @@ final class CommonSchema extends OAuthSchema
return $this->configName ?? parent::getConfigKey(); return $this->configName ?? parent::getConfigKey();
} }
public function getIcon(): ?string public function getIcon(): null|string|BackedEnum
{ {
return $this->icon; return $this->icon;
} }

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -42,9 +44,9 @@ final class DiscordSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-discord-f'; return TablerIcon::BrandDiscordFilled;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -36,9 +38,9 @@ final class FacebookSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-facebook-f'; return TablerIcon::BrandFacebookFilled;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -42,9 +44,9 @@ final class GithubSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-github-f'; return TablerIcon::BrandGithubFilled;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -53,9 +55,9 @@ final class GitlabSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-gitlab'; return TablerIcon::BrandGitlab;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -42,9 +44,9 @@ final class GoogleSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-google-f'; return TablerIcon::BrandGoogleFilled;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -33,9 +35,9 @@ final class LinkedinSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-linkedin-f'; return TablerIcon::BrandLinkedinFilled;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,8 +2,10 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use App\Extensions\OAuth\OAuthSchemaInterface; use App\Extensions\OAuth\OAuthSchemaInterface;
use App\Models\User; use App\Models\User;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle; use Filament\Forms\Components\Toggle;
use Filament\Schemas\Components\Component; use Filament\Schemas\Components\Component;
@@ -61,8 +63,8 @@ abstract class OAuthSchema implements OAuthSchemaInterface
->label(trans('admin/setting.oauth.create_missing_users')) ->label(trans('admin/setting.oauth.create_missing_users'))
->columnSpan(2) ->columnSpan(2)
->inline(false) ->inline(false)
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->formatStateUsing(fn ($state) => (bool) $state) ->formatStateUsing(fn ($state) => (bool) $state)
@@ -72,8 +74,8 @@ abstract class OAuthSchema implements OAuthSchemaInterface
->label(trans('admin/setting.oauth.link_missing_users')) ->label(trans('admin/setting.oauth.link_missing_users'))
->columnSpan(2) ->columnSpan(2)
->inline(false) ->inline(false)
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->formatStateUsing(fn ($state) => (bool) $state) ->formatStateUsing(fn ($state) => (bool) $state)
@@ -106,7 +108,7 @@ abstract class OAuthSchema implements OAuthSchemaInterface
return "OAUTH_{$id}_ENABLED"; return "OAUTH_{$id}_ENABLED";
} }
public function getIcon(): ?string public function getIcon(): null|string|BackedEnum
{ {
return null; return null;
} }
@@ -118,9 +120,7 @@ abstract class OAuthSchema implements OAuthSchemaInterface
public function isEnabled(): bool public function isEnabled(): bool
{ {
$id = Str::upper($this->getId()); return env($this->getConfigKey(), false);
return env("OAUTH_{$id}_ENABLED", false);
} }
public function shouldCreateMissingUser(OAuthUser $user): bool public function shouldCreateMissingUser(OAuthUser $user): bool

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -33,9 +35,9 @@ final class SlackSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-slack'; return TablerIcon::BrandSlack;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -59,9 +61,9 @@ final class SteamSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-steam-f'; return TablerIcon::BrandSteamFilled;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,6 +2,8 @@
namespace App\Extensions\OAuth\Schemas; namespace App\Extensions\OAuth\Schemas;
use App\Enums\TablerIcon;
use BackedEnum;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Schemas\Components\Wizard\Step; use Filament\Schemas\Components\Wizard\Step;
@@ -42,9 +44,9 @@ final class XSchema extends OAuthSchema
], parent::getSetupSteps()); ], parent::getSetupSteps());
} }
public function getIcon(): string public function getIcon(): BackedEnum
{ {
return 'tabler-brand-x'; return TablerIcon::BrandX;
} }
public function getHexColor(): string public function getHexColor(): string

View File

@@ -2,12 +2,14 @@
namespace App\Filament\Admin\Pages; namespace App\Filament\Admin\Pages;
use App\Enums\TablerIcon;
use App\Services\Helpers\SoftwareVersionService; use App\Services\Helpers\SoftwareVersionService;
use BackedEnum;
use Filament\Pages\Dashboard as BaseDashboard; use Filament\Pages\Dashboard as BaseDashboard;
class Dashboard extends BaseDashboard class Dashboard extends BaseDashboard
{ {
protected static string|\BackedEnum|null $navigationIcon = 'tabler-layout-dashboard'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::LayoutDashboard;
private SoftwareVersionService $softwareVersionService; private SoftwareVersionService $softwareVersionService;

View File

@@ -2,11 +2,12 @@
namespace App\Filament\Admin\Pages; namespace App\Filament\Admin\Pages;
use App\Enums\TablerIcon;
use BackedEnum;
use Carbon\Carbon; use Carbon\Carbon;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Pages\Page; use Filament\Pages\Page;
use Filament\Support\Enums\IconSize;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
use Spatie\Health\Commands\RunHealthChecksCommand; use Spatie\Health\Commands\RunHealthChecksCommand;
use Spatie\Health\Enums\Status; use Spatie\Health\Enums\Status;
@@ -14,7 +15,7 @@ use Spatie\Health\ResultStores\ResultStore;
class Health extends Page class Health extends Page
{ {
protected static string|\BackedEnum|null $navigationIcon = 'tabler-heart'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Heart;
protected string $view = 'filament.pages.health'; protected string $view = 'filament.pages.health';
@@ -47,9 +48,9 @@ class Health extends Page
{ {
return [ return [
Action::make('refresh') Action::make('refresh')
->label(trans('admin/health.refresh')) ->hiddenLabel()
->iconButton()->iconSize(IconSize::ExtraLarge) ->tooltip(trans('admin/health.refresh'))
->icon('tabler-refresh') ->icon(TablerIcon::Refresh)
->action('refresh'), ->action('refresh'),
]; ];
} }
@@ -128,16 +129,16 @@ class Health extends Page
return trans('admin/health.checks.failed', ['checks' => implode(', ', $failedNames)]); return trans('admin/health.checks.failed', ['checks' => implode(', ', $failedNames)]);
} }
public static function getNavigationIcon(): string public static function getNavigationIcon(): BackedEnum
{ {
// @phpstan-ignore myCustomRules.forbiddenGlobalFunctions // @phpstan-ignore myCustomRules.forbiddenGlobalFunctions
$results = app(ResultStore::class)->latestResults(); $results = app(ResultStore::class)->latestResults();
if ($results === null) { if ($results === null) {
return 'tabler-heart-question'; return TablerIcon::HeartQuestion;
} }
return $results->containsFailingCheck() ? 'tabler-heart-exclamation' : 'tabler-heart-check'; return $results->containsFailingCheck() ? TablerIcon::HeartExclamation : TablerIcon::HeartCheck;
} }
public function backgroundColor(string $str): string public function backgroundColor(string $str): string
@@ -162,14 +163,14 @@ class Health extends Page
}; };
} }
public function icon(string $str): string public function icon(string $str): BackedEnum
{ {
return match ($str) { return match ($str) {
Status::ok()->value => 'tabler-circle-check', Status::ok()->value => TablerIcon::CircleCheck,
Status::warning()->value => 'tabler-exclamation-circle', Status::warning()->value => TablerIcon::ExclamationCircle,
Status::skipped()->value => 'tabler-circle-chevron-right', Status::skipped()->value => TablerIcon::CircleChevronRight,
Status::failed()->value, Status::crashed()->value => 'tabler-circle-x', Status::failed()->value, Status::crashed()->value => TablerIcon::CircleX,
default => 'tabler-help-circle' default => TablerIcon::HelpCircle
}; };
} }
} }

View File

@@ -2,16 +2,17 @@
namespace App\Filament\Admin\Pages; namespace App\Filament\Admin\Pages;
use App\Enums\TablerIcon;
use Boquizo\FilamentLogViewer\Actions\DeleteAction; use Boquizo\FilamentLogViewer\Actions\DeleteAction;
use Boquizo\FilamentLogViewer\Actions\DownloadAction; use Boquizo\FilamentLogViewer\Actions\DownloadAction;
use Boquizo\FilamentLogViewer\Actions\ViewLogAction; use Boquizo\FilamentLogViewer\Actions\ViewLogAction;
use Boquizo\FilamentLogViewer\Pages\ListLogs as BaseListLogs; use Boquizo\FilamentLogViewer\Pages\ListLogs as BaseListLogs;
use Boquizo\FilamentLogViewer\Tables\Columns\LevelColumn; use Boquizo\FilamentLogViewer\Tables\Columns\LevelColumn;
use Boquizo\FilamentLogViewer\Tables\Columns\NameColumn; use Boquizo\FilamentLogViewer\Tables\Columns\NameColumn;
use Boquizo\FilamentLogViewer\UseCases\ParseDateUseCase;
use Boquizo\FilamentLogViewer\Utils\Level; use Boquizo\FilamentLogViewer\Utils\Level;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
@@ -28,7 +29,7 @@ class ListLogs extends BaseListLogs
{ {
return parent::table($table) return parent::table($table)
->emptyStateHeading(trans('admin/log.empty_table')) ->emptyStateHeading(trans('admin/log.empty_table'))
->emptyStateIcon('tabler-check') ->emptyStateIcon(TablerIcon::Check)
->columns([ ->columns([
NameColumn::make('date'), NameColumn::make('date'),
LevelColumn::make(Level::ALL) LevelColumn::make(Level::ALL)
@@ -46,12 +47,14 @@ class ListLogs extends BaseListLogs
]) ])
->recordActions([ ->recordActions([
ViewLogAction::make() ViewLogAction::make()
->icon('tabler-file-description')->iconSize(IconSize::Large)->iconButton(), ->icon(TablerIcon::FileDescription)->iconButton(),
DownloadAction::make() DownloadAction::make()
->icon('tabler-file-download')->iconSize(IconSize::Large)->iconButton(), ->tooltip(fn ($record) => trans('filament-log-viewer::log.table.actions.download.label', ['log' => ParseDateUseCase::execute($record['date'])]))
->icon(TablerIcon::FileDownload)->iconButton(),
Action::make('uploadLogs') Action::make('uploadLogs')
->hiddenLabel() ->hiddenLabel()
->icon('tabler-world-upload')->iconSize(IconSize::Large)->iconButton() ->tooltip(trans('admin/log.actions.upload_tooltip', ['url' => 'logs.pelican.dev']))
->icon(TablerIcon::WorldUpload)
->requiresConfirmation() ->requiresConfirmation()
->modalHeading(trans('admin/log.actions.upload_logs')) ->modalHeading(trans('admin/log.actions.upload_logs'))
->modalDescription(fn ($record) => trans('admin/log.actions.upload_logs_description', ['file' => $record['date'], 'url' => 'https://logs.pelican.dev'])) ->modalDescription(fn ($record) => trans('admin/log.actions.upload_logs_description', ['file' => $record['date'], 'url' => 'https://logs.pelican.dev']))
@@ -100,7 +103,7 @@ class ListLogs extends BaseListLogs
->body("{$url}") ->body("{$url}")
->success() ->success()
->actions([ ->actions([
Action::make('viewLogs') Action::make('exclude_viewLogs')
->label(trans('admin/log.actions.view_logs')) ->label(trans('admin/log.actions.view_logs'))
->url($url) ->url($url)
->openUrlInNewTab(true), ->openUrlInNewTab(true),
@@ -119,7 +122,7 @@ class ListLogs extends BaseListLogs
} }
}), }),
DeleteAction::make() DeleteAction::make()
->iconSize(IconSize::Medium)->iconButton(), ->icon(TablerIcon::Trash)->iconButton(),
]); ]);
} }
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Pages; namespace App\Filament\Admin\Pages;
use App\Enums\TablerIcon;
use App\Extensions\Avatar\AvatarService; use App\Extensions\Avatar\AvatarService;
use App\Extensions\Captcha\CaptchaService; use App\Extensions\Captcha\CaptchaService;
use App\Extensions\OAuth\OAuthService; use App\Extensions\OAuth\OAuthService;
@@ -37,7 +38,6 @@ use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Contracts\HasSchemas; use Filament\Schemas\Contracts\HasSchemas;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\IconSize;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Illuminate\Http\Client\Factory; use Illuminate\Http\Client\Factory;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
@@ -58,7 +58,7 @@ class Settings extends Page implements HasSchemas
use EnvironmentWriterTrait; use EnvironmentWriterTrait;
use InteractsWithForms; use InteractsWithForms;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-settings'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Settings;
protected string $view = 'filament.pages.settings'; protected string $view = 'filament.pages.settings';
@@ -120,29 +120,29 @@ class Settings extends Page implements HasSchemas
return [ return [
Tab::make('general') Tab::make('general')
->label(trans('admin/setting.navigation.general')) ->label(trans('admin/setting.navigation.general'))
->icon('tabler-home') ->icon(TablerIcon::Home)
->schema($this->generalSettings()), ->schema($this->generalSettings()),
Tab::make('captcha') Tab::make('captcha')
->label(trans('admin/setting.navigation.captcha')) ->label(trans('admin/setting.navigation.captcha'))
->icon('tabler-shield') ->icon(TablerIcon::Shield)
->schema($this->captchaSettings()) ->schema($this->captchaSettings())
->columns(1), ->columns(1),
Tab::make('mail') Tab::make('mail')
->label(trans('admin/setting.navigation.mail')) ->label(trans('admin/setting.navigation.mail'))
->icon('tabler-mail') ->icon(TablerIcon::Mail)
->schema($this->mailSettings()), ->schema($this->mailSettings()),
Tab::make('backup') Tab::make('backup')
->label(trans('admin/setting.navigation.backup')) ->label(trans('admin/setting.navigation.backup'))
->icon('tabler-box') ->icon(TablerIcon::Box)
->schema($this->backupSettings()), ->schema($this->backupSettings()),
Tab::make('oauth') Tab::make('oauth')
->label(trans('admin/setting.navigation.oauth')) ->label(trans('admin/setting.navigation.oauth'))
->icon('tabler-brand-oauth') ->icon(TablerIcon::BrandOauth)
->schema($this->oauthSettings()) ->schema($this->oauthSettings())
->columns(1), ->columns(1),
Tab::make('misc') Tab::make('misc')
->label(trans('admin/setting.navigation.misc')) ->label(trans('admin/setting.navigation.misc'))
->icon('tabler-tool') ->icon(TablerIcon::Tool)
->schema($this->miscSettings()), ->schema($this->miscSettings()),
]; ];
} }
@@ -162,12 +162,12 @@ class Settings extends Page implements HasSchemas
->schema([ ->schema([
TextInput::make('APP_LOGO') TextInput::make('APP_LOGO')
->label(trans('admin/setting.general.app_logo')) ->label(trans('admin/setting.general.app_logo'))
->hintIcon('tabler-question-mark', trans('admin/setting.general.app_logo_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/setting.general.app_logo_help'))
->default(env('APP_LOGO')) ->default(env('APP_LOGO'))
->placeholder('/pelican.svg'), ->placeholder('/pelican.svg'),
TextInput::make('APP_FAVICON') TextInput::make('APP_FAVICON')
->label(trans('admin/setting.general.app_favicon')) ->label(trans('admin/setting.general.app_favicon'))
->hintIcon('tabler-question-mark', trans('admin/setting.general.app_favicon_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/setting.general.app_favicon_help'))
->required() ->required()
->default(env('APP_FAVICON', '/pelican.ico')) ->default(env('APP_FAVICON', '/pelican.ico'))
->placeholder('/pelican.ico'), ->placeholder('/pelican.ico'),
@@ -178,8 +178,8 @@ class Settings extends Page implements HasSchemas
Toggle::make('APP_DEBUG') Toggle::make('APP_DEBUG')
->label(trans('admin/setting.general.debug_mode')) ->label(trans('admin/setting.general.debug_mode'))
->inline(false) ->inline(false)
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->stateCast(new BooleanStateCast(false)) ->stateCast(new BooleanStateCast(false))
@@ -196,8 +196,8 @@ class Settings extends Page implements HasSchemas
Toggle::make('FILAMENT_UPLOADABLE_AVATARS') Toggle::make('FILAMENT_UPLOADABLE_AVATARS')
->label(trans('admin/setting.general.uploadable_avatars')) ->label(trans('admin/setting.general.uploadable_avatars'))
->inline(false) ->inline(false)
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->stateCast(new BooleanStateCast(false)) ->stateCast(new BooleanStateCast(false))
@@ -244,16 +244,16 @@ class Settings extends Page implements HasSchemas
->placeholder(trans('admin/setting.general.trusted_proxies_help')) ->placeholder(trans('admin/setting.general.trusted_proxies_help'))
->default(env('TRUSTED_PROXIES', implode(',', Arr::wrap(config('trustedproxy.proxies'))))) ->default(env('TRUSTED_PROXIES', implode(',', Arr::wrap(config('trustedproxy.proxies')))))
->hintActions([ ->hintActions([
Action::make('clear') Action::make('hint_clear')
->label(trans('admin/setting.general.clear')) ->label(trans('admin/setting.general.clear'))
->color('danger') ->color('danger')
->icon('tabler-trash') ->icon(TablerIcon::Trash)
->requiresConfirmation() ->requiresConfirmation()
->authorize(fn () => user()?->can('update settings')) ->authorize(fn () => user()?->can('update settings'))
->action(fn (Set $set) => $set('TRUSTED_PROXIES', [])), ->action(fn (Set $set) => $set('TRUSTED_PROXIES', [])),
Action::make('cloudflare') Action::make('hint_cloudflare')
->label(trans('admin/setting.general.set_to_cf')) ->label(trans('admin/setting.general.set_to_cf'))
->icon('tabler-brand-cloudflare') ->icon(TablerIcon::BrandCloudflare)
->authorize(fn () => user()?->can('update settings')) ->authorize(fn () => user()?->can('update settings'))
->action(function (Factory $client, Set $set) { ->action(function (Factory $client, Set $set) {
$ips = collect(); $ips = collect();
@@ -295,7 +295,7 @@ class Settings extends Page implements HasSchemas
$formFields[] = Section::make($schema->getName()) $formFields[] = Section::make($schema->getName())
->columns(5) ->columns(5)
->icon($schema->getIcon() ?? 'tabler-shield') ->icon($schema->getIcon() ?? TablerIcon::Shield)
->collapsed(fn () => !$schema->isEnabled()) ->collapsed(fn () => !$schema->isEnabled())
->collapsible() ->collapsible()
->schema([ ->schema([
@@ -349,9 +349,9 @@ class Settings extends Page implements HasSchemas
->live() ->live()
->default(env('MAIL_MAILER', config('mail.default'))) ->default(env('MAIL_MAILER', config('mail.default')))
->hintAction( ->hintAction(
Action::make('test') Action::make('hint_test')
->label(trans('admin/setting.mail.test_mail')) ->label(trans('admin/setting.mail.test_mail'))
->icon('tabler-send') ->icon(TablerIcon::Send)
->hidden(fn (Get $get) => $get('MAIL_MAILER') === 'log') ->hidden(fn (Get $get) => $get('MAIL_MAILER') === 'log')
->authorize(fn () => user()?->can('update settings')) ->authorize(fn () => user()?->can('update settings'))
->action(function (Get $get) { ->action(function (Get $get) {
@@ -541,8 +541,8 @@ class Settings extends Page implements HasSchemas
Toggle::make('AWS_USE_PATH_STYLE_ENDPOINT') Toggle::make('AWS_USE_PATH_STYLE_ENDPOINT')
->label(trans('admin/setting.backup.s3.use_path_style_endpoint')) ->label(trans('admin/setting.backup.s3.use_path_style_endpoint'))
->inline(false) ->inline(false)
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->live() ->live()
@@ -563,26 +563,25 @@ class Settings extends Page implements HasSchemas
$oauthSchemas = $this->oauthService->getAll(); $oauthSchemas = $this->oauthService->getAll();
foreach ($oauthSchemas as $schema) { foreach ($oauthSchemas as $schema) {
$id = Str::upper($schema->getId());
$key = $schema->getConfigKey(); $key = $schema->getConfigKey();
$formFields[] = Section::make($schema->getName()) $formFields[] = Section::make($schema->getName())
->columns(5) ->columns(5)
->icon($schema->getIcon() ?? 'tabler-brand-oauth') ->icon($schema->getIcon() ?? TablerIcon::BrandOauth)
->collapsed(fn () => !env($key, false)) ->collapsed(fn () => !$schema->isEnabled())
->collapsible() ->collapsible()
->schema([ ->schema([
Hidden::make($key) Hidden::make($key)
->live() ->live()
->default(env($key)), ->default($schema->isEnabled()),
Actions::make([ Actions::make([
Action::make("disable_oauth_$id") Action::make('disable_oauth_' . $schema->getId())
->visible(fn (Get $get) => $get($key)) ->visible(fn (Get $get) => $get($key))
->disabled(fn () => !user()?->can('update settings')) ->disabled(fn () => !user()?->can('update settings'))
->label(trans('admin/setting.oauth.disable')) ->label(trans('admin/setting.oauth.disable'))
->color('danger') ->color('danger')
->action(fn (Set $set) => $set($key, false)), ->action(fn (Set $set) => $set($key, false)),
Action::make("enable_oauth_$id") Action::make('enable_oauth_' . $schema->getId())
->visible(fn (Get $get) => !$get($key)) ->visible(fn (Get $get) => !$get($key))
->disabled(fn () => !user()?->can('update settings')) ->disabled(fn () => !user()?->can('update settings'))
->label(trans('admin/setting.oauth.enable')) ->label(trans('admin/setting.oauth.enable'))
@@ -627,8 +626,8 @@ class Settings extends Page implements HasSchemas
->schema([ ->schema([
Toggle::make('PANEL_CLIENT_ALLOCATIONS_ENABLED') Toggle::make('PANEL_CLIENT_ALLOCATIONS_ENABLED')
->label(trans('admin/setting.misc.auto_allocation.question')) ->label(trans('admin/setting.misc.auto_allocation.question'))
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->live() ->live()
@@ -638,8 +637,8 @@ class Settings extends Page implements HasSchemas
Toggle::make('PANEL_CLIENT_ALLOCATIONS_CREATE_NEW') Toggle::make('PANEL_CLIENT_ALLOCATIONS_CREATE_NEW')
->label(trans('admin/setting.misc.auto_allocation.create_new')) ->label(trans('admin/setting.misc.auto_allocation.create_new'))
->helperText(trans('admin/setting.misc.auto_allocation.create_new_help')) ->helperText(trans('admin/setting.misc.auto_allocation.create_new_help'))
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->live() ->live()
@@ -672,8 +671,8 @@ class Settings extends Page implements HasSchemas
->schema([ ->schema([
Toggle::make('PANEL_SEND_INSTALL_NOTIFICATION') Toggle::make('PANEL_SEND_INSTALL_NOTIFICATION')
->label(trans('admin/setting.misc.mail_notifications.server_installed')) ->label(trans('admin/setting.misc.mail_notifications.server_installed'))
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->live() ->live()
@@ -682,8 +681,8 @@ class Settings extends Page implements HasSchemas
->default(env('PANEL_SEND_INSTALL_NOTIFICATION', config('panel.email.send_install_notification'))), ->default(env('PANEL_SEND_INSTALL_NOTIFICATION', config('panel.email.send_install_notification'))),
Toggle::make('PANEL_SEND_REINSTALL_NOTIFICATION') Toggle::make('PANEL_SEND_REINSTALL_NOTIFICATION')
->label(trans('admin/setting.misc.mail_notifications.server_reinstalled')) ->label(trans('admin/setting.misc.mail_notifications.server_reinstalled'))
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->live() ->live()
@@ -731,8 +730,8 @@ class Settings extends Page implements HasSchemas
Toggle::make('APP_ACTIVITY_HIDE_ADMIN') Toggle::make('APP_ACTIVITY_HIDE_ADMIN')
->label(trans('admin/setting.misc.activity_log.log_admin')) ->label(trans('admin/setting.misc.activity_log.log_admin'))
->inline(false) ->inline(false)
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->live() ->live()
@@ -768,8 +767,8 @@ class Settings extends Page implements HasSchemas
->schema([ ->schema([
Toggle::make('PANEL_EDITABLE_SERVER_DESCRIPTIONS') Toggle::make('PANEL_EDITABLE_SERVER_DESCRIPTIONS')
->label(trans('admin/setting.misc.server.edit_server_desc')) ->label(trans('admin/setting.misc.server.edit_server_desc'))
->onIcon('tabler-check') ->onIcon(TablerIcon::Check)
->offIcon('tabler-x') ->offIcon(TablerIcon::X)
->onColor('success') ->onColor('success')
->offColor('danger') ->offColor('danger')
->live() ->live()
@@ -853,9 +852,10 @@ class Settings extends Page implements HasSchemas
{ {
return [ return [
Action::make('save') Action::make('save')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-device-floppy') ->icon(TablerIcon::DeviceFloppy)
->action('save') ->action('save')
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->authorize(fn () => user()?->can('update settings')) ->authorize(fn () => user()?->can('update settings'))
->keyBindings(['mod+s']), ->keyBindings(['mod+s']),
]; ];

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Pages; namespace App\Filament\Admin\Pages;
use App\Enums\TablerIcon;
use App\Traits\ResolvesRecordDate; use App\Traits\ResolvesRecordDate;
use Boquizo\FilamentLogViewer\Actions\BackAction; use Boquizo\FilamentLogViewer\Actions\BackAction;
use Boquizo\FilamentLogViewer\Actions\DeleteAction; use Boquizo\FilamentLogViewer\Actions\DeleteAction;
@@ -9,7 +10,6 @@ use Boquizo\FilamentLogViewer\Actions\DownloadAction;
use Boquizo\FilamentLogViewer\Pages\ViewLog as BaseViewLog; use Boquizo\FilamentLogViewer\Pages\ViewLog as BaseViewLog;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Support\Enums\IconSize;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
class ViewLogs extends BaseViewLog class ViewLogs extends BaseViewLog
@@ -20,14 +20,15 @@ class ViewLogs extends BaseViewLog
{ {
return [ return [
BackAction::make() BackAction::make()
->icon('tabler-arrow-left')->iconSize(IconSize::ExtraLarge)->iconButton(), ->tooltip(trans('filament-log-viewer::log.table.actions.close.label'))
->icon(TablerIcon::ArrowLeft)->iconButton(),
DeleteAction::make(withTooltip: true) DeleteAction::make(withTooltip: true)
->iconSize(IconSize::ExtraLarge)->iconButton(), ->icon(TablerIcon::Trash)->iconButton(),
DownloadAction::make(withTooltip: true) DownloadAction::make(withTooltip: true)
->icon('tabler-file-download')->iconSize(IconSize::ExtraLarge)->iconButton(), ->icon(TablerIcon::FileDownload)->iconButton(),
Action::make('uploadLogs') Action::make('uploadLogs')
->hiddenLabel() ->hiddenLabel()
->icon('tabler-world-upload')->iconSize(IconSize::ExtraLarge)->iconButton() ->icon(TablerIcon::WorldUpload)
->requiresConfirmation() ->requiresConfirmation()
->tooltip(trans('admin/log.actions.upload_tooltip', ['url' => 'logs.pelican.dev'])) ->tooltip(trans('admin/log.actions.upload_tooltip', ['url' => 'logs.pelican.dev']))
->modalHeading(trans('admin/log.actions.upload_logs')) ->modalHeading(trans('admin/log.actions.upload_logs'))
@@ -77,7 +78,7 @@ class ViewLogs extends BaseViewLog
->body("{$url}") ->body("{$url}")
->success() ->success()
->actions([ ->actions([
Action::make('viewLogs') Action::make('exclude_viewLogs')
->label(trans('admin/log.actions.view_logs')) ->label(trans('admin/log.actions.view_logs'))
->url($url) ->url($url)
->openUrlInNewTab(true), ->openUrlInNewTab(true),

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\ApiKeys; namespace App\Filament\Admin\Resources\ApiKeys;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\ApiKeys\Pages\CreateApiKey; use App\Filament\Admin\Resources\ApiKeys\Pages\CreateApiKey;
use App\Filament\Admin\Resources\ApiKeys\Pages\ListApiKeys; use App\Filament\Admin\Resources\ApiKeys\Pages\ListApiKeys;
use App\Filament\Admin\Resources\Users\Pages\EditUser; use App\Filament\Admin\Resources\Users\Pages\EditUser;
@@ -11,7 +12,9 @@ use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations; use App\Traits\Filament\CanCustomizeRelations;
use App\Traits\Filament\CanModifyForm; use App\Traits\Filament\CanModifyForm;
use App\Traits\Filament\CanModifyTable; use App\Traits\Filament\CanModifyTable;
use BackedEnum;
use Exception; use Exception;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Forms\Components\TagsInput; use Filament\Forms\Components\TagsInput;
use Filament\Forms\Components\Textarea; use Filament\Forms\Components\Textarea;
@@ -19,8 +22,8 @@ use Filament\Forms\Components\ToggleButtons;
use Filament\Resources\Pages\PageRegistration; use Filament\Resources\Pages\PageRegistration;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Schemas\Components\Fieldset; use Filament\Schemas\Components\Fieldset;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
@@ -34,7 +37,7 @@ class ApiKeyResource extends Resource
protected static ?string $model = ApiKey::class; protected static ?string $model = ApiKey::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-key'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Key;
public static function getNavigationLabel(): string public static function getNavigationLabel(): string
{ {
@@ -77,7 +80,7 @@ class ApiKeyResource extends Resource
->columns([ ->columns([
TextColumn::make('key') TextColumn::make('key')
->label(trans('admin/apikey.table.key')) ->label(trans('admin/apikey.table.key'))
->icon('tabler-clipboard-text') ->icon(TablerIcon::ClipboardText)
->state(fn (ApiKey $key) => $key->identifier . $key->token) ->state(fn (ApiKey $key) => $key->identifier . $key->token)
->copyable(), ->copyable(),
TextColumn::make('memo') TextColumn::make('memo')
@@ -96,10 +99,12 @@ class ApiKeyResource extends Resource
->url(fn (ApiKey $apiKey) => user()?->can('update', $apiKey->user) ? EditUser::getUrl(['record' => $apiKey->user]) : null), ->url(fn (ApiKey $apiKey) => user()?->can('update', $apiKey->user) ? EditUser::getUrl(['record' => $apiKey->user]) : null),
]) ])
->recordActions([ ->recordActions([
DeleteAction::make() DeleteAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge),
]) ])
->emptyStateIcon('tabler-key') ->toolbarActions([
CreateAction::make(),
])
->emptyStateIcon(TablerIcon::Key)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/apikey.empty')); ->emptyStateHeading(trans('admin/apikey.empty'));
} }
@@ -109,12 +114,44 @@ class ApiKeyResource extends Resource
*/ */
public static function defaultForm(Schema $schema): Schema public static function defaultForm(Schema $schema): Schema
{ {
$permissionList = ApiKey::getPermissionList();
return $schema return $schema
->components([ ->components([
Section::make(trans('admin/apikey.permissions.all'))
->description(trans('admin/apikey.permissions.all_description'))
->columnSpanFull()
->schema([
ToggleButtons::make('permissions_all')
->hiddenLabel()
->inline()
->options([
0 => trans('admin/apikey.permissions.none'),
1 => trans('admin/apikey.permissions.read'),
3 => trans('admin/apikey.permissions.read_write'),
])
->icons([
0 => TablerIcon::BookOff,
1 => TablerIcon::Book,
3 => TablerIcon::Writing,
])
->colors([
0 => 'success',
1 => 'warning',
3 => 'danger',
])
->live()
->afterStateUpdated(function ($state, callable $set) use ($permissionList) {
foreach ($permissionList as $resource) {
$set('permissions_' . $resource, $state);
}
})
->default(0),
]),
Fieldset::make('Permissions') Fieldset::make('Permissions')
->columnSpanFull() ->columnSpanFull()
->schema( ->schema(
collect(ApiKey::getPermissionList())->map(fn ($resource) => ToggleButtons::make('permissions_' . $resource) collect($permissionList)->map(fn ($resource) => ToggleButtons::make('permissions_' . $resource)
->label(str($resource)->replace('_', ' ')->title())->inline() ->label(str($resource)->replace('_', ' ')->title())->inline()
->options([ ->options([
0 => trans('admin/apikey.permissions.none'), 0 => trans('admin/apikey.permissions.none'),
@@ -122,9 +159,9 @@ class ApiKeyResource extends Resource
3 => trans('admin/apikey.permissions.read_write'), 3 => trans('admin/apikey.permissions.read_write'),
]) ])
->icons([ ->icons([
0 => 'tabler-book-off', 0 => TablerIcon::BookOff,
1 => 'tabler-book', 1 => TablerIcon::Book,
3 => 'tabler-writing', 3 => TablerIcon::Writing,
]) ])
->colors([ ->colors([
0 => 'success', 0 => 'success',

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\ApiKeys\Pages; namespace App\Filament\Admin\Resources\ApiKeys\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\ApiKeys\ApiKeyResource; use App\Filament\Admin\Resources\ApiKeys\ApiKeyResource;
use App\Models\ApiKey; use App\Models\ApiKey;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
@@ -9,7 +10,6 @@ use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
use Filament\Support\Enums\IconSize;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@@ -26,9 +26,12 @@ class CreateApiKey extends CreateRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
$this->getCreateFormAction()->formId('form') Action::make('create')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-file-plus'), ->action('create')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label'))
->icon(TablerIcon::FilePlus),
]; ];
} }

View File

@@ -5,11 +5,7 @@ namespace App\Filament\Admin\Resources\ApiKeys\Pages;
use App\Filament\Admin\Resources\ApiKeys\ApiKeyResource; use App\Filament\Admin\Resources\ApiKeys\ApiKeyResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListApiKeys extends ListRecords class ListApiKeys extends ListRecords
{ {
@@ -17,14 +13,4 @@ class ListApiKeys extends ListRecords
use CanCustomizeHeaderWidgets; use CanCustomizeHeaderWidgets;
protected static string $resource = ApiKeyResource::class; protected static string $resource = ApiKeyResource::class;
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->icon('tabler-file-plus'),
];
}
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\DatabaseHosts; namespace App\Filament\Admin\Resources\DatabaseHosts;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\DatabaseHosts\Pages\CreateDatabaseHost; use App\Filament\Admin\Resources\DatabaseHosts\Pages\CreateDatabaseHost;
use App\Filament\Admin\Resources\DatabaseHosts\Pages\EditDatabaseHost; use App\Filament\Admin\Resources\DatabaseHosts\Pages\EditDatabaseHost;
use App\Filament\Admin\Resources\DatabaseHosts\Pages\ListDatabaseHosts; use App\Filament\Admin\Resources\DatabaseHosts\Pages\ListDatabaseHosts;
@@ -12,7 +13,10 @@ use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations; use App\Traits\Filament\CanCustomizeRelations;
use App\Traits\Filament\CanModifyForm; use App\Traits\Filament\CanModifyForm;
use App\Traits\Filament\CanModifyTable; use App\Traits\Filament\CanModifyTable;
use BackedEnum;
use Exception; use Exception;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Actions\ViewAction; use Filament\Actions\ViewAction;
@@ -37,7 +41,7 @@ class DatabaseHostResource extends Resource
protected static ?string $model = DatabaseHost::class; protected static ?string $model = DatabaseHost::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-database'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Database;
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
@@ -94,10 +98,13 @@ class DatabaseHostResource extends Resource
->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()),
EditAction::make(), EditAction::make(),
]) ])
->groupedBulkActions([ ->toolbarActions([
DeleteBulkAction::make(), CreateAction::make(),
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]) ])
->emptyStateIcon('tabler-database') ->emptyStateIcon(TablerIcon::Database)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/databasehost.no_database_hosts')); ->emptyStateHeading(trans('admin/databasehost.no_database_hosts'));
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\DatabaseHosts\Pages; namespace App\Filament\Admin\Resources\DatabaseHosts\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\DatabaseHosts\DatabaseHostResource; use App\Filament\Admin\Resources\DatabaseHosts\DatabaseHostResource;
use App\Services\Databases\Hosts\HostCreationService; use App\Services\Databases\Hosts\HostCreationService;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
@@ -175,7 +176,7 @@ class CreateDatabaseHost extends CreateRecord
->title(trans('admin/databasehost.error')) ->title(trans('admin/databasehost.error'))
->body($exception->getMessage()) ->body($exception->getMessage())
->color('danger') ->color('danger')
->icon('tabler-database') ->icon(TablerIcon::Database)
->danger() ->danger()
->send(); ->send();

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\DatabaseHosts\Pages; namespace App\Filament\Admin\Resources\DatabaseHosts\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\DatabaseHosts\DatabaseHostResource; use App\Filament\Admin\Resources\DatabaseHosts\DatabaseHostResource;
use App\Models\DatabaseHost; use App\Models\DatabaseHost;
use App\Services\Databases\Hosts\HostUpdateService; use App\Services\Databases\Hosts\HostUpdateService;
@@ -12,7 +13,6 @@ use Filament\Actions\ActionGroup;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Filament\Support\Enums\IconSize;
use Filament\Support\Exceptions\Halt; use Filament\Support\Exceptions\Halt;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use PDOException; use PDOException;
@@ -36,12 +36,14 @@ class EditDatabaseHost extends EditRecord
{ {
return [ return [
DeleteAction::make() DeleteAction::make()
->label(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0 ? trans('admin/databasehost.delete_help') : trans('filament-actions::delete.single.modal.actions.delete.label')) ->tooltip(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0 ? trans('admin/databasehost.delete_help') : trans('filament-actions::delete.single.modal.actions.delete.label'))
->disabled(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0) ->disabled(fn (DatabaseHost $databaseHost) => $databaseHost->databases()->count() > 0),
->iconButton()->iconSize(IconSize::ExtraLarge), Action::make('save')
$this->getSaveFormAction()->formId('form') ->hiddenLabel()
->iconButton()->iconSize(IconSize::ExtraLarge) ->action('save')
->icon('tabler-device-floppy'), ->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }
@@ -63,7 +65,7 @@ class EditDatabaseHost extends EditRecord
->title(trans('admin/databasehost.error')) ->title(trans('admin/databasehost.error'))
->body($exception->getMessage()) ->body($exception->getMessage())
->color('danger') ->color('danger')
->icon('tabler-database') ->icon(TablerIcon::Database)
->danger() ->danger()
->send(); ->send();

View File

@@ -5,11 +5,7 @@ namespace App\Filament\Admin\Resources\DatabaseHosts\Pages;
use App\Filament\Admin\Resources\DatabaseHosts\DatabaseHostResource; use App\Filament\Admin\Resources\DatabaseHosts\DatabaseHostResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListDatabaseHosts extends ListRecords class ListDatabaseHosts extends ListRecords
{ {
@@ -17,14 +13,4 @@ class ListDatabaseHosts extends ListRecords
use CanCustomizeHeaderWidgets; use CanCustomizeHeaderWidgets;
protected static string $resource = DatabaseHostResource::class; protected static string $resource = DatabaseHostResource::class;
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->icon('tabler-file-plus'),
];
}
} }

View File

@@ -9,7 +9,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord; use Filament\Resources\Pages\ViewRecord;
use Filament\Support\Enums\IconSize;
class ViewDatabaseHost extends ViewRecord class ViewDatabaseHost extends ViewRecord
{ {
@@ -22,8 +21,7 @@ class ViewDatabaseHost extends ViewRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
EditAction::make() EditAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge),
]; ];
} }
} }

View File

@@ -10,7 +10,6 @@ use Filament\Actions\ViewAction;
use Filament\Forms\Components\TextInput; use Filament\Forms\Components\TextInput;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
@@ -70,8 +69,7 @@ class DatabasesRelationManager extends RelationManager
->recordActions([ ->recordActions([
ViewAction::make() ViewAction::make()
->color('primary'), ->color('primary'),
DeleteAction::make() DeleteAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge),
]); ]);
} }
} }

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Eggs; namespace App\Filament\Admin\Resources\Eggs;
use App\Enums\CustomizationKey; use App\Enums\CustomizationKey;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Eggs\Pages\CreateEgg; use App\Filament\Admin\Resources\Eggs\Pages\CreateEgg;
use App\Filament\Admin\Resources\Eggs\Pages\EditEgg; use App\Filament\Admin\Resources\Eggs\Pages\EditEgg;
use App\Filament\Admin\Resources\Eggs\Pages\ListEggs; use App\Filament\Admin\Resources\Eggs\Pages\ListEggs;
@@ -10,6 +11,7 @@ use App\Filament\Admin\Resources\Eggs\RelationManagers\ServersRelationManager;
use App\Models\Egg; use App\Models\Egg;
use App\Traits\Filament\CanCustomizePages; use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations; use App\Traits\Filament\CanCustomizeRelations;
use BackedEnum;
use Filament\Resources\Pages\PageRegistration; use Filament\Resources\Pages\PageRegistration;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Resources\Resource; use Filament\Resources\Resource;
@@ -21,7 +23,7 @@ class EggResource extends Resource
protected static ?string $model = Egg::class; protected static ?string $model = Egg::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-eggs'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Eggs;
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Eggs\Pages; namespace App\Filament\Admin\Resources\Eggs\Pages;
use App\Enums\EditorLanguages; use App\Enums\EditorLanguages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Eggs\EggResource; use App\Filament\Admin\Resources\Eggs\EggResource;
use App\Filament\Components\Forms\Fields\CopyFrom; use App\Filament\Components\Forms\Fields\CopyFrom;
use App\Filament\Components\Forms\Fields\MonacoEditor; use App\Filament\Components\Forms\Fields\MonacoEditor;
@@ -28,7 +29,6 @@ use Filament\Schemas\Components\Tabs\Tab;
use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\IconSize;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Validation\Rules\Unique; use Illuminate\Validation\Rules\Unique;
@@ -47,9 +47,12 @@ class CreateEgg extends CreateRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
$this->getCreateFormAction()->formId('form') Action::make('create')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-file-plus'), ->action('create')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label'))
->icon(TablerIcon::FilePlus),
]; ];
} }
@@ -116,7 +119,7 @@ class CreateEgg extends CreateRecord
->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 1]), ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 1, 'lg' => 1]),
Toggle::make('force_outgoing_ip') Toggle::make('force_outgoing_ip')
->label(trans('admin/egg.force_ip')) ->label(trans('admin/egg.force_ip'))
->hintIcon('tabler-question-mark', trans('admin/egg.force_ip_help')), ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.force_ip_help')),
Hidden::make('script_is_privileged') Hidden::make('script_is_privileged')
->default(1), ->default(1),
TagsInput::make('tags') TagsInput::make('tags')
@@ -124,7 +127,7 @@ class CreateEgg extends CreateRecord
->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]), ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]),
TextInput::make('update_url') TextInput::make('update_url')
->label(trans('admin/egg.update_url')) ->label(trans('admin/egg.update_url'))
->hintIcon('tabler-question-mark', trans('admin/egg.update_url_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.update_url_help'))
->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2])
->url(), ->url(),
KeyValue::make('docker_images') KeyValue::make('docker_images')
@@ -214,7 +217,7 @@ class CreateEgg extends CreateRecord
->maxLength(255) ->maxLength(255)
->prefix('{{') ->prefix('{{')
->suffix('}}') ->suffix('}}')
->hintIcon('tabler-code', fn ($state) => "{{{$state}}}") ->hintIcon(TablerIcon::Code, fn ($state) => "{{{$state}}}")
->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id'))) ->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id')))
->rules(EggVariable::getRulesForField('env_variable')) ->rules(EggVariable::getRulesForField('env_variable'))
->validationMessages([ ->validationMessages([

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Eggs\Pages; namespace App\Filament\Admin\Resources\Eggs\Pages;
use App\Enums\EditorLanguages; use App\Enums\EditorLanguages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Eggs\EggResource; use App\Filament\Admin\Resources\Eggs\EggResource;
use App\Filament\Components\Actions\ExportEggAction; use App\Filament\Components\Actions\ExportEggAction;
use App\Filament\Components\Actions\ImportEggAction; use App\Filament\Components\Actions\ImportEggAction;
@@ -70,7 +71,7 @@ class EditEgg extends EditRecord
Tab::make('configuration') Tab::make('configuration')
->label(trans('admin/egg.tabs.configuration')) ->label(trans('admin/egg.tabs.configuration'))
->columns(['default' => 2, 'sm' => 2, 'md' => 4, 'lg' => 6]) ->columns(['default' => 2, 'sm' => 2, 'md' => 4, 'lg' => 6])
->icon('tabler-egg') ->icon(TablerIcon::Egg)
->schema([ ->schema([
Grid::make(2) Grid::make(2)
->columnSpan(1) ->columnSpan(1)
@@ -84,9 +85,10 @@ class EditEgg extends EditRecord
->columnSpanFull(), ->columnSpanFull(),
Flex::make([ Flex::make([
Action::make('uploadImage') Action::make('uploadImage')
->iconButton() ->hiddenLabel()
->tooltip(trans('admin/egg.import.import_image'))
->iconSize(IconSize::Large) ->iconSize(IconSize::Large)
->icon('tabler-photo-up') ->icon(TablerIcon::PhotoUp)
->modal() ->modal()
->modalHeading('') ->modalHeading('')
->modalSubmitActionLabel(trans('admin/egg.import.import_image')) ->modalSubmitActionLabel(trans('admin/egg.import.import_image'))
@@ -209,8 +211,8 @@ class EditEgg extends EditRecord
Action::make('delete_image') Action::make('delete_image')
->visible(fn ($record) => $record->image) ->visible(fn ($record) => $record->image)
->hiddenLabel() ->hiddenLabel()
->icon('tabler-trash') ->tooltip(trans('admin/egg.import.delete_image'))
->iconButton() ->icon(TablerIcon::Trash)
->iconSize(IconSize::Large) ->iconSize(IconSize::Large)
->color('danger') ->color('danger')
->action(function ($record) { ->action(function ($record) {
@@ -262,7 +264,7 @@ class EditEgg extends EditRecord
->inline(false) ->inline(false)
->label(trans('admin/egg.force_ip')) ->label(trans('admin/egg.force_ip'))
->columnSpan(1) ->columnSpan(1)
->hintIcon('tabler-question-mark', trans('admin/egg.force_ip_help')), ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.force_ip_help')),
KeyValue::make('startup_commands') KeyValue::make('startup_commands')
->label(trans('admin/egg.startup_commands')) ->label(trans('admin/egg.startup_commands'))
->live() ->live()
@@ -280,7 +282,7 @@ class EditEgg extends EditRecord
TextInput::make('update_url') TextInput::make('update_url')
->label(trans('admin/egg.update_url')) ->label(trans('admin/egg.update_url'))
->url() ->url()
->hintIcon('tabler-question-mark', trans('admin/egg.update_url_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/egg.update_url_help'))
->columnSpan(['default' => 2, 'sm' => 2, 'md' => 2, 'lg' => 3]), ->columnSpan(['default' => 2, 'sm' => 2, 'md' => 2, 'lg' => 3]),
TagsInput::make('features') TagsInput::make('features')
->label(trans('admin/egg.features')) ->label(trans('admin/egg.features'))
@@ -303,7 +305,7 @@ class EditEgg extends EditRecord
Tab::make('process_management') Tab::make('process_management')
->label(trans('admin/egg.tabs.process_management')) ->label(trans('admin/egg.tabs.process_management'))
->columns() ->columns()
->icon('tabler-server-cog') ->icon(TablerIcon::ServerCog)
->schema([ ->schema([
CopyFrom::make('copy_process_from') CopyFrom::make('copy_process_from')
->process(), ->process(),
@@ -324,7 +326,7 @@ class EditEgg extends EditRecord
Tab::make('egg_variables') Tab::make('egg_variables')
->label(trans('admin/egg.tabs.egg_variables')) ->label(trans('admin/egg.tabs.egg_variables'))
->columnSpanFull() ->columnSpanFull()
->icon('tabler-variable') ->icon(TablerIcon::Variable)
->schema([ ->schema([
Repeater::make('variables') Repeater::make('variables')
->hiddenLabel() ->hiddenLabel()
@@ -372,7 +374,7 @@ class EditEgg extends EditRecord
->maxLength(255) ->maxLength(255)
->prefix('{{') ->prefix('{{')
->suffix('}}') ->suffix('}}')
->hintIcon('tabler-code', fn ($state) => "{{{$state}}}") ->hintIcon(TablerIcon::Code, fn ($state) => "{{{$state}}}")
->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id'))) ->unique(modifyRuleUsing: fn (Unique $rule, Get $get) => $rule->where('egg_id', $get('../../id')))
->rules(EggVariable::getRulesForField('env_variable')) ->rules(EggVariable::getRulesForField('env_variable'))
->validationMessages([ ->validationMessages([
@@ -416,7 +418,7 @@ class EditEgg extends EditRecord
Tab::make('install_script') Tab::make('install_script')
->label(trans('admin/egg.tabs.install_script')) ->label(trans('admin/egg.tabs.install_script'))
->columns(3) ->columns(3)
->icon('tabler-file-download') ->icon(TablerIcon::FileDownload)
->schema([ ->schema([
CopyFrom::make('copy_script_from') CopyFrom::make('copy_script_from')
->script(), ->script(),
@@ -448,24 +450,16 @@ class EditEgg extends EditRecord
return [ return [
DeleteAction::make() DeleteAction::make()
->disabled(fn (Egg $egg): bool => $egg->servers()->count() > 0) ->disabled(fn (Egg $egg): bool => $egg->servers()->count() > 0)
->label(fn (Egg $egg): string => $egg->servers()->count() <= 0 ? trans('filament-actions::delete.single.label') : trans('admin/egg.in_use')) ->tooltip(fn (Egg $egg): string => $egg->servers()->count() <= 0 ? trans('filament-actions::delete.single.label') : trans('admin/egg.in_use')),
->successNotification(fn (Egg $egg) => Notification::make()
->success()
->title(trans('admin/egg.delete_success'))
->body(trans('admin/egg.deleted', ['egg' => $egg->name]))
)
->failureNotification(fn (Egg $egg) => Notification::make()
->danger()
->title(trans('admin/egg.delete_failed'))
->body(trans('admin/egg.could_not_delete', ['egg' => $egg->name]))
)
->iconButton()->iconSize(IconSize::ExtraLarge),
ExportEggAction::make(), ExportEggAction::make(),
ImportEggAction::make() ImportEggAction::make()
->multiple(false), ->multiple(false),
$this->getSaveFormAction()->formId('form') Action::make('save')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-device-floppy'), ->action('save')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Eggs\Pages; namespace App\Filament\Admin\Resources\Eggs\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Eggs\EggResource; use App\Filament\Admin\Resources\Eggs\EggResource;
use App\Filament\Components\Actions\ExportEggAction; use App\Filament\Components\Actions\ExportEggAction;
use App\Filament\Components\Actions\ImportEggAction; use App\Filament\Components\Actions\ImportEggAction;
@@ -12,15 +13,13 @@ use App\Models\Egg;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\BulkActionGroup;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction; use Filament\Actions\CreateAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Actions\ReplicateAction; use Filament\Actions\ReplicateAction;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\ImageColumn; use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
@@ -65,19 +64,13 @@ class ListEggs extends ListRecords
]) ])
->recordActions([ ->recordActions([
EditAction::make() EditAction::make()
->iconButton() ->tooltip(trans('filament-actions::edit.single.label')),
->tooltip(trans('filament-actions::edit.single.label'))
->iconSize(IconSize::Large),
ExportEggAction::make() ExportEggAction::make()
->tooltip(trans('filament-actions::export.modal.actions.export.label')) ->tooltip(trans('filament-actions::export.modal.actions.export.label')),
->iconSize(IconSize::Large),
UpdateEggAction::make() UpdateEggAction::make()
->tooltip(trans_choice('admin/egg.update', 1)) ->tooltip(trans_choice('admin/egg.update', 1)),
->iconSize(IconSize::Large),
ReplicateAction::make() ReplicateAction::make()
->iconButton()
->tooltip(trans('filament-actions::replicate.single.label')) ->tooltip(trans('filament-actions::replicate.single.label'))
->iconSize(IconSize::Large)
->modal(false) ->modal(false)
->excludeAttributes(['author', 'uuid', 'update_url', 'servers_count', 'created_at', 'updated_at']) ->excludeAttributes(['author', 'uuid', 'update_url', 'servers_count', 'created_at', 'updated_at'])
->beforeReplicaSaved(function (Egg $replica) { ->beforeReplicaSaved(function (Egg $replica) {
@@ -88,49 +81,54 @@ class ListEggs extends ListRecords
->after(fn (Egg $record, Egg $replica) => $record->variables->each(fn ($variable) => $variable->replicate()->fill(['egg_id' => $replica->id])->save())) ->after(fn (Egg $record, Egg $replica) => $record->variables->each(fn ($variable) => $variable->replicate()->fill(['egg_id' => $replica->id])->save()))
->successRedirectUrl(fn (Egg $replica) => EditEgg::getUrl(['record' => $replica])), ->successRedirectUrl(fn (Egg $replica) => EditEgg::getUrl(['record' => $replica])),
]) ])
->groupedBulkActions([ ->toolbarActions([
DeleteBulkAction::make() ImportEggAction::make()
->before(function (Collection &$records) { ->multiple(),
$eggsWithServers = $records->filter(fn (Egg $egg) => $egg->servers_count > 0); CreateAction::make(),
BulkActionGroup::make([
DeleteBulkAction::make()
->before(function (Collection &$records) {
$eggsWithServers = $records->filter(fn (Egg $egg) => $egg->servers_count > 0);
if ($eggsWithServers->isNotEmpty()) { if ($eggsWithServers->isNotEmpty()) {
$eggNames = $eggsWithServers->map(fn (Egg $egg) => sprintf('%s (%d server%s)', $egg->name, $egg->servers_count, $egg->servers_count > 1 ? 's' : '')) $eggNames = $eggsWithServers->map(fn (Egg $egg) => sprintf('%s (%d server%s)', $egg->name, $egg->servers_count, $egg->servers_count > 1 ? 's' : ''))
->join(', '); ->join(', ');
Notification::make() Notification::make()
->danger() ->danger()
->title(trans('admin/egg.cannot_delete', ['count' => $eggsWithServers->count()])) ->title(trans('admin/egg.cannot_delete', ['count' => $eggsWithServers->count()]))
->body(trans('admin/egg.eggs_have_servers', ['eggs' => $eggNames])) ->body(trans('admin/egg.eggs_have_servers', ['eggs' => $eggNames]))
->send(); ->send();
} }
$records = $records->filter(fn (Egg $egg) => $egg->servers_count <= 0); $records = $records->filter(fn (Egg $egg) => $egg->servers_count <= 0);
if ($records->isEmpty()) { if ($records->isEmpty()) {
$this->halt(); $this->halt();
} }
}), }),
UpdateEggBulkAction::make() UpdateEggBulkAction::make()
->before(function (Collection &$records) { ->before(function (Collection &$records) {
$eggsWithoutUpdateUrl = $records->filter(fn (Egg $egg) => $egg->update_url === null); $eggsWithoutUpdateUrl = $records->filter(fn (Egg $egg) => $egg->update_url === null);
if ($eggsWithoutUpdateUrl->isNotEmpty()) { if ($eggsWithoutUpdateUrl->isNotEmpty()) {
$eggNames = $eggsWithoutUpdateUrl->pluck('name')->join(', '); $eggNames = $eggsWithoutUpdateUrl->pluck('name')->join(', ');
Notification::make() Notification::make()
->warning() ->warning()
->title(trans('admin/egg.cannot_update', ['count' => $eggsWithoutUpdateUrl->count()])) ->title(trans('admin/egg.cannot_update', ['count' => $eggsWithoutUpdateUrl->count()]))
->body(trans('admin/egg.no_update_url', ['eggs' => $eggNames])) ->body(trans('admin/egg.no_update_url', ['eggs' => $eggNames]))
->send(); ->send();
} }
$records = $records->filter(fn (Egg $egg) => $egg->update_url !== null); $records = $records->filter(fn (Egg $egg) => $egg->update_url !== null);
if ($records->isEmpty()) { if ($records->isEmpty()) {
$this->halt(); $this->halt();
} }
}), }),
]),
]) ])
->emptyStateIcon('tabler-eggs') ->emptyStateIcon(TablerIcon::Eggs)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/egg.no_eggs')) ->emptyStateHeading(trans('admin/egg.no_eggs'))
->filters([ ->filters([
@@ -138,18 +136,4 @@ class ListEggs extends ListRecords
->model(Egg::class), ->model(Egg::class),
]); ]);
} }
/** @return array<Action|ActionGroup>
* @throws Exception
*/
protected function getDefaultHeaderActions(): array
{
return [
ImportEggAction::make()
->multiple(),
CreateAction::make()
->icon('tabler-file-plus')
->iconButton()->iconSize(IconSize::ExtraLarge),
];
}
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Mounts; namespace App\Filament\Admin\Resources\Mounts;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Mounts\Pages\CreateMount; use App\Filament\Admin\Resources\Mounts\Pages\CreateMount;
use App\Filament\Admin\Resources\Mounts\Pages\EditMount; use App\Filament\Admin\Resources\Mounts\Pages\EditMount;
use App\Filament\Admin\Resources\Mounts\Pages\ListMounts; use App\Filament\Admin\Resources\Mounts\Pages\ListMounts;
@@ -11,7 +12,10 @@ use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations; use App\Traits\Filament\CanCustomizeRelations;
use App\Traits\Filament\CanModifyForm; use App\Traits\Filament\CanModifyForm;
use App\Traits\Filament\CanModifyTable; use App\Traits\Filament\CanModifyTable;
use BackedEnum;
use Exception; use Exception;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Actions\ViewAction; use Filament\Actions\ViewAction;
@@ -37,7 +41,7 @@ class MountResource extends Resource
protected static ?string $model = Mount::class; protected static ?string $model = Mount::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-layers-linked'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::LayersLinked;
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
@@ -88,7 +92,7 @@ class MountResource extends Resource
TextColumn::make('read_only') TextColumn::make('read_only')
->label(trans('admin/mount.table.read_only')) ->label(trans('admin/mount.table.read_only'))
->badge() ->badge()
->icon(fn ($state) => $state ? 'tabler-writing-off' : 'tabler-writing') ->icon(fn ($state) => $state ? TablerIcon::WritingOff : TablerIcon::Writing)
->color(fn ($state) => $state ? 'success' : 'warning') ->color(fn ($state) => $state ? 'success' : 'warning')
->formatStateUsing(fn ($state) => $state ? trans('admin/mount.toggles.read_only') : trans('admin/mount.toggles.writable')), ->formatStateUsing(fn ($state) => $state ? trans('admin/mount.toggles.read_only') : trans('admin/mount.toggles.writable')),
]) ])
@@ -97,10 +101,13 @@ class MountResource extends Resource
->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()),
EditAction::make(), EditAction::make(),
]) ])
->groupedBulkActions([ ->toolbarActions([
DeleteBulkAction::make(), CreateAction::make(),
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]) ])
->emptyStateIcon('tabler-layers-linked') ->emptyStateIcon(TablerIcon::LayersLinked)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/mount.no_mounts')); ->emptyStateHeading(trans('admin/mount.no_mounts'));
} }
@@ -127,8 +134,8 @@ class MountResource extends Resource
true => trans('admin/mount.toggles.read_only'), true => trans('admin/mount.toggles.read_only'),
]) ])
->icons([ ->icons([
false => 'tabler-writing', false => TablerIcon::Writing,
true => 'tabler-writing-off', true => TablerIcon::WritingOff,
]) ])
->colors([ ->colors([
false => 'warning', false => 'warning',

View File

@@ -2,13 +2,13 @@
namespace App\Filament\Admin\Resources\Mounts\Pages; namespace App\Filament\Admin\Resources\Mounts\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Mounts\MountResource; use App\Filament\Admin\Resources\Mounts\MountResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
use Filament\Support\Enums\IconSize;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@@ -25,9 +25,12 @@ class CreateMount extends CreateRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
$this->getCreateFormAction()->formId('form') Action::make('create')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-file-plus'), ->action('create')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label'))
->icon(TablerIcon::FilePlus),
]; ];
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Mounts\Pages; namespace App\Filament\Admin\Resources\Mounts\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Mounts\MountResource; use App\Filament\Admin\Resources\Mounts\MountResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
@@ -9,7 +10,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Filament\Support\Enums\IconSize;
class EditMount extends EditRecord class EditMount extends EditRecord
{ {
@@ -22,11 +22,13 @@ class EditMount extends EditRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
DeleteAction::make() DeleteAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge), Action::make('save')
$this->getSaveFormAction()->formId('form') ->hiddenLabel()
->iconButton()->iconSize(IconSize::ExtraLarge) ->action('save')
->icon('tabler-device-floppy'), ->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }

View File

@@ -5,11 +5,7 @@ namespace App\Filament\Admin\Resources\Mounts\Pages;
use App\Filament\Admin\Resources\Mounts\MountResource; use App\Filament\Admin\Resources\Mounts\MountResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListMounts extends ListRecords class ListMounts extends ListRecords
{ {
@@ -17,14 +13,4 @@ class ListMounts extends ListRecords
use CanCustomizeHeaderWidgets; use CanCustomizeHeaderWidgets;
protected static string $resource = MountResource::class; protected static string $resource = MountResource::class;
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->icon('tabler-file-plus'),
];
}
} }

View File

@@ -9,7 +9,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord; use Filament\Resources\Pages\ViewRecord;
use Filament\Support\Enums\IconSize;
class ViewMount extends ViewRecord class ViewMount extends ViewRecord
{ {
@@ -22,9 +21,7 @@ class ViewMount extends ViewRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
EditAction::make() EditAction::make(),
->iconSize(IconSize::ExtraLarge)
->iconButton(),
]; ];
} }
} }

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Nodes; namespace App\Filament\Admin\Resources\Nodes;
use App\Enums\CustomizationKey; use App\Enums\CustomizationKey;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Nodes\Pages\CreateNode; use App\Filament\Admin\Resources\Nodes\Pages\CreateNode;
use App\Filament\Admin\Resources\Nodes\Pages\EditNode; use App\Filament\Admin\Resources\Nodes\Pages\EditNode;
use App\Filament\Admin\Resources\Nodes\Pages\ListNodes; use App\Filament\Admin\Resources\Nodes\Pages\ListNodes;
@@ -11,6 +12,7 @@ use App\Filament\Admin\Resources\Nodes\RelationManagers\ServersRelationManager;
use App\Models\Node; use App\Models\Node;
use App\Traits\Filament\CanCustomizePages; use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations; use App\Traits\Filament\CanCustomizeRelations;
use BackedEnum;
use Filament\Resources\Pages\PageRegistration; use Filament\Resources\Pages\PageRegistration;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Resources\Resource; use Filament\Resources\Resource;
@@ -23,7 +25,7 @@ class NodeResource extends Resource
protected static ?string $model = Node::class; protected static ?string $model = Node::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-server-2'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Server2;
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Nodes\Pages; namespace App\Filament\Admin\Resources\Nodes\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Nodes\NodeResource; use App\Filament\Admin\Resources\Nodes\NodeResource;
use App\Models\Node; use App\Models\Node;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
@@ -39,13 +40,14 @@ class CreateNode extends CreateRecord
->components([ ->components([
Wizard::make($this->getSteps()) Wizard::make($this->getSteps())
->columnSpanFull() ->columnSpanFull()
->nextAction(fn (Action $action) => $action->iconButton()->iconSize(IconSize::ExtraLarge)->icon('tabler-arrow-right')) ->nextAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowRight))
->previousAction(fn (Action $action) => $action->iconButton()->iconSize(IconSize::ExtraLarge)->icon('tabler-arrow-left')) ->previousAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowLeft))
->submitAction(new HtmlString(Blade::render(<<<'BLADE' ->submitAction(new HtmlString(Blade::render(<<<'BLADE'
<x-filament::icon-button <x-filament::icon-button
type="submit" type="submit"
iconSize="xl" iconSize="xl"
icon="tabler-file-plus" icon="tabler-plus"
tooltip="{{ trans('admin/node.create') }}"
> >
{{ trans('admin/node.create') }} {{ trans('admin/node.create') }}
</x-filament::icon-button> </x-filament::icon-button>
@@ -59,7 +61,7 @@ class CreateNode extends CreateRecord
return [ return [
Step::make('basic') Step::make('basic')
->label(trans('admin/node.tabs.basic_settings')) ->label(trans('admin/node.tabs.basic_settings'))
->icon('tabler-server') ->icon(TablerIcon::Server)
->columnSpanFull() ->columnSpanFull()
->columns([ ->columns([
'default' => 2, 'default' => 2,
@@ -203,9 +205,9 @@ class CreateNode extends CreateRecord
'https_proxy' => 'success', 'https_proxy' => 'success',
]) ])
->icons([ ->icons([
'http' => 'tabler-lock-open-off', 'http' => TablerIcon::LockOpenOff,
'https' => 'tabler-lock', 'https' => TablerIcon::Lock,
'https_proxy' => 'tabler-shield-lock', 'https_proxy' => TablerIcon::ShieldLock,
]) ])
->default(fn () => request()->isSecure() ? 'https' : 'http') ->default(fn () => request()->isSecure() ? 'https' : 'http')
->live() ->live()
@@ -231,7 +233,7 @@ class CreateNode extends CreateRecord
]), ]),
Step::make('advanced') Step::make('advanced')
->label(trans('admin/node.tabs.advanced_settings')) ->label(trans('admin/node.tabs.advanced_settings'))
->icon('tabler-server-cog') ->icon(TablerIcon::ServerCog)
->columnSpanFull() ->columnSpanFull()
->columns([ ->columns([
'default' => 2, 'default' => 2,
@@ -244,7 +246,7 @@ class CreateNode extends CreateRecord
->label(trans('admin/node.maintenance_mode'))->inline() ->label(trans('admin/node.maintenance_mode'))->inline()
->columnSpan(1) ->columnSpan(1)
->default(false) ->default(false)
->hintIcon('tabler-question-mark', trans('admin/node.maintenance_mode_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.maintenance_mode_help'))
->options([ ->options([
true => trans('admin/node.enabled'), true => trans('admin/node.enabled'),
false => trans('admin/node.disabled'), false => trans('admin/node.disabled'),
@@ -270,12 +272,20 @@ class CreateNode extends CreateRecord
->columnSpan(2), ->columnSpan(2),
TextInput::make('upload_size') TextInput::make('upload_size')
->label(trans('admin/node.upload_limit')) ->label(trans('admin/node.upload_limit'))
->hintIcon('tabler-question-mark', trans('admin/node.upload_limit_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.upload_limit_help'))
->columnSpan(1) ->columnSpan(1)
->numeric()->required() ->numeric()->required()
->default(256) ->default(256)
->minValue(1) ->minValue(1)
->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'), ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'),
TextInput::make('daemon_base')
->label(trans('admin/node.daemon_base'))
->placeholder('/var/lib/pelican/volumes')
->hintIcon(TablerIcon::QuestionMark, trans('admin/node.daemon_base_help'))
->columnSpan(1)
->required()
->default('/var/lib/pelican/volumes')
->rule('regex:/^([\/][\d\w.\-\/]+)$/'),
TextInput::make('daemon_sftp') TextInput::make('daemon_sftp')
->columnSpan(1) ->columnSpan(1)
->label(trans('admin/node.sftp_port')) ->label(trans('admin/node.sftp_port'))
@@ -285,7 +295,7 @@ class CreateNode extends CreateRecord
->required() ->required()
->integer(), ->integer(),
TextInput::make('daemon_sftp_alias') TextInput::make('daemon_sftp_alias')
->columnSpan(2) ->columnSpan(1)
->label(trans('admin/node.sftp_alias')) ->label(trans('admin/node.sftp_alias'))
->helperText(trans('admin/node.sftp_alias_help')), ->helperText(trans('admin/node.sftp_alias_help')),
Grid::make() Grid::make()

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Nodes\Pages; namespace App\Filament\Admin\Resources\Nodes\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Nodes\NodeResource; use App\Filament\Admin\Resources\Nodes\NodeResource;
use App\Models\Node; use App\Models\Node;
use App\Repositories\Daemon\DaemonSystemRepository; use App\Repositories\Daemon\DaemonSystemRepository;
@@ -37,7 +38,6 @@ use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Components\View; use Filament\Schemas\Components\View;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Alignment; use Filament\Support\Enums\Alignment;
use Filament\Support\Enums\IconSize;
use Filament\Support\RawJs; use Filament\Support\RawJs;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
@@ -84,7 +84,7 @@ class EditNode extends EditRecord
return [ return [
Tab::make('overview') Tab::make('overview')
->label(trans('admin/node.tabs.overview')) ->label(trans('admin/node.tabs.overview'))
->icon('tabler-chart-area-line-filled') ->icon(TablerIcon::ChartAreaLineFilled)
->columns([ ->columns([
'default' => 4, 'default' => 4,
'sm' => 2, 'sm' => 2,
@@ -129,7 +129,7 @@ class EditNode extends EditRecord
]), ]),
Tab::make('basic_settings') Tab::make('basic_settings')
->label(trans('admin/node.tabs.basic_settings')) ->label(trans('admin/node.tabs.basic_settings'))
->icon('tabler-server') ->icon(TablerIcon::Server)
->schema([ ->schema([
TextInput::make('fqdn') TextInput::make('fqdn')
->columnSpan(2) ->columnSpan(2)
@@ -253,9 +253,9 @@ class EditNode extends EditRecord
'https_proxy' => 'success', 'https_proxy' => 'success',
]) ])
->icons([ ->icons([
'http' => 'tabler-lock-open-off', 'http' => TablerIcon::LockOpenOff,
'https' => 'tabler-lock', 'https' => TablerIcon::Lock,
'https_proxy' => 'tabler-shield-lock', 'https_proxy' => TablerIcon::ShieldLock,
]) ])
->formatStateUsing(fn (Get $get) => $get('scheme') === 'http' ? 'http' : ($get('behind_proxy') ? 'https_proxy' : 'https')) ->formatStateUsing(fn (Get $get) => $get('scheme') === 'http' ? 'http' : ($get('behind_proxy') ? 'https_proxy' : 'https'))
->live() ->live()
@@ -286,7 +286,7 @@ class EditNode extends EditRecord
'md' => 4, 'md' => 4,
'lg' => 6, 'lg' => 6,
]) ])
->icon('tabler-server-cog') ->icon(TablerIcon::ServerCog)
->schema([ ->schema([
TextInput::make('id') TextInput::make('id')
->label(trans('admin/node.node_id')) ->label(trans('admin/node.node_id'))
@@ -314,7 +314,7 @@ class EditNode extends EditRecord
'default' => 1, 'default' => 1,
'sm' => 1, 'sm' => 1,
'md' => 2, 'md' => 2,
'lg' => 2, 'lg' => 3,
]), ]),
TextInput::make('upload_size') TextInput::make('upload_size')
->columnSpan([ ->columnSpan([
@@ -324,17 +324,29 @@ class EditNode extends EditRecord
'lg' => 1, 'lg' => 1,
]) ])
->label(trans('admin/node.upload_limit')) ->label(trans('admin/node.upload_limit'))
->hintIcon('tabler-question-mark', trans('admin/node.upload_limit_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.upload_limit_help'))
->numeric() ->numeric()
->required() ->required()
->minValue(1) ->minValue(1)
->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'), ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB'),
TextInput::make('daemon_base')
->label(trans('admin/node.daemon_base'))
->placeholder('/var/lib/pelican/volumes')
->hintIcon(TablerIcon::QuestionMark, trans('admin/node.daemon_base_help'))
->columnSpan([
'default' => 1,
'sm' => 1,
'md' => 2,
'lg' => 2,
])
->required()
->rule('regex:/^([\/][\d\w.\-\/]+)$/'),
TextInput::make('daemon_sftp') TextInput::make('daemon_sftp')
->columnSpan([ ->columnSpan([
'default' => 1, 'default' => 1,
'sm' => 1, 'sm' => 1,
'md' => 1, 'md' => 2,
'lg' => 3, 'lg' => 1,
]) ])
->label(trans('admin/node.sftp_port')) ->label(trans('admin/node.sftp_port'))
->minValue(1) ->minValue(1)
@@ -346,8 +358,8 @@ class EditNode extends EditRecord
->columnSpan([ ->columnSpan([
'default' => 1, 'default' => 1,
'sm' => 1, 'sm' => 1,
'md' => 1, 'md' => 2,
'lg' => 3, 'lg' => 2,
]) ])
->label(trans('admin/node.sftp_alias')) ->label(trans('admin/node.sftp_alias'))
->helperText(trans('admin/node.sftp_alias_help')), ->helperText(trans('admin/node.sftp_alias_help')),
@@ -356,7 +368,7 @@ class EditNode extends EditRecord
'default' => 1, 'default' => 1,
'sm' => 1, 'sm' => 1,
'md' => 1, 'md' => 1,
'lg' => 3, 'lg' => 2,
]) ])
->label(trans('admin/node.use_for_deploy')) ->label(trans('admin/node.use_for_deploy'))
->inline() ->inline()
@@ -374,11 +386,11 @@ class EditNode extends EditRecord
'default' => 1, 'default' => 1,
'sm' => 1, 'sm' => 1,
'md' => 1, 'md' => 1,
'lg' => 3, 'lg' => 2,
]) ])
->label(trans('admin/node.maintenance_mode')) ->label(trans('admin/node.maintenance_mode'))
->inline() ->inline()
->hintIcon('tabler-question-mark', trans('admin/node.maintenance_mode_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/node.maintenance_mode_help'))
->stateCast(new BooleanStateCast(false, true)) ->stateCast(new BooleanStateCast(false, true))
->options([ ->options([
1 => trans('admin/node.enabled'), 1 => trans('admin/node.enabled'),
@@ -554,7 +566,7 @@ class EditNode extends EditRecord
]), ]),
Tab::make('config_file') Tab::make('config_file')
->label(trans('admin/node.tabs.config_file')) ->label(trans('admin/node.tabs.config_file'))
->icon('tabler-code') ->icon(TablerIcon::Code)
->schema([ ->schema([
TextEntry::make('instructions') TextEntry::make('instructions')
->label(trans('admin/node.instructions')) ->label(trans('admin/node.instructions'))
@@ -572,11 +584,11 @@ class EditNode extends EditRecord
->columnSpanFull() ->columnSpanFull()
->schema([ ->schema([
Actions::make([ Actions::make([
Action::make('autoDeploy') Action::make('exclude_autoDeploy')
->label(trans('admin/node.auto_deploy')) ->label(trans('admin/node.auto_deploy'))
->color('primary') ->color('primary')
->modalHeading(trans('admin/node.auto_deploy')) ->modalHeading(trans('admin/node.auto_deploy'))
->icon('tabler-rocket') ->icon(TablerIcon::Rocket)
->modalSubmitAction(false) ->modalSubmitAction(false)
->modalCancelAction(false) ->modalCancelAction(false)
->modalFooterActionsAlignment(Alignment::Center) ->modalFooterActionsAlignment(Alignment::Center)
@@ -610,7 +622,7 @@ class EditNode extends EditRecord
}), }),
])->fullWidth(), ])->fullWidth(),
Actions::make([ Actions::make([
Action::make('resetKey') Action::make('exclude_resetKey')
->label(trans('admin/node.reset_token')) ->label(trans('admin/node.reset_token'))
->color('danger') ->color('danger')
->requiresConfirmation() ->requiresConfirmation()
@@ -624,7 +636,7 @@ class EditNode extends EditRecord
->title(trans('admin/node.error_connecting', ['node' => $node->name])) ->title(trans('admin/node.error_connecting', ['node' => $node->name]))
->body(trans('admin/node.error_connecting_description')) ->body(trans('admin/node.error_connecting_description'))
->color('warning') ->color('warning')
->icon('tabler-database') ->icon(TablerIcon::Database)
->warning() ->warning()
->send(); ->send();
@@ -637,7 +649,7 @@ class EditNode extends EditRecord
]), ]),
Tab::make('diagnostics') Tab::make('diagnostics')
->label(trans('admin/node.tabs.diagnostics')) ->label(trans('admin/node.tabs.diagnostics'))
->icon('tabler-heart-search') ->icon(TablerIcon::HeartSearch)
->schema([ ->schema([
Section::make('diag') Section::make('diag')
->heading(trans('admin/node.tabs.diagnostics')) ->heading(trans('admin/node.tabs.diagnostics'))
@@ -646,8 +658,8 @@ class EditNode extends EditRecord
->disabled(fn (Get $get) => $get('pulled')) ->disabled(fn (Get $get) => $get('pulled'))
->headerActions([ ->headerActions([
Action::make('pull') Action::make('pull')
->label(trans('admin/node.diagnostics.pull')) ->tooltip(trans('admin/node.diagnostics.pull'))
->icon('tabler-cloud-download')->iconButton()->iconSize(IconSize::ExtraLarge) ->icon(TablerIcon::CloudDownload)
->hidden(fn (Get $get) => $get('pulled')) ->hidden(fn (Get $get) => $get('pulled'))
->action(function (Get $get, Set $set, Node $node) { ->action(function (Get $get, Set $set, Node $node) {
$includeEndpoints = $get('include_endpoints') ?? true; $includeEndpoints = $get('include_endpoints') ?? true;
@@ -684,9 +696,9 @@ class EditNode extends EditRecord
} }
}), }),
Action::make('upload') Action::make('upload')
->label(trans('admin/node.diagnostics.upload')) ->tooltip(trans('admin/node.diagnostics.upload'))
->visible(fn (Get $get) => $get('pulled') ?? false) ->visible(fn (Get $get) => $get('pulled') ?? false)
->icon('tabler-cloud-upload')->iconButton()->iconSize(IconSize::ExtraLarge) ->icon(TablerIcon::CloudUpload)
->action(function (Get $get, Set $set) { ->action(function (Get $get, Set $set) {
try { try {
$response = Http::asMultipart() $response = Http::asMultipart()
@@ -712,7 +724,7 @@ class EditNode extends EditRecord
->body("{$url}") ->body("{$url}")
->success() ->success()
->actions([ ->actions([
Action::make('viewLogs') Action::make('exclude_viewLogs')
->label(trans('admin/node.diagnostics.view_logs')) ->label(trans('admin/node.diagnostics.view_logs'))
->url($url) ->url($url)
->openUrlInNewTab(true), ->openUrlInNewTab(true),
@@ -732,9 +744,9 @@ class EditNode extends EditRecord
} }
}), }),
Action::make('clear') Action::make('clear')
->label(trans('admin/node.diagnostics.clear')) ->tooltip(trans('admin/node.diagnostics.clear'))
->visible(fn (Get $get) => $get('pulled') ?? false) ->visible(fn (Get $get) => $get('pulled') ?? false)
->icon('tabler-trash')->iconButton()->iconSize(IconSize::ExtraLarge)->color('danger') ->icon(TablerIcon::Trash)->color('danger')
->action(function (Get $get, Set $set) { ->action(function (Get $get, Set $set) {
$set('pulled', false); $set('pulled', false);
$set('uploaded', false); $set('uploaded', false);
@@ -745,13 +757,13 @@ class EditNode extends EditRecord
]) ])
->schema([ ->schema([
ToggleButtons::make('include_endpoints') ToggleButtons::make('include_endpoints')
->hintIcon('tabler-question-mark')->inline() ->hintIcon(TablerIcon::QuestionMark)->inline()
->hintIconTooltip(trans('admin/node.diagnostics.include_endpoints_hint')) ->hintIconTooltip(trans('admin/node.diagnostics.include_endpoints_hint'))
->formatStateUsing(fn () => 1) ->formatStateUsing(fn () => 1)
->boolean(), ->boolean(),
ToggleButtons::make('include_logs') ToggleButtons::make('include_logs')
->live() ->live()
->hintIcon('tabler-question-mark')->inline() ->hintIcon(TablerIcon::QuestionMark)->inline()
->hintIconTooltip(trans('admin/node.diagnostics.include_logs_hint')) ->hintIconTooltip(trans('admin/node.diagnostics.include_logs_hint'))
->formatStateUsing(fn () => 1) ->formatStateUsing(fn () => 1)
->boolean(), ->boolean(),
@@ -808,11 +820,13 @@ class EditNode extends EditRecord
return [ return [
DeleteAction::make() DeleteAction::make()
->disabled(fn (Node $node) => $node->servers()->count() > 0) ->disabled(fn (Node $node) => $node->servers()->count() > 0)
->label(fn (Node $node) => $node->servers()->count() > 0 ? trans('admin/node.node_has_servers') : trans('filament-actions::delete.single.label')) ->tooltip(fn (Node $node) => $node->servers()->count() > 0 ? trans('admin/node.node_has_servers') : trans('filament-actions::delete.single.label')),
->iconButton()->iconSize(IconSize::ExtraLarge), Action::make('save')
$this->getSaveFormAction()->formId('form') ->hiddenLabel()
->iconButton()->iconSize(IconSize::ExtraLarge) ->action('save')
->icon('tabler-device-floppy'), ->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }
@@ -844,7 +858,7 @@ class EditNode extends EditRecord
->title(trans('admin/node.error_connecting', ['node' => $node->name])) ->title(trans('admin/node.error_connecting', ['node' => $node->name]))
->body(trans('admin/node.error_connecting_description')) ->body(trans('admin/node.error_connecting_description'))
->color('warning') ->color('warning')
->icon('tabler-database') ->icon(TablerIcon::Database)
->warning() ->warning()
->send(); ->send();
} }

View File

@@ -2,18 +2,16 @@
namespace App\Filament\Admin\Resources\Nodes\Pages; namespace App\Filament\Admin\Resources\Nodes\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Nodes\NodeResource; use App\Filament\Admin\Resources\Nodes\NodeResource;
use App\Filament\Components\Tables\Columns\NodeHealthColumn; use App\Filament\Components\Tables\Columns\NodeHealthColumn;
use App\Filament\Components\Tables\Filters\TagsFilter; use App\Filament\Components\Tables\Filters\TagsFilter;
use App\Models\Node; use App\Models\Node;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction; use Filament\Actions\CreateAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
@@ -48,14 +46,14 @@ class ListNodes extends ListRecords
IconColumn::make('scheme') IconColumn::make('scheme')
->visibleFrom('xl') ->visibleFrom('xl')
->label('SSL') ->label('SSL')
->trueIcon('tabler-lock') ->trueIcon(TablerIcon::Lock)
->falseIcon('tabler-lock-open-off') ->falseIcon(TablerIcon::LockOpenOff)
->state(fn (Node $node) => $node->scheme === 'https'), ->state(fn (Node $node) => $node->scheme === 'https'),
IconColumn::make('public') IconColumn::make('public')
->label(trans('admin/node.table.public')) ->label(trans('admin/node.table.public'))
->visibleFrom('lg') ->visibleFrom('lg')
->trueIcon('tabler-eye-check') ->trueIcon(TablerIcon::EyeCheck)
->falseIcon('tabler-eye-cancel'), ->falseIcon(TablerIcon::EyeCancel),
TextColumn::make('servers_count') TextColumn::make('servers_count')
->visibleFrom('sm') ->visibleFrom('sm')
->counts('servers') ->counts('servers')
@@ -65,7 +63,10 @@ class ListNodes extends ListRecords
->recordActions([ ->recordActions([
EditAction::make(), EditAction::make(),
]) ])
->emptyStateIcon('tabler-server-2') ->toolbarActions([
CreateAction::make(),
])
->emptyStateIcon(TablerIcon::Server2)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/node.no_nodes')) ->emptyStateHeading(trans('admin/node.no_nodes'))
->filters([ ->filters([
@@ -73,14 +74,4 @@ class ListNodes extends ListRecords
->model(Node::class), ->model(Node::class),
]); ]);
} }
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->icon('tabler-file-plus'),
];
}
} }

View File

@@ -2,11 +2,13 @@
namespace App\Filament\Admin\Resources\Nodes\RelationManagers; namespace App\Filament\Admin\Resources\Nodes\RelationManagers;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Servers\Pages\CreateServer; use App\Filament\Admin\Resources\Servers\Pages\CreateServer;
use App\Filament\Components\Actions\UpdateNodeAllocations; use App\Filament\Components\Actions\UpdateNodeAllocations;
use App\Models\Allocation; use App\Models\Allocation;
use App\Models\Node; use App\Models\Node;
use App\Services\Allocations\AssignmentService; use App\Services\Allocations\AssignmentService;
use BackedEnum;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
@@ -16,7 +18,6 @@ use Filament\Forms\Components\TextInput;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Components\Utilities\Set;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\SelectColumn; use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\TextInputColumn; use Filament\Tables\Columns\TextInputColumn;
@@ -29,7 +30,7 @@ class AllocationsRelationManager extends RelationManager
{ {
protected static string $relationship = 'allocations'; protected static string $relationship = 'allocations';
protected static string|\BackedEnum|null $icon = 'tabler-plug-connected'; protected static string|BackedEnum|null $icon = TablerIcon::PlugConnected;
public function setTitle(): string public function setTitle(): string
{ {
@@ -57,7 +58,7 @@ class AllocationsRelationManager extends RelationManager
->label(trans('admin/node.ports')), ->label(trans('admin/node.ports')),
TextColumn::make('server.name') TextColumn::make('server.name')
->label(trans('admin/node.table.servers')) ->label(trans('admin/node.table.servers'))
->icon('tabler-brand-docker') ->icon(TablerIcon::BrandDocker)
->visibleFrom('md') ->visibleFrom('md')
->searchable() ->searchable()
->url(fn (Allocation $allocation): string => $allocation->server ? route('filament.admin.resources.servers.edit', ['record' => $allocation->server]) : ''), ->url(fn (Allocation $allocation): string => $allocation->server ? route('filament.admin.resources.servers.edit', ['record' => $allocation->server]) : ''),
@@ -86,9 +87,8 @@ class AllocationsRelationManager extends RelationManager
DeleteBulkAction::make() DeleteBulkAction::make()
->authorize(fn () => user()?->can('update', $this->getOwnerRecord())), ->authorize(fn () => user()?->can('update', $this->getOwnerRecord())),
Action::make('create new allocation') Action::make('create new allocation')
->label(trans('admin/node.create_allocation')) ->tooltip(trans('admin/node.create_allocation'))
->icon('tabler-world-plus') ->icon(TablerIcon::WorldPlus)
->iconButton()->iconSize(IconSize::ExtraLarge)
->schema(fn () => [ ->schema(fn () => [
Select::make('allocation_ip') Select::make('allocation_ip')
->options(fn () => collect($this->getOwnerRecord()->ipAddresses())->mapWithKeys(fn (string $ip) => [$ip => $ip])) ->options(fn () => collect($this->getOwnerRecord()->ipAddresses())->mapWithKeys(fn (string $ip) => [$ip => $ip]))
@@ -99,9 +99,8 @@ class AllocationsRelationManager extends RelationManager
->afterStateUpdated(fn (Set $set) => $set('allocation_ports', [])) ->afterStateUpdated(fn (Set $set) => $set('allocation_ports', []))
->live() ->live()
->hintAction( ->hintAction(
Action::make('refresh') Action::make('hint_refresh')
->iconButton() ->icon(TablerIcon::Refresh)
->icon('tabler-refresh')
->tooltip(trans('admin/node.refresh')) ->tooltip(trans('admin/node.refresh'))
->action(function () { ->action(function () {
cache()->forget("nodes.{$this->getOwnerRecord()->id}.ips"); cache()->forget("nodes.{$this->getOwnerRecord()->id}.ips");

View File

@@ -3,7 +3,9 @@
namespace App\Filament\Admin\Resources\Nodes\RelationManagers; namespace App\Filament\Admin\Resources\Nodes\RelationManagers;
use App\Enums\ServerResourceType; use App\Enums\ServerResourceType;
use App\Enums\TablerIcon;
use App\Models\Server; use App\Models\Server;
use BackedEnum;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables\Columns\SelectColumn; use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
@@ -13,7 +15,7 @@ class ServersRelationManager extends RelationManager
{ {
protected static string $relationship = 'servers'; protected static string $relationship = 'servers';
protected static string|\BackedEnum|null $icon = 'tabler-brand-docker'; protected static string|BackedEnum|null $icon = TablerIcon::BrandDocker;
public function setTitle(): string public function setTitle(): string
{ {

View File

@@ -3,9 +3,11 @@
namespace App\Filament\Admin\Resources\Plugins; namespace App\Filament\Admin\Resources\Plugins;
use App\Enums\PluginStatus; use App\Enums\PluginStatus;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Plugins\Pages\ListPlugins; use App\Filament\Admin\Resources\Plugins\Pages\ListPlugins;
use App\Models\Plugin; use App\Models\Plugin;
use App\Services\Helpers\PluginService; use App\Services\Helpers\PluginService;
use BackedEnum;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
@@ -14,7 +16,6 @@ use Filament\Forms\Components\TextInput;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\Resource; use Filament\Resources\Resource;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
use Illuminate\Http\UploadedFile; use Illuminate\Http\UploadedFile;
@@ -23,7 +24,7 @@ class PluginResource extends Resource
{ {
protected static ?string $model = Plugin::class; protected static ?string $model = Plugin::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-packages'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Packages;
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
@@ -59,7 +60,7 @@ class PluginResource extends Resource
TextColumn::make('name') TextColumn::make('name')
->label(trans('admin/plugin.name')) ->label(trans('admin/plugin.name'))
->description(fn (Plugin $plugin) => (strlen($plugin->description) > 80) ? substr($plugin->description, 0, 80).'...' : $plugin->description) ->description(fn (Plugin $plugin) => (strlen($plugin->description) > 80) ? substr($plugin->description, 0, 80).'...' : $plugin->description)
->icon(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? 'tabler-versions-off' : 'tabler-versions') ->icon(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? TablerIcon::VersionsOff : TablerIcon::Versions)
->iconColor(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? 'danger' : 'success') ->iconColor(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? 'danger' : 'success')
->tooltip(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? trans('admin/plugin.update_available') : null) ->tooltip(fn (Plugin $plugin) => $plugin->isUpdateAvailable() ? trans('admin/plugin.update_available') : null)
->sortable() ->sortable()
@@ -82,15 +83,15 @@ class PluginResource extends Resource
->sortable(), ->sortable(),
]) ])
->recordActions([ ->recordActions([
Action::make('view') Action::make('exclude_view')
->label(trans('filament-actions::view.single.label')) ->label(trans('filament-actions::view.single.label'))
->icon(fn (Plugin $plugin) => $plugin->getReadme() ? 'tabler-eye' : 'tabler-eye-share') ->icon(fn (Plugin $plugin) => $plugin->getReadme() ? TablerIcon::Eye : TablerIcon::EyeShare)
->color('gray') ->color('gray')
->visible(fn (Plugin $plugin) => $plugin->getReadme() || $plugin->url) ->visible(fn (Plugin $plugin) => $plugin->getReadme() || $plugin->url)
->url(fn (Plugin $plugin) => !$plugin->getReadme() ? $plugin->url : null, true) ->url(fn (Plugin $plugin) => !$plugin->getReadme() ? $plugin->url : null, true)
->slideOver(true) ->slideOver(true)
->modalHeading('Readme') ->modalHeading('Readme')
->modalSubmitAction(fn (Plugin $plugin) => Action::make('visit_website') ->modalSubmitAction(fn (Plugin $plugin) => Action::make('exclude_visit_website')
->label(trans('admin/plugin.visit_website')) ->label(trans('admin/plugin.visit_website'))
->visible(!is_null($plugin->url)) ->visible(!is_null($plugin->url))
->url($plugin->url, true) ->url($plugin->url, true)
@@ -102,20 +103,20 @@ class PluginResource extends Resource
->markdown() ->markdown()
->state(fn (Plugin $plugin) => $plugin->getReadme()), ->state(fn (Plugin $plugin) => $plugin->getReadme()),
] : null), ] : null),
Action::make('settings') Action::make('exclude_settings')
->label(trans('admin/plugin.settings')) ->label(trans('admin/plugin.settings'))
->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin))
->icon('tabler-settings') ->icon(TablerIcon::Settings)
->color('primary') ->color('primary')
->visible(fn (Plugin $plugin) => $plugin->status === PluginStatus::Enabled && $plugin->hasSettings()) ->visible(fn (Plugin $plugin) => $plugin->status === PluginStatus::Enabled && $plugin->hasSettings())
->schema(fn (Plugin $plugin) => $plugin->getSettingsForm()) ->schema(fn (Plugin $plugin) => $plugin->getSettingsForm())
->action(fn (array $data, Plugin $plugin) => $plugin->saveSettings($data)) ->action(fn (array $data, Plugin $plugin) => $plugin->saveSettings($data))
->slideOver(), ->slideOver(),
ActionGroup::make([ ActionGroup::make([
Action::make('install') Action::make('exclude_install')
->label(trans('admin/plugin.install')) ->label(trans('admin/plugin.install'))
->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin))
->icon('tabler-terminal') ->icon(TablerIcon::Terminal)
->color('success') ->color('success')
->hidden(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled) ->hidden(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled)
->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) {
@@ -136,10 +137,10 @@ class PluginResource extends Resource
->send(); ->send();
} }
}), }),
Action::make('update') Action::make('exclude_update')
->label(trans('admin/plugin.update')) ->label(trans('admin/plugin.update'))
->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin))
->icon('tabler-download') ->icon(TablerIcon::Download)
->color('success') ->color('success')
->visible(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled && $plugin->isUpdateAvailable()) ->visible(fn (Plugin $plugin) => $plugin->status !== PluginStatus::NotInstalled && $plugin->isUpdateAvailable())
->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) {
@@ -160,10 +161,10 @@ class PluginResource extends Resource
->send(); ->send();
} }
}), }),
Action::make('enable') Action::make('exclude_enable')
->label(trans('admin/plugin.enable')) ->label(trans('admin/plugin.enable'))
->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin))
->icon('tabler-check') ->icon(TablerIcon::Check)
->color('success') ->color('success')
->visible(fn (Plugin $plugin) => $plugin->canEnable()) ->visible(fn (Plugin $plugin) => $plugin->canEnable())
->requiresConfirmation(fn (Plugin $plugin, PluginService $pluginService) => $plugin->isTheme() && $pluginService->hasThemePluginEnabled()) ->requiresConfirmation(fn (Plugin $plugin, PluginService $pluginService) => $plugin->isTheme() && $pluginService->hasThemePluginEnabled())
@@ -179,10 +180,10 @@ class PluginResource extends Resource
->title(trans('admin/plugin.notifications.enabled')) ->title(trans('admin/plugin.notifications.enabled'))
->send(); ->send();
}), }),
Action::make('disable') Action::make('exclude_disable')
->label(trans('admin/plugin.disable')) ->label(trans('admin/plugin.disable'))
->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin))
->icon('tabler-x') ->icon(TablerIcon::X)
->color('warning') ->color('warning')
->visible(fn (Plugin $plugin) => $plugin->canDisable()) ->visible(fn (Plugin $plugin) => $plugin->canDisable())
->action(function (Plugin $plugin, $livewire, PluginService $pluginService) { ->action(function (Plugin $plugin, $livewire, PluginService $pluginService) {
@@ -195,10 +196,10 @@ class PluginResource extends Resource
->title(trans('admin/plugin.notifications.disabled')) ->title(trans('admin/plugin.notifications.disabled'))
->send(); ->send();
}), }),
Action::make('delete') Action::make('exclude_delete')
->label(trans('filament-actions::delete.single.label')) ->label(trans('filament-actions::delete.single.label'))
->authorize(fn (Plugin $plugin) => user()?->can('delete', $plugin)) ->authorize(fn (Plugin $plugin) => user()?->can('delete', $plugin))
->icon('tabler-trash') ->icon(TablerIcon::Trash)
->color('danger') ->color('danger')
->requiresConfirmation() ->requiresConfirmation()
->visible(fn (Plugin $plugin) => $plugin->status === PluginStatus::NotInstalled) ->visible(fn (Plugin $plugin) => $plugin->status === PluginStatus::NotInstalled)
@@ -212,10 +213,10 @@ class PluginResource extends Resource
->title(trans('admin/plugin.notifications.deleted')) ->title(trans('admin/plugin.notifications.deleted'))
->send(); ->send();
}), }),
Action::make('uninstall') Action::make('exclude_uninstall')
->label(trans('admin/plugin.uninstall')) ->label(trans('admin/plugin.uninstall'))
->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin)) ->authorize(fn (Plugin $plugin) => user()?->can('update', $plugin))
->icon('tabler-terminal') ->icon(TablerIcon::Terminal)
->color('danger') ->color('danger')
->requiresConfirmation() ->requiresConfirmation()
->hidden(fn (Plugin $plugin) => $plugin->status === PluginStatus::NotInstalled || $plugin->status === PluginStatus::Errored) ->hidden(fn (Plugin $plugin) => $plugin->status === PluginStatus::NotInstalled || $plugin->status === PluginStatus::Errored)
@@ -241,11 +242,10 @@ class PluginResource extends Resource
]) ])
->headerActions([ ->headerActions([
Action::make('import_from_file') Action::make('import_from_file')
->label(trans('admin/plugin.import_from_file')) ->hiddenLabel()
->tooltip(trans('admin/plugin.import_from_file'))
->authorize(fn () => user()?->can('create', Plugin::class)) ->authorize(fn () => user()?->can('create', Plugin::class))
->icon('tabler-file-download') ->icon(TablerIcon::FileDownload)
->iconButton()
->iconSize(IconSize::ExtraLarge)
->schema([ ->schema([
// TODO: switch to new file upload // TODO: switch to new file upload
FileUpload::make('file') FileUpload::make('file')
@@ -285,11 +285,10 @@ class PluginResource extends Resource
} }
}), }),
Action::make('import_from_url') Action::make('import_from_url')
->label(trans('admin/plugin.import_from_url')) ->hiddenLabel()
->tooltip(trans('admin/plugin.import_from_url'))
->authorize(fn () => user()?->can('create', Plugin::class)) ->authorize(fn () => user()?->can('create', Plugin::class))
->icon('tabler-world-download') ->icon(TablerIcon::WorldDownload)
->iconButton()
->iconSize(IconSize::ExtraLarge)
->schema([ ->schema([
TextInput::make('url') TextInput::make('url')
->required() ->required()
@@ -323,7 +322,7 @@ class PluginResource extends Resource
} }
}), }),
]) ])
->emptyStateIcon('tabler-packages') ->emptyStateIcon(TablerIcon::Packages)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/plugin.no_plugins')); ->emptyStateHeading(trans('admin/plugin.no_plugins'));
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Roles\Pages; namespace App\Filament\Admin\Resources\Roles\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Roles\RoleResource; use App\Filament\Admin\Resources\Roles\RoleResource;
use App\Models\Role; use App\Models\Role;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
@@ -9,7 +10,6 @@ use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
use Filament\Support\Enums\IconSize;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Permission;
@@ -32,9 +32,12 @@ class CreateRole extends CreateRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
$this->getCreateFormAction()->formId('form') Action::make('create')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-plus'), ->action('create')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label'))
->icon(TablerIcon::FilePlus),
]; ];
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Roles\Pages; namespace App\Filament\Admin\Resources\Roles\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Roles\RoleResource; use App\Filament\Admin\Resources\Roles\RoleResource;
use App\Models\Role; use App\Models\Role;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
@@ -10,7 +11,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Filament\Support\Enums\IconSize;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Permission;
@@ -58,12 +58,14 @@ class EditRole extends EditRecord
{ {
return [ return [
DeleteAction::make() DeleteAction::make()
->label(fn (Role $role) => $role->isRootAdmin() ? trans('admin/role.root_admin_delete') : ($role->users_count >= 1 ? trans('admin/role.in_use') : trans('filament-actions::delete.single.label'))) ->tooltip(fn (Role $role) => $role->isRootAdmin() ? trans('admin/role.root_admin_delete') : ($role->users_count >= 1 ? trans('admin/role.in_use') : trans('filament-actions::delete.single.label')))
->disabled(fn (Role $role) => $role->isRootAdmin() || $role->users_count >= 1) ->disabled(fn (Role $role) => $role->isRootAdmin() || $role->users_count >= 1),
->iconButton()->iconSize(IconSize::ExtraLarge), Action::make('save')
$this->getSaveFormAction()->formId('form') ->hiddenLabel()
->iconButton()->iconSize(IconSize::ExtraLarge) ->action('save')
->icon('tabler-device-floppy'), ->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }

View File

@@ -5,11 +5,7 @@ namespace App\Filament\Admin\Resources\Roles\Pages;
use App\Filament\Admin\Resources\Roles\RoleResource; use App\Filament\Admin\Resources\Roles\RoleResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListRoles extends ListRecords class ListRoles extends ListRecords
{ {
@@ -17,14 +13,4 @@ class ListRoles extends ListRecords
use CanCustomizeHeaderWidgets; use CanCustomizeHeaderWidgets;
protected static string $resource = RoleResource::class; protected static string $resource = RoleResource::class;
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->icon('tabler-file-plus')
->iconButton()->iconSize(IconSize::ExtraLarge),
];
}
} }

View File

@@ -9,7 +9,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord; use Filament\Resources\Pages\ViewRecord;
use Filament\Support\Enums\IconSize;
class ViewRole extends ViewRecord class ViewRole extends ViewRecord
{ {
@@ -22,8 +21,7 @@ class ViewRole extends ViewRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
EditAction::make() EditAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge),
]; ];
} }
} }

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Roles; namespace App\Filament\Admin\Resources\Roles;
use App\Enums\CustomizationKey; use App\Enums\CustomizationKey;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Roles\Pages\CreateRole; use App\Filament\Admin\Resources\Roles\Pages\CreateRole;
use App\Filament\Admin\Resources\Roles\Pages\EditRole; use App\Filament\Admin\Resources\Roles\Pages\EditRole;
use App\Filament\Admin\Resources\Roles\Pages\ListRoles; use App\Filament\Admin\Resources\Roles\Pages\ListRoles;
@@ -15,6 +16,8 @@ use App\Traits\Filament\CanModifyTable;
use BackedEnum; use BackedEnum;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Actions\ViewAction; use Filament\Actions\ViewAction;
@@ -43,7 +46,7 @@ class RoleResource extends Resource
protected static ?string $model = Role::class; protected static ?string $model = Role::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-users-group'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::UsersGroup;
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';
@@ -100,10 +103,13 @@ class RoleResource extends Resource
->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()),
EditAction::make(), EditAction::make(),
]) ])
->checkIfRecordIsSelectableUsing(fn (Role $role) => !$role->isRootAdmin() && $role->users_count <= 0) ->toolbarActions([
->groupedBulkActions([ CreateAction::make(),
DeleteBulkAction::make(), BulkActionGroup::make([
]); DeleteBulkAction::make(),
]),
])
->checkIfRecordIsSelectableUsing(fn (Role $role) => !$role->isRootAdmin() && $role->users_count <= 0);
} }
/** /**

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Servers\Pages; namespace App\Filament\Admin\Resources\Servers\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Servers\ServerResource; use App\Filament\Admin\Resources\Servers\ServerResource;
use App\Filament\Components\Forms\Fields\StartupVariable; use App\Filament\Components\Forms\Fields\StartupVariable;
use App\Models\Allocation; use App\Models\Allocation;
@@ -70,15 +71,17 @@ class CreateServer extends CreateRecord
->components([ ->components([
Wizard::make($this->getSteps()) Wizard::make($this->getSteps())
->columnSpanFull() ->columnSpanFull()
->nextAction(fn (Action $action) => $action->iconButton()->iconSize(IconSize::ExtraLarge)->icon('tabler-arrow-right')) ->nextAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowRight))
->previousAction(fn (Action $action) => $action->iconButton()->iconSize(IconSize::ExtraLarge)->icon('tabler-arrow-left')) ->previousAction(fn (Action $action) => $action->tooltip(fn () => $action->getLabel())->iconButton()->iconSize(IconSize::ExtraLarge)->icon(TablerIcon::ArrowLeft))
->submitAction(new HtmlString(Blade::render(<<<'BLADE' ->submitAction(new HtmlString(Blade::render(<<<'BLADE'
<x-filament::button <x-filament::icon-button
type="submit" type="submit"
size="sm" iconSize="xl"
icon="tabler-plus"
tooltip="{{ trans('admin/server.create') }}"
> >
{{ trans('admin/server.create') }} {{ trans('admin/server.create') }}
</x-filament::button> </x-filament::icon-button>
BLADE))), BLADE))),
]); ]);
} }
@@ -93,8 +96,8 @@ class CreateServer extends CreateRecord
return [ return [
Step::make('Information') Step::make('Information')
->label(trans('admin/server.tabs.information')) ->label(trans('admin/server.tabs.information'))
->icon('tabler-info-circle') ->icon(TablerIcon::InfoCircle)
->completedIcon('tabler-check') ->completedIcon(TablerIcon::Check)
->columns([ ->columns([
'default' => 1, 'default' => 1,
'sm' => 4, 'sm' => 4,
@@ -102,9 +105,10 @@ class CreateServer extends CreateRecord
]) ])
->schema([ ->schema([
TextInput::make('name') TextInput::make('name')
->prefixIcon('tabler-server') ->prefixIcon(TablerIcon::Server)
->label(trans('admin/server.name')) ->label(trans('admin/server.name'))
->suffixAction(Action::make('random') ->suffixAction(Action::make('hint_random')
->tooltip('Random')
->icon('tabler-dice-' . random_int(1, 6)) ->icon('tabler-dice-' . random_int(1, 6))
->action(function (Set $set, Get $get) { ->action(function (Set $set, Get $get) {
$egg = Egg::find($get('egg_id')); $egg = Egg::find($get('egg_id'));
@@ -134,7 +138,7 @@ class CreateServer extends CreateRecord
Select::make('node_id') Select::make('node_id')
->disabledOn('edit') ->disabledOn('edit')
->prefixIcon('tabler-server-2') ->prefixIcon(TablerIcon::Server2)
->selectablePlaceholder(false) ->selectablePlaceholder(false)
->default(function () { ->default(function () {
$lastUsedNode = session()->get('last_utilized_node'); $lastUsedNode = session()->get('last_utilized_node');
@@ -168,7 +172,7 @@ class CreateServer extends CreateRecord
Select::make('owner_id') Select::make('owner_id')
->preload() ->preload()
->prefixIcon('tabler-user') ->prefixIcon(TablerIcon::User)
->selectablePlaceholder(false) ->selectablePlaceholder(false)
->default(user()?->id) ->default(user()?->id)
->label(trans('admin/server.owner')) ->label(trans('admin/server.owner'))
@@ -198,7 +202,7 @@ class CreateServer extends CreateRecord
TextInput::make('password') TextInput::make('password')
->label(trans('admin/user.password')) ->label(trans('admin/user.password'))
->hintIcon('tabler-question-mark', trans('admin/user.password_help')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/user.password_help'))
->password(), ->password(),
]) ])
->createOptionUsing(function ($data, UserCreationService $service) { ->createOptionUsing(function ($data, UserCreationService $service) {
@@ -211,7 +215,7 @@ class CreateServer extends CreateRecord
Select::make('allocation_id') Select::make('allocation_id')
->preload() ->preload()
->live() ->live()
->prefixIcon('tabler-network') ->prefixIcon(TablerIcon::Network)
->label(trans('admin/server.primary_allocation')) ->label(trans('admin/server.primary_allocation'))
->columnSpan([ ->columnSpan([
'default' => 1, 'default' => 1,
@@ -254,9 +258,9 @@ class CreateServer extends CreateRecord
->ip() ->ip()
->live() ->live()
->hintAction( ->hintAction(
Action::make('refresh') Action::make('hint_refresh')
->iconButton() ->iconButton()
->icon('tabler-refresh') ->icon(TablerIcon::Refresh)
->tooltip(trans('admin/node.refresh')) ->tooltip(trans('admin/node.refresh'))
->action(function () use ($get) { ->action(function () use ($get) {
cache()->forget("nodes.{$get('node_id')}.ips"); cache()->forget("nodes.{$get('node_id')}.ips");
@@ -304,7 +308,7 @@ class CreateServer extends CreateRecord
->live() ->live()
->preload() ->preload()
->disableOptionsWhenSelectedInSiblingRepeaterItems() ->disableOptionsWhenSelectedInSiblingRepeaterItems()
->prefixIcon('tabler-network') ->prefixIcon(TablerIcon::Network)
->label(trans('admin/server.additional_allocations')) ->label(trans('admin/server.additional_allocations'))
->columnSpan(2) ->columnSpan(2)
->disabled(fn (Get $get) => $get('../../allocation_id') === null || $get('../../node_id') === null) ->disabled(fn (Get $get) => $get('../../allocation_id') === null || $get('../../node_id') === null)
@@ -333,8 +337,8 @@ class CreateServer extends CreateRecord
]), ]),
Step::make(trans('admin/server.tabs.egg_configuration')) Step::make(trans('admin/server.tabs.egg_configuration'))
->icon('tabler-egg') ->icon(TablerIcon::Egg)
->completedIcon('tabler-check') ->completedIcon(TablerIcon::Check)
->columns([ ->columns([
'default' => 1, 'default' => 1,
'sm' => 4, 'sm' => 4,
@@ -344,7 +348,7 @@ class CreateServer extends CreateRecord
->schema([ ->schema([
Select::make('egg_id') Select::make('egg_id')
->label(trans('admin/server.name')) ->label(trans('admin/server.name'))
->prefixIcon('tabler-egg') ->prefixIcon(TablerIcon::Egg)
->relationship('egg', 'name') ->relationship('egg', 'name')
->columnSpan([ ->columnSpan([
'default' => 1, 'default' => 1,
@@ -401,8 +405,8 @@ class CreateServer extends CreateRecord
true => 'danger', true => 'danger',
]) ])
->icons([ ->icons([
false => 'tabler-code', false => TablerIcon::Code,
true => 'tabler-code-off', true => TablerIcon::CodeOff,
]) ])
->inline() ->inline()
->required(), ->required(),
@@ -426,8 +430,8 @@ class CreateServer extends CreateRecord
false => 'danger', false => 'danger',
]) ])
->icons([ ->icons([
true => 'tabler-code', true => TablerIcon::Code,
false => 'tabler-code-off', false => TablerIcon::CodeOff,
]) ])
->inline(), ->inline(),
@@ -475,7 +479,7 @@ class CreateServer extends CreateRecord
Hidden::make('environment')->default([]), Hidden::make('environment')->default([]),
Section::make(trans('admin/server.variables')) Section::make(trans('admin/server.variables'))
->icon('tabler-eggs') ->icon(TablerIcon::Eggs)
->iconColor('primary') ->iconColor('primary')
->hidden(fn (Get $get) => $get('egg_id') === null) ->hidden(fn (Get $get) => $get('egg_id') === null)
->collapsible() ->collapsible()
@@ -512,8 +516,8 @@ class CreateServer extends CreateRecord
]), ]),
]), ]),
Step::make(trans('admin/server.tabs.environment_configuration')) Step::make(trans('admin/server.tabs.environment_configuration'))
->icon('tabler-brand-docker') ->icon(TablerIcon::BrandDocker)
->completedIcon('tabler-check') ->completedIcon(TablerIcon::Check)
->schema([ ->schema([
Fieldset::make(trans('admin/server.resource_limits')) Fieldset::make(trans('admin/server.resource_limits'))
->columnSpan(6) ->columnSpan(6)
@@ -549,7 +553,7 @@ class CreateServer extends CreateRecord
->hidden(fn (Get $get) => $get('unlimited_cpu')) ->hidden(fn (Get $get) => $get('unlimited_cpu'))
->label(trans('admin/server.cpu_limit'))->inlineLabel() ->label(trans('admin/server.cpu_limit'))->inlineLabel()
->suffix('%') ->suffix('%')
->hintIcon('tabler-question-mark', trans('admin/server.cpu_helper')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.cpu_helper'))
->default(0) ->default(0)
->required() ->required()
->columnSpan(2) ->columnSpan(2)
@@ -581,7 +585,7 @@ class CreateServer extends CreateRecord
->hidden(fn (Get $get) => $get('unlimited_mem')) ->hidden(fn (Get $get) => $get('unlimited_mem'))
->label(trans('admin/server.memory_limit'))->inlineLabel() ->label(trans('admin/server.memory_limit'))->inlineLabel()
->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB')
->hintIcon('tabler-question-mark', trans('admin/server.memory_helper')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.memory_helper'))
->default(0) ->default(0)
->required() ->required()
->columnSpan(2) ->columnSpan(2)
@@ -745,21 +749,21 @@ class CreateServer extends CreateRecord
->schema([ ->schema([
TextInput::make('allocation_limit') TextInput::make('allocation_limit')
->label(trans('admin/server.allocations')) ->label(trans('admin/server.allocations'))
->suffixIcon('tabler-network') ->suffixIcon(TablerIcon::Network)
->required() ->required()
->numeric() ->numeric()
->minValue(0) ->minValue(0)
->default(0), ->default(0),
TextInput::make('database_limit') TextInput::make('database_limit')
->label(trans('admin/server.databases')) ->label(trans('admin/server.databases'))
->suffixIcon('tabler-database') ->suffixIcon(TablerIcon::Database)
->required() ->required()
->numeric() ->numeric()
->minValue(0) ->minValue(0)
->default(0), ->default(0),
TextInput::make('backup_limit') TextInput::make('backup_limit')
->label(trans('admin/server.backups')) ->label(trans('admin/server.backups'))
->suffixIcon('tabler-copy-check') ->suffixIcon(TablerIcon::CopyCheck)
->required() ->required()
->numeric() ->numeric()
->minValue(0) ->minValue(0)

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Servers\Pages; namespace App\Filament\Admin\Resources\Servers\Pages;
use App\Enums\SuspendAction; use App\Enums\SuspendAction;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Servers\ServerResource; use App\Filament\Admin\Resources\Servers\ServerResource;
use App\Filament\Components\Actions\DeleteServerIcon; use App\Filament\Components\Actions\DeleteServerIcon;
use App\Filament\Components\Actions\PreviewStartupAction; use App\Filament\Components\Actions\PreviewStartupAction;
@@ -56,7 +57,6 @@ use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Components\Utilities\Set; use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\Alignment; use Filament\Support\Enums\Alignment;
use Filament\Support\Enums\IconSize;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
@@ -108,7 +108,7 @@ class EditServer extends EditRecord
return [ return [
Tab::make('information') Tab::make('information')
->label(trans('admin/server.tabs.information')) ->label(trans('admin/server.tabs.information'))
->icon('tabler-info-circle') ->icon(TablerIcon::InfoCircle)
->schema([ ->schema([
Grid::make() Grid::make()
->columns(2) ->columns(2)
@@ -121,8 +121,8 @@ class EditServer extends EditRecord
->columnSpan(2) ->columnSpan(2)
->alignJustify(), ->alignJustify(),
Action::make('uploadIcon') Action::make('uploadIcon')
->iconButton()->iconSize(IconSize::Large) ->icon(TablerIcon::PhotoUp)
->icon('tabler-photo-up') ->tooltip(trans('admin/server.import_image'))
->modal() ->modal()
->modalSubmitActionLabel(trans('server/setting.server_info.icon.upload')) ->modalSubmitActionLabel(trans('server/setting.server_info.icon.upload'))
->schema([ ->schema([
@@ -257,9 +257,10 @@ class EditServer extends EditRecord
]) ])
->schema([ ->schema([
TextInput::make('name') TextInput::make('name')
->prefixIcon('tabler-server') ->prefixIcon(TablerIcon::Server)
->label(trans('admin/server.name')) ->label(trans('admin/server.name'))
->suffixAction(Action::make('random') ->suffixAction(Action::make('hint_random')
->tooltip('Random')
->icon('tabler-dice-' . random_int(1, 6)) ->icon('tabler-dice-' . random_int(1, 6))
->action(function (Set $set, Get $get) { ->action(function (Set $set, Get $get) {
$egg = Egg::find($get('egg_id')); $egg = Egg::find($get('egg_id'));
@@ -278,7 +279,7 @@ class EditServer extends EditRecord
->required() ->required()
->maxLength(255), ->maxLength(255),
Select::make('owner_id') Select::make('owner_id')
->prefixIcon('tabler-user') ->prefixIcon(TablerIcon::User)
->label(trans('admin/server.owner')) ->label(trans('admin/server.owner'))
->columnSpan([ ->columnSpan([
'default' => 2, 'default' => 2,
@@ -384,7 +385,7 @@ class EditServer extends EditRecord
]), ]),
Tab::make('environment_configuration') Tab::make('environment_configuration')
->label(trans('admin/server.tabs.environment_configuration')) ->label(trans('admin/server.tabs.environment_configuration'))
->icon('tabler-brand-docker') ->icon(TablerIcon::BrandDocker)
->schema([ ->schema([
Fieldset::make(trans('admin/server.resource_limits')) Fieldset::make(trans('admin/server.resource_limits'))
->columnSpanFull() ->columnSpanFull()
@@ -421,7 +422,7 @@ class EditServer extends EditRecord
->hidden(fn (Get $get) => $get('unlimited_cpu')) ->hidden(fn (Get $get) => $get('unlimited_cpu'))
->label(trans('admin/server.cpu_limit'))->inlineLabel() ->label(trans('admin/server.cpu_limit'))->inlineLabel()
->suffix('%') ->suffix('%')
->hintIcon('tabler-question-mark', trans('admin/server.cpu_helper')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.cpu_helper'))
->required() ->required()
->columnSpan(2) ->columnSpan(2)
->numeric() ->numeric()
@@ -453,7 +454,7 @@ class EditServer extends EditRecord
->hidden(fn (Get $get) => $get('unlimited_mem')) ->hidden(fn (Get $get) => $get('unlimited_mem'))
->label(trans('admin/server.memory_limit'))->inlineLabel() ->label(trans('admin/server.memory_limit'))->inlineLabel()
->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB') ->suffix(config('panel.use_binary_prefix') ? 'MiB' : 'MB')
->hintIcon('tabler-question-mark', trans('admin/server.memory_helper')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/server.memory_helper'))
->required() ->required()
->columnSpan(2) ->columnSpan(2)
->numeric() ->numeric()
@@ -623,19 +624,19 @@ class EditServer extends EditRecord
->schema([ ->schema([
TextInput::make('allocation_limit') TextInput::make('allocation_limit')
->label(trans('admin/server.allocations')) ->label(trans('admin/server.allocations'))
->suffixIcon('tabler-network') ->suffixIcon(TablerIcon::Network)
->required() ->required()
->minValue(0) ->minValue(0)
->numeric(), ->numeric(),
TextInput::make('database_limit') TextInput::make('database_limit')
->label(trans('admin/server.databases')) ->label(trans('admin/server.databases'))
->suffixIcon('tabler-database') ->suffixIcon(TablerIcon::Database)
->required() ->required()
->minValue(0) ->minValue(0)
->numeric(), ->numeric(),
TextInput::make('backup_limit') TextInput::make('backup_limit')
->label(trans('admin/server.backups')) ->label(trans('admin/server.backups'))
->suffixIcon('tabler-copy-check') ->suffixIcon(TablerIcon::CopyCheck)
->required() ->required()
->minValue(0) ->minValue(0)
->numeric(), ->numeric(),
@@ -705,7 +706,7 @@ class EditServer extends EditRecord
]), ]),
Tab::make('egg') Tab::make('egg')
->label(trans('admin/server.egg')) ->label(trans('admin/server.egg'))
->icon('tabler-egg') ->icon(TablerIcon::Egg)
->columns([ ->columns([
'default' => 1, 'default' => 1,
'sm' => 3, 'sm' => 3,
@@ -715,7 +716,7 @@ class EditServer extends EditRecord
->schema([ ->schema([
Select::make('egg_id') Select::make('egg_id')
->disabled() ->disabled()
->prefixIcon('tabler-egg') ->prefixIcon(TablerIcon::Egg)
->columnSpan([ ->columnSpan([
'default' => 6, 'default' => 6,
'sm' => 3, 'sm' => 3,
@@ -728,7 +729,7 @@ class EditServer extends EditRecord
->preload() ->preload()
->required() ->required()
->hintAction( ->hintAction(
Action::make('change_egg') Action::make('hint_change_egg')
->label(trans('admin/server.change_egg')) ->label(trans('admin/server.change_egg'))
->action(function (array $data, Server $server, EggChangerService $service) { ->action(function (array $data, Server $server, EggChangerService $service) {
$service->handle($server, $data['egg_id'], $data['keep_old_variables']); $service->handle($server, $data['egg_id'], $data['keep_old_variables']);
@@ -739,7 +740,7 @@ class EditServer extends EditRecord
->schema(fn (Server $server) => [ ->schema(fn (Server $server) => [
Select::make('egg_id') Select::make('egg_id')
->label(trans('admin/server.new_egg')) ->label(trans('admin/server.new_egg'))
->prefixIcon('tabler-egg') ->prefixIcon(TablerIcon::Egg)
->options(fn () => Egg::all()->filter(fn (Egg $egg) => $egg->id !== $server->egg->id)->mapWithKeys(fn (Egg $egg) => [$egg->id => $egg->name])) ->options(fn () => Egg::all()->filter(fn (Egg $egg) => $egg->id !== $server->egg->id)->mapWithKeys(fn (Egg $egg) => [$egg->id => $egg->name]))
->searchable() ->searchable()
->preload() ->preload()
@@ -769,8 +770,8 @@ class EditServer extends EditRecord
1 => 'danger', 1 => 'danger',
]) ])
->icons([ ->icons([
0 => 'tabler-code', 0 => TablerIcon::Code,
1 => 'tabler-code-off', 1 => TablerIcon::CodeOff,
]) ])
->required(), ->required(),
@@ -795,7 +796,7 @@ class EditServer extends EditRecord
}) })
->selectablePlaceholder(false) ->selectablePlaceholder(false)
->columnSpanFull() ->columnSpanFull()
->hintAction(PreviewStartupAction::make('preview')), ->hintAction(PreviewStartupAction::make('hint_preview')),
Textarea::make('startup') Textarea::make('startup')
->hiddenLabel() ->hiddenLabel()
@@ -841,13 +842,13 @@ class EditServer extends EditRecord
]), ]),
Tab::make('mounts') Tab::make('mounts')
->label(trans('admin/server.mounts')) ->label(trans('admin/server.mounts'))
->icon('tabler-layers-linked') ->icon(TablerIcon::LayersLinked)
->schema(fn (Get $get) => [ ->schema(fn (Get $get) => [
ServerResource::getMountCheckboxList($get), ServerResource::getMountCheckboxList($get),
]), ]),
Tab::make('actions') Tab::make('actions')
->label(trans('admin/server.actions')) ->label(trans('admin/server.actions'))
->icon('tabler-settings') ->icon(TablerIcon::Settings)
->schema([ ->schema([
Fieldset::make(trans('admin/server.actions')) Fieldset::make(trans('admin/server.actions'))
->columnSpanFull() ->columnSpanFull()
@@ -862,7 +863,7 @@ class EditServer extends EditRecord
->columnSpan(3) ->columnSpan(3)
->schema([ ->schema([
Actions::make([ Actions::make([
Action::make('toggleInstall') Action::make('exclude_toggle_install')
->label(trans('admin/server.toggle_install')) ->label(trans('admin/server.toggle_install'))
->disabled(fn (Server $server) => $server->isSuspended()) ->disabled(fn (Server $server) => $server->isSuspended())
->modal(fn (Server $server) => $server->isFailedInstall()) ->modal(fn (Server $server) => $server->isFailedInstall())
@@ -913,7 +914,7 @@ class EditServer extends EditRecord
->columnSpan(3) ->columnSpan(3)
->schema([ ->schema([
Actions::make([ Actions::make([
Action::make('toggleSuspend') Action::make('exclude_toggle_suspend')
->label(trans('admin/server.suspend')) ->label(trans('admin/server.suspend'))
->color('warning') ->color('warning')
->hidden(fn (Server $server) => $server->isSuspended()) ->hidden(fn (Server $server) => $server->isSuspended())
@@ -969,7 +970,7 @@ class EditServer extends EditRecord
->columnSpan(3) ->columnSpan(3)
->schema([ ->schema([
Actions::make([ Actions::make([
Action::make('transfer') Action::make('exclude_transfer')
->label(trans('admin/server.transfer')) ->label(trans('admin/server.transfer'))
->disabled(fn (Server $server) => user()?->accessibleNodes()->count() <= 1 || $server->isInConflictState()) ->disabled(fn (Server $server) => user()?->accessibleNodes()->count() <= 1 || $server->isInConflictState())
->modalHeading(trans('admin/server.transfer')) ->modalHeading(trans('admin/server.transfer'))
@@ -1007,7 +1008,7 @@ class EditServer extends EditRecord
->columnSpan(3) ->columnSpan(3)
->schema([ ->schema([
Actions::make([ Actions::make([
Action::make('reinstall') Action::make('exclude_reinstall')
->label(trans('admin/server.reinstall')) ->label(trans('admin/server.reinstall'))
->color('danger') ->color('danger')
->requiresConfirmation() ->requiresConfirmation()
@@ -1048,7 +1049,7 @@ class EditServer extends EditRecord
return [ return [
Select::make('node_id') Select::make('node_id')
->label(trans('admin/server.node')) ->label(trans('admin/server.node'))
->prefixIcon('tabler-server-2') ->prefixIcon(TablerIcon::Server2)
->selectablePlaceholder(false) ->selectablePlaceholder(false)
->default(fn (Server $server) => user()?->accessibleNodes()->whereNot('id', $server->node->id)->first()?->id) ->default(fn (Server $server) => user()?->accessibleNodes()->whereNot('id', $server->node->id)->first()?->id)
->required() ->required()
@@ -1058,7 +1059,7 @@ class EditServer extends EditRecord
->label(trans('admin/server.primary_allocation')) ->label(trans('admin/server.primary_allocation'))
->disabled(fn (Get $get, Server $server) => !$get('node_id') || !$server->allocation_id) ->disabled(fn (Get $get, Server $server) => !$get('node_id') || !$server->allocation_id)
->required(fn (Server $server) => $server->allocation_id) ->required(fn (Server $server) => $server->allocation_id)
->prefixIcon('tabler-network') ->prefixIcon(TablerIcon::Network)
->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address]))
->searchable(['ip', 'port', 'ip_alias']) ->searchable(['ip', 'port', 'ip_alias'])
->placeholder(trans('admin/server.select_allocation')), ->placeholder(trans('admin/server.select_allocation')),
@@ -1068,7 +1069,7 @@ class EditServer extends EditRecord
->multiple() ->multiple()
->minItems(fn (Select $select) => $select->getMaxItems()) ->minItems(fn (Select $select) => $select->getMaxItems())
->maxItems(fn (Select $select, Server $server) => $select->isDisabled() ? null : $server->allocations->count() - 1) ->maxItems(fn (Select $select, Server $server) => $select->isDisabled() ? null : $server->allocations->count() - 1)
->prefixIcon('tabler-network') ->prefixIcon(TablerIcon::Network)
->required(fn (Server $server) => $server->allocations->count() > 1) ->required(fn (Server $server) => $server->allocations->count() > 1)
->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->when($get('allocation_id'), fn ($query) => $query->whereNot('id', $get('allocation_id')))->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address])) ->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->when($get('allocation_id'), fn ($query) => $query->whereNot('id', $get('allocation_id')))->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address]))
->searchable(['ip', 'port', 'ip_alias']) ->searchable(['ip', 'port', 'ip_alias'])
@@ -1100,7 +1101,8 @@ class EditServer extends EditRecord
return [ return [
Action::make('Delete') Action::make('Delete')
->color('danger') ->color('danger')
->label(trans('filament-actions::delete.single.label')) ->hiddenLabel()
->tooltip(trans('filament-actions::delete.single.label'))
->modalHeading(trans('filament-actions::delete.single.modal.heading', ['label' => $this->getRecordTitle()])) ->modalHeading(trans('filament-actions::delete.single.modal.heading', ['label' => $this->getRecordTitle()]))
->modalSubmitActionLabel(trans('filament-actions::delete.single.label')) ->modalSubmitActionLabel(trans('filament-actions::delete.single.label'))
->requiresConfirmation() ->requiresConfirmation()
@@ -1116,15 +1118,14 @@ class EditServer extends EditRecord
->title(trans('admin/server.notifications.error_server_delete')) ->title(trans('admin/server.notifications.error_server_delete'))
->body(trans('admin/server.notifications.error_server_delete_body')) ->body(trans('admin/server.notifications.error_server_delete_body'))
->color('warning') ->color('warning')
->icon('tabler-database') ->icon(TablerIcon::Database)
->warning() ->warning()
->send(); ->send();
} }
}) })
->hidden(fn () => $canForceDelete) ->hidden(fn () => $canForceDelete)
->authorize(fn (Server $server) => user()?->can('delete server', $server)) ->authorize(fn (Server $server) => user()?->can('delete server', $server))
->icon('tabler-trash') ->icon(TablerIcon::Trash),
->iconButton()->iconSize(IconSize::ExtraLarge),
Action::make('ForceDelete') Action::make('ForceDelete')
->color('danger') ->color('danger')
->label(trans('filament-actions::force-delete.single.label')) ->label(trans('filament-actions::force-delete.single.label'))
@@ -1143,13 +1144,16 @@ class EditServer extends EditRecord
->visible(fn () => $canForceDelete) ->visible(fn () => $canForceDelete)
->authorize(fn (Server $server) => user()?->can('delete server', $server)), ->authorize(fn (Server $server) => user()?->can('delete server', $server)),
Action::make('console') Action::make('console')
->label(trans('admin/server.console')) ->hiddenLabel()
->icon('tabler-terminal') ->tooltip(trans('admin/server.console'))
->iconButton()->iconSize(IconSize::ExtraLarge) ->icon(TablerIcon::Terminal)
->url(fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server)), ->url(fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server)),
$this->getSaveFormAction()->formId('form') Action::make('save')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-device-floppy'), ->action('save')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }
@@ -1187,7 +1191,7 @@ class EditServer extends EditRecord
->title(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name])) ->title(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name]))
->body(trans('admin/server.notifications.error_connecting_description')) ->body(trans('admin/server.notifications.error_connecting_description'))
->color('warning') ->color('warning')
->icon('tabler-database') ->icon(TablerIcon::Database)
->warning() ->warning()
->send(); ->send();
} }

View File

@@ -2,17 +2,16 @@
namespace App\Filament\Admin\Resources\Servers\Pages; namespace App\Filament\Admin\Resources\Servers\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Servers\ServerResource; use App\Filament\Admin\Resources\Servers\ServerResource;
use App\Filament\Server\Pages\Console; use App\Filament\Server\Pages\Console;
use App\Models\Server; use App\Models\Server;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction; use Filament\Actions\CreateAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\SelectColumn; use Filament\Tables\Columns\SelectColumn;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Grouping\Group; use Filament\Tables\Grouping\Group;
@@ -91,28 +90,19 @@ class ListServers extends ListRecords
->sortable(), ->sortable(),
]) ])
->recordActions([ ->recordActions([
Action::make('View') Action::make('view')
->label(trans('admin/server.view')) ->tooltip(trans('admin/server.view'))
->iconButton() ->icon(TablerIcon::Terminal)
->icon('tabler-terminal')
->iconSize(IconSize::Large)
->url(fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server)) ->url(fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server))
->authorize(fn (Server $server) => user()?->canAccessTenant($server)), ->authorize(fn (Server $server) => user()?->canAccessTenant($server)),
EditAction::make(), EditAction::make(),
]) ])
->emptyStateIcon('tabler-brand-docker') ->toolbarActions([
CreateAction::make(),
])
->searchable() ->searchable()
->emptyStateIcon(TablerIcon::BrandDocker)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/server.no_servers')); ->emptyStateHeading(trans('admin/server.no_servers'));
} }
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->icon('tabler-file-plus'),
];
}
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Servers\RelationManagers; namespace App\Filament\Admin\Resources\Servers\RelationManagers;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Servers\Pages\CreateServer; use App\Filament\Admin\Resources\Servers\Pages\CreateServer;
use App\Models\Allocation; use App\Models\Allocation;
use App\Models\Server; use App\Models\Server;
@@ -51,8 +52,8 @@ class AllocationsRelationManager extends RelationManager
->placeholder(trans('admin/server.no_notes')), ->placeholder(trans('admin/server.no_notes')),
IconColumn::make('primary') IconColumn::make('primary')
->icon(fn ($state) => match ($state) { ->icon(fn ($state) => match ($state) {
true => 'tabler-star-filled', true => TablerIcon::StarFilled,
default => 'tabler-star', default => TablerIcon::Star,
}) })
->color(fn ($state) => match ($state) { ->color(fn ($state) => match ($state) {
true => 'warning', true => 'warning',
@@ -65,8 +66,8 @@ class AllocationsRelationManager extends RelationManager
IconColumn::make('is_locked') IconColumn::make('is_locked')
->label(trans('admin/server.locked')) ->label(trans('admin/server.locked'))
->tooltip(trans('admin/server.locked_helper')) ->tooltip(trans('admin/server.locked_helper'))
->trueIcon('tabler-lock') ->trueIcon(TablerIcon::Lock)
->falseIcon('tabler-lock-open'), ->falseIcon(TablerIcon::LockOpen),
]) ])
->recordActions([ ->recordActions([
Action::make('make-primary') Action::make('make-primary')
@@ -106,9 +107,9 @@ class AllocationsRelationManager extends RelationManager
} }
}), }),
CreateAction::make() CreateAction::make()
->label(trans('admin/server.create_allocation')) ->hiddenLabel()
->icon('tabler-network') ->tooltip(trans('admin/server.create_allocation'))
->iconButton()->iconSize(IconSize::ExtraLarge) ->icon(TablerIcon::Network)
->createAnother(false) ->createAnother(false)
->schema(fn () => [ ->schema(fn () => [
Select::make('allocation_ip') Select::make('allocation_ip')
@@ -119,8 +120,7 @@ class AllocationsRelationManager extends RelationManager
->live() ->live()
->hintAction( ->hintAction(
Action::make('refresh') Action::make('refresh')
->iconButton() ->icon(TablerIcon::Refresh)
->icon('tabler-refresh')
->tooltip(trans('admin/node.refresh')) ->tooltip(trans('admin/node.refresh'))
->action(function () { ->action(function () {
cache()->forget("nodes.{$this->getOwnerRecord()->node->id}.ips"); cache()->forget("nodes.{$this->getOwnerRecord()->node->id}.ips");
@@ -147,14 +147,14 @@ class AllocationsRelationManager extends RelationManager
]) ])
->action(fn (array $data, AssignmentService $service) => $service->handle($this->getOwnerRecord()->node, $data, $this->getOwnerRecord())), ->action(fn (array $data, AssignmentService $service) => $service->handle($this->getOwnerRecord()->node, $data, $this->getOwnerRecord())),
AssociateAction::make() AssociateAction::make()
->icon('tabler-file-plus') ->icon(TablerIcon::FilePlus)
->iconButton()->iconSize(IconSize::ExtraLarge) ->iconButton()->iconSize(IconSize::ExtraLarge)
->multiple() ->multiple()
->associateAnother(false) ->associateAnother(false)
->preloadRecordSelect() ->preloadRecordSelect()
->recordSelectOptionsQuery(fn ($query) => $query->whereBelongsTo($this->getOwnerRecord()->node)->whereNull('server_id')) ->recordSelectOptionsQuery(fn ($query) => $query->whereBelongsTo($this->getOwnerRecord()->node)->whereNull('server_id'))
->recordSelectSearchColumns(['ip', 'port']) ->recordSelectSearchColumns(['ip', 'port'])
->label(trans('admin/server.add_allocation')) ->tooltip(trans('admin/server.add_allocation'))
->after(function (array $data) { ->after(function (array $data) {
Allocation::whereIn('id', array_values(array_unique($data['recordId'])))->update(['is_locked' => true]); Allocation::whereIn('id', array_values(array_unique($data['recordId'])))->update(['is_locked' => true]);

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Servers\RelationManagers; namespace App\Filament\Admin\Resources\Servers\RelationManagers;
use App\Enums\TablerIcon;
use App\Filament\Components\Actions\RotateDatabasePasswordAction; use App\Filament\Components\Actions\RotateDatabasePasswordAction;
use App\Filament\Components\Tables\Columns\DateTimeColumn; use App\Filament\Components\Tables\Columns\DateTimeColumn;
use App\Models\Database; use App\Models\Database;
@@ -18,7 +19,6 @@ use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager; use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Enums\IconSize;
use Filament\Support\Exceptions\Halt; use Filament\Support\Exceptions\Halt;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table; use Filament\Tables\Table;
@@ -83,7 +83,6 @@ class DatabasesRelationManager extends RelationManager
ViewAction::make() ViewAction::make()
->color('primary'), ->color('primary'),
DeleteAction::make() DeleteAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->successNotificationTitle(null) ->successNotificationTitle(null)
->using(function (Database $database, DatabaseManagementService $service) { ->using(function (Database $database, DatabaseManagementService $service) {
try { try {
@@ -105,11 +104,11 @@ class DatabasesRelationManager extends RelationManager
]) ])
->toolbarActions([ ->toolbarActions([
CreateAction::make() CreateAction::make()
->hiddenLabel()
->disabled(fn () => DatabaseHost::count() < 1) ->disabled(fn () => DatabaseHost::count() < 1)
->label(fn () => DatabaseHost::count() < 1 ? trans('admin/server.no_db_hosts') : trans('admin/server.create_database')) ->tooltip(fn () => DatabaseHost::count() < 1 ? trans('admin/server.no_db_hosts') : trans('admin/server.create_database'))
->color(fn () => DatabaseHost::count() < 1 ? 'danger' : 'primary') ->color(fn () => DatabaseHost::count() < 1 ? 'danger' : 'primary')
->icon(fn () => DatabaseHost::count() < 1 ? 'tabler-database-x' : 'tabler-database-plus') ->icon(fn () => DatabaseHost::count() < 1 ? TablerIcon::DatabaseX : TablerIcon::DatabasePlus)
->iconButton()->iconSize(IconSize::ExtraLarge)
->createAnother(false) ->createAnother(false)
->action(function (array $data, DatabaseManagementService $service, RandomWordService $randomWordService) { ->action(function (array $data, DatabaseManagementService $service, RandomWordService $randomWordService) {
$data['database'] ??= $randomWordService->word() . random_int(1, 420); $data['database'] ??= $randomWordService->word() . random_int(1, 420);
@@ -143,13 +142,13 @@ class DatabasesRelationManager extends RelationManager
->label(trans('admin/server.name')) ->label(trans('admin/server.name'))
->alphaDash() ->alphaDash()
->prefix(fn () => 's' . $this->getOwnerRecord()->id . '_') ->prefix(fn () => 's' . $this->getOwnerRecord()->id . '_')
->hintIcon('tabler-question-mark', trans('admin/databasehost.table.name_helper')), ->hintIcon(TablerIcon::QuestionMark, trans('admin/databasehost.table.name_helper')),
TextInput::make('remote') TextInput::make('remote')
->columnSpan(1) ->columnSpan(1)
->regex('/^[\w\-\/.%:]+$/') ->regex('/^[\w\-\/.%:]+$/')
->label(trans('admin/databasehost.table.remote')) ->label(trans('admin/databasehost.table.remote'))
->default('%') ->default('%')
->hintIcon('tabler-question-mark', trans('admin/databasehost.table.remote_helper')), ->hintIcon(TablerIcon::QuestionMark, trans('admin/databasehost.table.remote_helper')),
]), ]),
]); ]);
} }

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Servers; namespace App\Filament\Admin\Resources\Servers;
use App\Enums\CustomizationKey; use App\Enums\CustomizationKey;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Servers\Pages\CreateServer; use App\Filament\Admin\Resources\Servers\Pages\CreateServer;
use App\Filament\Admin\Resources\Servers\Pages\EditServer; use App\Filament\Admin\Resources\Servers\Pages\EditServer;
use App\Filament\Admin\Resources\Servers\Pages\ListServers; use App\Filament\Admin\Resources\Servers\Pages\ListServers;
@@ -12,6 +13,7 @@ use App\Models\Mount;
use App\Models\Server; use App\Models\Server;
use App\Traits\Filament\CanCustomizePages; use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations; use App\Traits\Filament\CanCustomizeRelations;
use BackedEnum;
use Exception; use Exception;
use Filament\Forms\Components\CheckboxList; use Filament\Forms\Components\CheckboxList;
use Filament\Resources\Pages\PageRegistration; use Filament\Resources\Pages\PageRegistration;
@@ -27,7 +29,7 @@ class ServerResource extends Resource
protected static ?string $model = Server::class; protected static ?string $model = Server::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-brand-docker'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::BrandDocker;
protected static ?string $recordTitleAttribute = 'name'; protected static ?string $recordTitleAttribute = 'name';

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Users\Pages; namespace App\Filament\Admin\Resources\Users\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Users\UserResource; use App\Filament\Admin\Resources\Users\UserResource;
use App\Models\Role; use App\Models\Role;
use App\Services\Users\UserCreationService; use App\Services\Users\UserCreationService;
@@ -10,7 +11,6 @@ use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
use Filament\Support\Enums\IconSize;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
class CreateUser extends CreateRecord class CreateUser extends CreateRecord
@@ -33,9 +33,12 @@ class CreateUser extends CreateRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
$this->getCreateFormAction()->formId('form') Action::make('create')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-user-plus'), ->action('create')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label'))
->icon(TablerIcon::UserPlus),
]; ];
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Users\Pages; namespace App\Filament\Admin\Resources\Users\Pages;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Users\UserResource; use App\Filament\Admin\Resources\Users\UserResource;
use App\Models\User; use App\Models\User;
use App\Services\Users\UserUpdateService; use App\Services\Users\UserUpdateService;
@@ -11,7 +12,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Filament\Support\Enums\IconSize;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
class EditUser extends EditRecord class EditUser extends EditRecord
@@ -33,12 +33,14 @@ class EditUser extends EditRecord
{ {
return [ return [
DeleteAction::make() DeleteAction::make()
->label(fn (User $user) => user()?->id === $user->id ? trans('admin/user.self_delete') : ($user->servers()->count() > 0 ? trans('admin/user.has_servers') : trans('filament-actions::delete.single.modal.actions.delete.label'))) ->tooltip(fn (User $user) => user()?->id === $user->id ? trans('admin/user.self_delete') : ($user->servers()->count() > 0 ? trans('admin/user.has_servers') : trans('filament-actions::delete.single.modal.actions.delete.label')))
->disabled(fn (User $user) => user()?->id === $user->id || $user->servers()->count() > 0) ->disabled(fn (User $user) => user()?->id === $user->id || $user->servers()->count() > 0),
->iconButton()->iconSize(IconSize::ExtraLarge), Action::make('save')
$this->getSaveFormAction()->formId('form') ->hiddenLabel()
->iconButton()->iconSize(IconSize::ExtraLarge) ->action('save')
->icon('tabler-device-floppy'), ->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }

View File

@@ -5,11 +5,7 @@ namespace App\Filament\Admin\Resources\Users\Pages;
use App\Filament\Admin\Resources\Users\UserResource; use App\Filament\Admin\Resources\Users\UserResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListUsers extends ListRecords class ListUsers extends ListRecords
{ {
@@ -17,14 +13,4 @@ class ListUsers extends ListRecords
use CanCustomizeHeaderWidgets; use CanCustomizeHeaderWidgets;
protected static string $resource = UserResource::class; protected static string $resource = UserResource::class;
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->icon('tabler-user-plus'),
];
}
} }

View File

@@ -9,7 +9,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord; use Filament\Resources\Pages\ViewRecord;
use Filament\Support\Enums\IconSize;
class ViewUser extends ViewRecord class ViewUser extends ViewRecord
{ {
@@ -22,8 +21,7 @@ class ViewUser extends ViewRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
EditAction::make() EditAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge),
]; ];
} }
} }

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Admin\Resources\Users; namespace App\Filament\Admin\Resources\Users;
use App\Enums\CustomizationKey; use App\Enums\CustomizationKey;
use App\Enums\TablerIcon;
use App\Extensions\OAuth\OAuthService; use App\Extensions\OAuth\OAuthService;
use App\Facades\Activity; use App\Facades\Activity;
use App\Filament\Admin\Resources\Users\Pages\CreateUser; use App\Filament\Admin\Resources\Users\Pages\CreateUser;
@@ -21,9 +22,12 @@ use App\Traits\Filament\CanCustomizeRelations;
use App\Traits\Filament\CanCustomizeStaticTabs; use App\Traits\Filament\CanCustomizeStaticTabs;
use App\Traits\Filament\CanModifyForm; use App\Traits\Filament\CanModifyForm;
use App\Traits\Filament\CanModifyTable; use App\Traits\Filament\CanModifyTable;
use BackedEnum;
use DateTimeZone; use DateTimeZone;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Actions\ViewAction; use Filament\Actions\ViewAction;
@@ -66,7 +70,7 @@ class UserResource extends Resource
protected static ?string $model = User::class; protected static ?string $model = User::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-users'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Users;
protected static ?string $recordTitleAttribute = 'username'; protected static ?string $recordTitleAttribute = 'username';
@@ -117,7 +121,7 @@ class UserResource extends Resource
IconColumn::make('mfa_email_enabled') IconColumn::make('mfa_email_enabled')
->label(trans('profile.tabs.2fa')) ->label(trans('profile.tabs.2fa'))
->visibleFrom('lg') ->visibleFrom('lg')
->icon(fn (User $user) => filled($user->mfa_app_secret) ? 'tabler-qrcode' : ($user->mfa_email_enabled ? 'tabler-mail' : 'tabler-lock-open-off')) ->icon(fn (User $user) => filled($user->mfa_app_secret) ? TablerIcon::Qrcode : ($user->mfa_email_enabled ? TablerIcon::Mail : TablerIcon::LockOpenOff))
->tooltip(fn (User $user) => filled($user->mfa_app_secret) ? 'App' : ($user->mfa_email_enabled ? 'E-Mail' : 'None')), ->tooltip(fn (User $user) => filled($user->mfa_app_secret) ? 'App' : ($user->mfa_email_enabled ? 'E-Mail' : 'None')),
TextColumn::make('roles.name') TextColumn::make('roles.name')
->label(trans('admin/user.roles')) ->label(trans('admin/user.roles'))
@@ -136,10 +140,15 @@ class UserResource extends Resource
->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()), ->hidden(fn ($record) => static::getEditAuthorizationResponse($record)->allowed()),
EditAction::make(), EditAction::make(),
]) ])
->checkIfRecordIsSelectableUsing(fn (User $user) => user()?->id !== $user->id && !$user->servers_count) ->toolbarActions([
->groupedBulkActions([ BulkActionGroup::make([
DeleteBulkAction::make(), DeleteBulkAction::make(),
]); ]),
CreateAction::make()
->hiddenLabel()
->icon(TablerIcon::UserPlus),
])
->checkIfRecordIsSelectableUsing(fn (User $user) => user()?->id !== $user->id && !$user->servers_count);
} }
public static function defaultForm(Schema $schema): Schema public static function defaultForm(Schema $schema): Schema
@@ -159,7 +168,7 @@ class UserResource extends Resource
return [ return [
Tab::make('account') Tab::make('account')
->label(trans('profile.tabs.account')) ->label(trans('profile.tabs.account'))
->icon('tabler-user-cog') ->icon(TablerIcon::UserCog)
->columns([ ->columns([
'default' => 1, 'default' => 1,
'md' => 3, 'md' => 3,
@@ -194,13 +203,13 @@ class UserResource extends Resource
'md' => 1, 'md' => 1,
'lg' => 1, 'lg' => 1,
]) ])
->hintIcon(fn ($operation) => $operation === 'create' ? 'tabler-question-mark' : null, fn ($operation) => $operation === 'create' ? trans('admin/user.password_help') : null) ->hintIcon(fn ($operation) => $operation === 'create' ? TablerIcon::QuestionMark : null, fn ($operation) => $operation === 'create' ? trans('admin/user.password_help') : null)
->password() ->password()
->hintAction( ->hintAction(
Action::make('password_reset') Action::make('hint_password_reset')
->label(trans('admin/user.password_reset')) ->label(trans('admin/user.password_reset'))
->hidden(fn (string $operation) => $operation === 'create' || config('mail.default', 'log') === 'log') ->hidden(fn (string $operation) => $operation === 'create' || config('mail.default', 'log') === 'log')
->icon('tabler-send') ->icon(TablerIcon::Send)
->action(function (User $user) { ->action(function (User $user) {
$status = Password::broker(Filament::getPanel('app')->getAuthPasswordBroker())->sendResetLink([ $status = Password::broker(Filament::getPanel('app')->getAuthPasswordBroker())->sendResetLink([
'email' => $user->email, 'email' => $user->email,
@@ -237,7 +246,7 @@ class UserResource extends Resource
]), ]),
Toggle::make('is_managed_externally') Toggle::make('is_managed_externally')
->label(trans('admin/user.is_managed_externally')) ->label(trans('admin/user.is_managed_externally'))
->hintIcon('tabler-question-mark', trans('admin/user.is_managed_externally_helper')) ->hintIcon(TablerIcon::QuestionMark, trans('admin/user.is_managed_externally_helper'))
->inline(false) ->inline(false)
->columnSpan([ ->columnSpan([
'default' => 1, 'default' => 1,
@@ -252,7 +261,7 @@ class UserResource extends Resource
Select::make('timezone') Select::make('timezone')
->label(trans('profile.timezone')) ->label(trans('profile.timezone'))
->required() ->required()
->prefixIcon('tabler-clock-pin') ->prefixIcon(TablerIcon::ClockPin)
->default(fn () => config('app.timezone', 'UTC')) ->default(fn () => config('app.timezone', 'UTC'))
->selectablePlaceholder(false) ->selectablePlaceholder(false)
->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz])) ->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz]))
@@ -260,7 +269,7 @@ class UserResource extends Resource
Select::make('language') Select::make('language')
->label(trans('profile.language')) ->label(trans('profile.language'))
->required() ->required()
->prefixIcon('tabler-flag') ->prefixIcon(TablerIcon::Flag)
->live() ->live()
->default('en') ->default('en')
->searchable() ->searchable()
@@ -315,7 +324,7 @@ class UserResource extends Resource
$actions[] = Action::make("oauth_$id") $actions[] = Action::make("oauth_$id")
->label(trans('profile.unlink', ['name' => $name])) ->label(trans('profile.unlink', ['name' => $name]))
->icon('tabler-unlink') ->icon(TablerIcon::Unlink)
->requiresConfirmation() ->requiresConfirmation()
->color($color) ->color($color)
->action(function ($livewire) use ($oauthService, $user, $name, $schema) { ->action(function ($livewire) use ($oauthService, $user, $name, $schema) {
@@ -341,7 +350,7 @@ class UserResource extends Resource
]), ]),
Tab::make('roles') Tab::make('roles')
->label(trans('admin/user.roles')) ->label(trans('admin/user.roles'))
->icon('tabler-users-group') ->icon(TablerIcon::UsersGroup)
->schema([ ->schema([
CheckboxList::make('roles') CheckboxList::make('roles')
->hidden(fn (?User $user) => $user && $user->isRootAdmin()) ->hidden(fn (?User $user) => $user && $user->isRootAdmin())
@@ -368,7 +377,7 @@ class UserResource extends Resource
Tab::make('keys') Tab::make('keys')
->visible(fn (?User $user) => $user) ->visible(fn (?User $user) => $user)
->label(trans('profile.tabs.keys')) ->label(trans('profile.tabs.keys'))
->icon('tabler-key') ->icon(TablerIcon::Key)
->schema([ ->schema([
Section::make(trans('profile.api_keys')) Section::make(trans('profile.api_keys'))
->columnSpan(2) ->columnSpan(2)
@@ -464,7 +473,7 @@ class UserResource extends Resource
->visible(fn (?User $user) => $user) ->visible(fn (?User $user) => $user)
->disabledOn('create') ->disabledOn('create')
->label(trans('profile.tabs.activity')) ->label(trans('profile.tabs.activity'))
->icon('tabler-history') ->icon(TablerIcon::History)
->schema([ ->schema([
Repeater::make('activity') Repeater::make('activity')
->hiddenLabel() ->hiddenLabel()

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Webhooks\Pages; namespace App\Filament\Admin\Resources\Webhooks\Pages;
use App\Enums\TablerIcon;
use App\Enums\WebhookType; use App\Enums\WebhookType;
use App\Filament\Admin\Resources\Webhooks\WebhookResource; use App\Filament\Admin\Resources\Webhooks\WebhookResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
@@ -9,7 +10,6 @@ use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Resources\Pages\CreateRecord; use Filament\Resources\Pages\CreateRecord;
use Filament\Support\Enums\IconSize;
class CreateWebhookConfiguration extends CreateRecord class CreateWebhookConfiguration extends CreateRecord
{ {
@@ -25,11 +25,15 @@ class CreateWebhookConfiguration extends CreateRecord
{ {
return [ return [
$this->getCancelFormAction()->formId('form') $this->getCancelFormAction()->formId('form')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-arrow-left'), ->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.cancel.label'))
$this->getCreateFormAction()->formId('form') ->icon(TablerIcon::ArrowLeft),
->iconButton()->iconSize(IconSize::ExtraLarge) Action::make('create')
->icon('tabler-file-plus'), ->hiddenLabel()
->action('create')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/create-record.form.actions.create.label'))
->icon(TablerIcon::Plus),
]; ];
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Webhooks\Pages; namespace App\Filament\Admin\Resources\Webhooks\Pages;
use App\Enums\TablerIcon;
use App\Enums\WebhookType; use App\Enums\WebhookType;
use App\Filament\Admin\Resources\Webhooks\WebhookResource; use App\Filament\Admin\Resources\Webhooks\WebhookResource;
use App\Models\WebhookConfiguration; use App\Models\WebhookConfiguration;
@@ -11,7 +12,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\DeleteAction; use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Filament\Support\Enums\IconSize;
class EditWebhookConfiguration extends EditRecord class EditWebhookConfiguration extends EditRecord
{ {
@@ -24,17 +24,19 @@ class EditWebhookConfiguration extends EditRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
DeleteAction::make() DeleteAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge),
Action::make('test_now') Action::make('test_now')
->label(trans('admin/webhook.test_now')) ->tooltip(trans('admin/webhook.test_now'))
->color('primary') ->color('primary')
->disabled(fn (WebhookConfiguration $webhookConfiguration) => count($webhookConfiguration->events) === 0) ->disabled(fn (WebhookConfiguration $webhookConfiguration) => count($webhookConfiguration->events) === 0)
->action(fn (WebhookConfiguration $webhookConfiguration) => $webhookConfiguration->run()) ->action(fn (WebhookConfiguration $webhookConfiguration) => $webhookConfiguration->run())
->tooltip(trans('admin/webhook.test_now_help')), ->icon(TablerIcon::TestPipe),
$this->getSaveFormAction()->formId('form') Action::make('save')
->iconButton()->iconSize(IconSize::ExtraLarge) ->hiddenLabel()
->icon('tabler-device-floppy'), ->action('save')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }

View File

@@ -5,11 +5,7 @@ namespace App\Filament\Admin\Resources\Webhooks\Pages;
use App\Filament\Admin\Resources\Webhooks\WebhookResource; use App\Filament\Admin\Resources\Webhooks\WebhookResource;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords; use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListWebhookConfigurations extends ListRecords class ListWebhookConfigurations extends ListRecords
{ {
@@ -17,14 +13,4 @@ class ListWebhookConfigurations extends ListRecords
use CanCustomizeHeaderWidgets; use CanCustomizeHeaderWidgets;
protected static string $resource = WebhookResource::class; protected static string $resource = WebhookResource::class;
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->iconButton()->iconSize(IconSize::ExtraLarge)
->icon('tabler-file-plus'),
];
}
} }

View File

@@ -9,7 +9,6 @@ use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Resources\Pages\ViewRecord; use Filament\Resources\Pages\ViewRecord;
use Filament\Support\Enums\IconSize;
class ViewWebhookConfiguration extends ViewRecord class ViewWebhookConfiguration extends ViewRecord
{ {
@@ -22,8 +21,7 @@ class ViewWebhookConfiguration extends ViewRecord
protected function getDefaultHeaderActions(): array protected function getDefaultHeaderActions(): array
{ {
return [ return [
EditAction::make() EditAction::make(),
->iconButton()->iconSize(IconSize::ExtraLarge),
]; ];
} }
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Resources\Webhooks; namespace App\Filament\Admin\Resources\Webhooks;
use App\Enums\TablerIcon;
use App\Enums\WebhookType; use App\Enums\WebhookType;
use App\Filament\Admin\Resources\Webhooks\Pages\CreateWebhookConfiguration; use App\Filament\Admin\Resources\Webhooks\Pages\CreateWebhookConfiguration;
use App\Filament\Admin\Resources\Webhooks\Pages\EditWebhookConfiguration; use App\Filament\Admin\Resources\Webhooks\Pages\EditWebhookConfiguration;
@@ -13,8 +14,11 @@ use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations; use App\Traits\Filament\CanCustomizeRelations;
use App\Traits\Filament\CanModifyForm; use App\Traits\Filament\CanModifyForm;
use App\Traits\Filament\CanModifyTable; use App\Traits\Filament\CanModifyTable;
use BackedEnum;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteBulkAction; use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction; use Filament\Actions\EditAction;
use Filament\Actions\ReplicateAction; use Filament\Actions\ReplicateAction;
@@ -51,7 +55,7 @@ class WebhookResource extends Resource
protected static ?string $model = WebhookConfiguration::class; protected static ?string $model = WebhookConfiguration::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-webhook'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Webhook;
protected static ?string $recordTitleAttribute = 'description'; protected static ?string $recordTitleAttribute = 'description';
@@ -107,10 +111,13 @@ class WebhookResource extends Resource
->beforeReplicaSaved(fn (WebhookConfiguration $replica) => $replica->description .= ' Copy ' . now()->format('Y-m-d H:i:s')) ->beforeReplicaSaved(fn (WebhookConfiguration $replica) => $replica->description .= ' Copy ' . now()->format('Y-m-d H:i:s'))
->successRedirectUrl(fn (WebhookConfiguration $replica) => EditWebhookConfiguration::getUrl(['record' => $replica])), ->successRedirectUrl(fn (WebhookConfiguration $replica) => EditWebhookConfiguration::getUrl(['record' => $replica])),
]) ])
->groupedBulkActions([ ->toolbarActions([
DeleteBulkAction::make(), CreateAction::make(),
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]) ])
->emptyStateIcon('tabler-webhook') ->emptyStateIcon(TablerIcon::Webhook)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(trans('admin/webhook.no_webhooks')) ->emptyStateHeading(trans('admin/webhook.no_webhooks'))
->persistFiltersInSession() ->persistFiltersInSession()
@@ -143,9 +150,9 @@ class WebhookResource extends Resource
->schema(fn () => self::getRegularFields()) ->schema(fn () => self::getRegularFields())
->headerActions([ ->headerActions([
Action::make('reset_headers') Action::make('reset_headers')
->label(trans('admin/webhook.reset_headers')) ->tooltip(trans('admin/webhook.reset_headers'))
->color('danger') ->color('danger')
->icon('heroicon-o-trash') ->icon(TablerIcon::Restore)
->action(fn (Get $get, Set $set) => $set('headers', [ ->action(fn (Get $get, Set $set) => $set('headers', [
'X-Webhook-Event' => '{{event}}', 'X-Webhook-Event' => '{{event}}',
])), ])),
@@ -330,7 +337,7 @@ class WebhookResource extends Resource
AlertBanner::make('discord_webhook_help') AlertBanner::make('discord_webhook_help')
->title(trans('admin/webhook.help')) ->title(trans('admin/webhook.help'))
->body(trans('admin/webhook.help_text')) ->body(trans('admin/webhook.help_text'))
->icon('tabler-question-mark') ->icon(TablerIcon::QuestionMark)
->info() ->info()
->send(); ->send();
} }

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Widgets; namespace App\Filament\Admin\Widgets;
use App\Enums\TablerIcon;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
@@ -25,7 +26,7 @@ class CanaryWidget extends FormWidget
return $schema return $schema
->components([ ->components([
Section::make(trans('admin/dashboard.sections.intro-developers.heading')) Section::make(trans('admin/dashboard.sections.intro-developers.heading'))
->icon('tabler-code') ->icon(TablerIcon::Code)
->iconColor('primary') ->iconColor('primary')
->collapsible() ->collapsible()
->collapsed() ->collapsed()
@@ -39,9 +40,9 @@ class CanaryWidget extends FormWidget
->state(trans('admin/dashboard.sections.intro-developers.extra_note')), ->state(trans('admin/dashboard.sections.intro-developers.extra_note')),
]) ])
->headerActions([ ->headerActions([
Action::make('issues') Action::make('db_issues')
->label(trans('admin/dashboard.sections.intro-developers.button_issues')) ->label(trans('admin/dashboard.sections.intro-developers.button_issues'))
->icon('tabler-brand-github') ->icon(TablerIcon::BrandGithub)
->url('https://github.com/pelican-dev/panel/issues', true), ->url('https://github.com/pelican-dev/panel/issues', true),
]), ]),
]); ]);

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Widgets; namespace App\Filament\Admin\Widgets;
use App\Enums\TablerIcon;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
@@ -20,7 +21,7 @@ class HelpWidget extends FormWidget
return $schema return $schema
->components([ ->components([
Section::make(trans('admin/dashboard.sections.intro-help.heading')) Section::make(trans('admin/dashboard.sections.intro-help.heading'))
->icon('tabler-question-mark') ->icon(TablerIcon::QuestionMark)
->iconColor('info') ->iconColor('info')
->collapsible() ->collapsible()
->persistCollapsed() ->persistCollapsed()
@@ -30,9 +31,9 @@ class HelpWidget extends FormWidget
->state(trans('admin/dashboard.sections.intro-help.content')), ->state(trans('admin/dashboard.sections.intro-help.content')),
]) ])
->headerActions([ ->headerActions([
Action::make('docs') Action::make('db_docs')
->label(trans('admin/dashboard.sections.intro-help.button_docs')) ->label(trans('admin/dashboard.sections.intro-help.button_docs'))
->icon('tabler-speedboat') ->icon(TablerIcon::Speedboat)
->url('https://pelican.dev/docs', true), ->url('https://pelican.dev/docs', true),
]), ]),
]); ]);

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Widgets; namespace App\Filament\Admin\Widgets;
use App\Enums\TablerIcon;
use App\Filament\Admin\Resources\Nodes\Pages\CreateNode; use App\Filament\Admin\Resources\Nodes\Pages\CreateNode;
use App\Models\Node; use App\Models\Node;
use Exception; use Exception;
@@ -27,7 +28,7 @@ class NoNodesWidget extends FormWidget
return $schema return $schema
->components([ ->components([
Section::make(trans('admin/dashboard.sections.intro-first-node.heading')) Section::make(trans('admin/dashboard.sections.intro-first-node.heading'))
->icon('tabler-server-2') ->icon(TablerIcon::Server2)
->iconColor('primary') ->iconColor('primary')
->collapsible() ->collapsible()
->persistCollapsed() ->persistCollapsed()
@@ -37,9 +38,9 @@ class NoNodesWidget extends FormWidget
->state(trans('admin/dashboard.sections.intro-first-node.content')), ->state(trans('admin/dashboard.sections.intro-first-node.content')),
]) ])
->headerActions([ ->headerActions([
Action::make('create-node') Action::make('db_create-node')
->label(trans('admin/dashboard.sections.intro-first-node.button_label')) ->label(trans('admin/dashboard.sections.intro-first-node.button_label'))
->icon('tabler-server-2') ->icon(TablerIcon::Server2)
->url(CreateNode::getUrl()), ->url(CreateNode::getUrl()),
]), ]),
]); ]);

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Widgets; namespace App\Filament\Admin\Widgets;
use App\Enums\TablerIcon;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
@@ -20,7 +21,7 @@ class SupportWidget extends FormWidget
return $schema return $schema
->components([ ->components([
Section::make(trans('admin/dashboard.sections.intro-support.heading')) Section::make(trans('admin/dashboard.sections.intro-support.heading'))
->icon('tabler-heart-filled') ->icon(TablerIcon::HeartFilled)
->iconColor('danger') ->iconColor('danger')
->collapsible() ->collapsible()
->persistCollapsed() ->persistCollapsed()
@@ -33,9 +34,9 @@ class SupportWidget extends FormWidget
->state(trans('admin/dashboard.sections.intro-support.extra_note')), ->state(trans('admin/dashboard.sections.intro-support.extra_note')),
]) ])
->headerActions([ ->headerActions([
Action::make('donate') Action::make('db_donate')
->label(trans('admin/dashboard.sections.intro-support.button_donate')) ->label(trans('admin/dashboard.sections.intro-support.button_donate'))
->icon('tabler-cash') ->icon(TablerIcon::Cash)
->url('https://pelican.dev/donate', true) ->url('https://pelican.dev/donate', true)
->color('success'), ->color('success'),
]), ]),

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Admin\Widgets; namespace App\Filament\Admin\Widgets;
use App\Enums\TablerIcon;
use App\Services\Helpers\SoftwareVersionService; use App\Services\Helpers\SoftwareVersionService;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
@@ -31,7 +32,7 @@ class UpdateWidget extends FormWidget
->components([ ->components([
$isLatest $isLatest
? Section::make(trans('admin/dashboard.sections.intro-no-update.heading')) ? Section::make(trans('admin/dashboard.sections.intro-no-update.heading'))
->icon('tabler-checkbox') ->icon(TablerIcon::Checkbox)
->iconColor('success') ->iconColor('success')
->schema([ ->schema([
TextEntry::make('info') TextEntry::make('info')
@@ -39,14 +40,14 @@ class UpdateWidget extends FormWidget
->state(trans('admin/dashboard.sections.intro-no-update.content', ['version' => $this->softwareVersionService->currentPanelVersion()])), ->state(trans('admin/dashboard.sections.intro-no-update.content', ['version' => $this->softwareVersionService->currentPanelVersion()])),
]) ])
: Section::make(trans('admin/dashboard.sections.intro-update-available.heading')) : Section::make(trans('admin/dashboard.sections.intro-update-available.heading'))
->icon('tabler-info-circle') ->icon(TablerIcon::InfoCircle)
->iconColor('warning') ->iconColor('warning')
->schema([ ->schema([
TextEntry::make('info') TextEntry::make('info')
->hiddenLabel() ->hiddenLabel()
->state(trans('admin/dashboard.sections.intro-update-available.content', ['latestVersion' => $this->softwareVersionService->latestPanelVersion()])), ->state(trans('admin/dashboard.sections.intro-update-available.content', ['latestVersion' => $this->softwareVersionService->latestPanelVersion()])),
Section::make(trans('admin/dashboard.sections.intro-update-available.button_changelog')) Section::make(trans('admin/dashboard.sections.intro-update-available.button_changelog'))
->icon('tabler-script') ->icon(TablerIcon::Script)
->collapsible() ->collapsible()
->collapsed() ->collapsed()
->schema([ ->schema([
@@ -57,9 +58,9 @@ class UpdateWidget extends FormWidget
]), ]),
]) ])
->headerActions([ ->headerActions([
Action::make('update') Action::make('db_update')
->label(trans('admin/dashboard.sections.intro-update-available.heading')) ->label(trans('admin/dashboard.sections.intro-update-available.heading'))
->icon('tabler-clipboard-text') ->icon(TablerIcon::ClipboardText)
->url('https://pelican.dev/docs/panel/update', true) ->url('https://pelican.dev/docs/panel/update', true)
->color('warning'), ->color('warning'),
]), ]),

View File

@@ -5,6 +5,7 @@ namespace App\Filament\App\Resources\Servers\Pages;
use App\Enums\CustomizationKey; use App\Enums\CustomizationKey;
use App\Enums\ServerResourceType; use App\Enums\ServerResourceType;
use App\Enums\SubuserPermission; use App\Enums\SubuserPermission;
use App\Enums\TablerIcon;
use App\Filament\App\Resources\Servers\ServerResource; use App\Filament\App\Resources\Servers\ServerResource;
use App\Filament\Components\Tables\Columns\ProgressBarColumn; use App\Filament\Components\Tables\Columns\ProgressBarColumn;
use App\Filament\Components\Tables\Columns\ServerEntryColumn; use App\Filament\Components\Tables\Columns\ServerEntryColumn;
@@ -127,7 +128,7 @@ class ListServers extends ListRecords
->recordActions(!$usingGrid ? static::getPowerActionGroup() : []) ->recordActions(!$usingGrid ? static::getPowerActionGroup() : [])
->recordActionsAlignment(Alignment::Center->value) ->recordActionsAlignment(Alignment::Center->value)
->contentGrid($usingGrid ? ['default' => 1, 'md' => 2] : null) ->contentGrid($usingGrid ? ['default' => 1, 'md' => 2] : null)
->emptyStateIcon('tabler-brand-docker') ->emptyStateIcon(TablerIcon::BrandDocker)
->emptyStateDescription('') ->emptyStateDescription('')
->emptyStateHeading(fn () => $this->activeTab === 'my' ? 'You don\'t own any servers!' : 'You don\'t have access to any servers!') ->emptyStateHeading(fn () => $this->activeTab === 'my' ? 'You don\'t own any servers!' : 'You don\'t have access to any servers!')
->persistFiltersInSession() ->persistFiltersInSession()
@@ -243,34 +244,34 @@ class ListServers extends ListRecords
Action::make('start') Action::make('start')
->label(trans('server/console.power_actions.start')) ->label(trans('server/console.power_actions.start'))
->color('primary') ->color('primary')
->icon('tabler-player-play-filled') ->icon(TablerIcon::PlayerPlayFilled)
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStart, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStart, $server))
->visible(fn (Server $server) => $server->retrieveStatus()->isStartable()) ->visible(fn (Server $server) => $server->retrieveStatus()->isStartable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'start']), ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'start']),
Action::make('restart') Action::make('restart')
->label(trans('server/console.power_actions.restart')) ->label(trans('server/console.power_actions.restart'))
->color('gray') ->color('gray')
->icon('tabler-reload') ->icon(TablerIcon::Reload)
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlRestart, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlRestart, $server))
->visible(fn (Server $server) => $server->retrieveStatus()->isRestartable()) ->visible(fn (Server $server) => $server->retrieveStatus()->isRestartable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'restart']), ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'restart']),
Action::make('stop') Action::make('stop')
->label(trans('server/console.power_actions.stop')) ->label(trans('server/console.power_actions.stop'))
->color('danger') ->color('danger')
->icon('tabler-player-stop-filled') ->icon(TablerIcon::PlayerStopFilled)
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server))
->visible(fn (Server $server) => $server->retrieveStatus()->isStoppable() && !$server->retrieveStatus()->isKillable()) ->visible(fn (Server $server) => $server->retrieveStatus()->isStoppable() && !$server->retrieveStatus()->isKillable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'stop']), ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'stop']),
Action::make('kill') Action::make('kill')
->label(trans('server/console.power_actions.kill')) ->label(trans('server/console.power_actions.kill'))
->color('danger') ->color('danger')
->icon('tabler-alert-square') ->icon(TablerIcon::AlertSquare)
->tooltip(trans('server/console.power_actions.kill_tooltip')) ->tooltip(trans('server/console.power_actions.kill_tooltip'))
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server))
->visible(fn (Server $server) => $server->retrieveStatus()->isKillable()) ->visible(fn (Server $server) => $server->retrieveStatus()->isKillable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'kill']), ->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'kill']),
]) ])
->icon('tabler-power') ->icon(TablerIcon::Power)
->color('primary') ->color('primary')
->tooltip(trans('server/dashboard.power_actions')) ->tooltip(trans('server/dashboard.power_actions'))
->hidden(fn (Server $server) => $server->isInConflictState()) ->hidden(fn (Server $server) => $server->isInConflictState())

View File

@@ -2,15 +2,17 @@
namespace App\Filament\App\Resources\Servers; namespace App\Filament\App\Resources\Servers;
use App\Enums\TablerIcon;
use App\Filament\App\Resources\Servers\Pages\ListServers; use App\Filament\App\Resources\Servers\Pages\ListServers;
use App\Models\Server; use App\Models\Server;
use BackedEnum;
use Filament\Resources\Resource; use Filament\Resources\Resource;
class ServerResource extends Resource class ServerResource extends Resource
{ {
protected static ?string $model = Server::class; protected static ?string $model = Server::class;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-brand-docker'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::BrandDocker;
protected static ?string $slug = '/'; protected static ?string $slug = '/';

View File

@@ -2,10 +2,10 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\TablerIcon;
use App\Models\Server; use App\Models\Server;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Support\Enums\IconSize;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
class DeleteServerIcon extends Action class DeleteServerIcon extends Action
@@ -23,11 +23,9 @@ class DeleteServerIcon extends Action
$this->hiddenLabel(); $this->hiddenLabel();
$this->icon('tabler-trash'); $this->tooltip(trans('admin/server.import_image'));
$this->iconButton(); $this->icon(TablerIcon::Trash);
$this->iconSize(IconSize::Large);
$this->color('danger'); $this->color('danger');

View File

@@ -3,11 +3,11 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\EggFormat; use App\Enums\EggFormat;
use App\Enums\TablerIcon;
use App\Models\Egg; use App\Models\Egg;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Infolists\Components\TextEntry; use Filament\Infolists\Components\TextEntry;
use Filament\Support\Enums\Alignment; use Filament\Support\Enums\Alignment;
use Filament\Support\Enums\IconSize;
class ExportEggAction extends Action class ExportEggAction extends Action
{ {
@@ -20,15 +20,11 @@ class ExportEggAction extends Action
{ {
parent::setUp(); parent::setUp();
$this->label(trans('filament-actions::export.modal.actions.export.label')); $this->tooltip(trans('filament-actions::export.modal.actions.export.label'));
$this->iconButton(); $this->icon(TablerIcon::Download);
$this->icon('tabler-download'); $this->tableIcon(TablerIcon::Download);
$this->tableIcon('tabler-download');
$this->iconSize(IconSize::ExtraLarge);
$this->authorize(fn () => user()?->can('export egg')); $this->authorize(fn () => user()?->can('export egg'));
@@ -45,11 +41,11 @@ class ExportEggAction extends Action
$this->modalFooterActionsAlignment(Alignment::Center); $this->modalFooterActionsAlignment(Alignment::Center);
$this->modalFooterActions([ $this->modalFooterActions([
Action::make('json') Action::make('exclude_json')
->label(trans('admin/egg.export.as', ['format' => 'json'])) ->label(trans('admin/egg.export.as', ['format' => 'json']))
->url(fn (Egg $egg) => route('api.application.eggs.eggs.export', ['egg' => $egg, 'format' => EggFormat::JSON->value]), true) ->url(fn (Egg $egg) => route('api.application.eggs.eggs.export', ['egg' => $egg, 'format' => EggFormat::JSON->value]), true)
->close(), ->close(),
Action::make('yaml') Action::make('exclude_yaml')
->label(trans('admin/egg.export.as', ['format' => 'yaml'])) ->label(trans('admin/egg.export.as', ['format' => 'yaml']))
->url(fn (Egg $egg) => route('api.application.eggs.eggs.export', ['egg' => $egg, 'format' => EggFormat::YAML->value]), true) ->url(fn (Egg $egg) => route('api.application.eggs.eggs.export', ['egg' => $egg, 'format' => EggFormat::YAML->value]), true)
->close(), ->close(),

View File

@@ -3,12 +3,12 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\SubuserPermission; use App\Enums\SubuserPermission;
use App\Enums\TablerIcon;
use App\Models\Schedule; use App\Models\Schedule;
use App\Models\Server; use App\Models\Server;
use App\Services\Schedules\Sharing\ScheduleExporterService; use App\Services\Schedules\Sharing\ScheduleExporterService;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Facades\Filament; use Filament\Facades\Filament;
use Filament\Support\Enums\IconSize;
class ExportScheduleAction extends Action class ExportScheduleAction extends Action
{ {
@@ -23,11 +23,7 @@ class ExportScheduleAction extends Action
$this->hiddenLabel(); $this->hiddenLabel();
$this->iconButton(); $this->icon(TablerIcon::Download);
$this->iconSize(IconSize::ExtraLarge);
$this->icon('tabler-download');
$this->tooltip(trans('server/schedule.export')); $this->tooltip(trans('server/schedule.export'));

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Console\Commands\Egg\UpdateEggIndexCommand; use App\Console\Commands\Egg\UpdateEggIndexCommand;
use App\Enums\TablerIcon;
use App\Jobs\InstallEgg; use App\Jobs\InstallEgg;
use App\Models\Egg; use App\Models\Egg;
use App\Services\Eggs\Sharing\EggImporterService; use App\Services\Eggs\Sharing\EggImporterService;
@@ -17,7 +18,6 @@ use Filament\Infolists\Components\TextEntry;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Schemas\Components\Tabs; use Filament\Schemas\Components\Tabs;
use Filament\Schemas\Components\Tabs\Tab; use Filament\Schemas\Components\Tabs\Tab;
use Filament\Support\Enums\IconSize;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Artisan;
@@ -34,13 +34,11 @@ class ImportEggAction extends Action
{ {
parent::setUp(); parent::setUp();
$this->label(trans('filament-actions::import.modal.actions.import.label')); $this->tooltip(trans('filament-actions::import.modal.actions.import.label'));
$this->iconButton(); $this->hiddenLabel();
$this->icon('tabler-file-import'); $this->icon(TablerIcon::FileImport);
$this->iconSize(IconSize::ExtraLarge);
$this->modalWidth(Width::ScreenExtraLarge); $this->modalWidth(Width::ScreenExtraLarge);
@@ -139,7 +137,7 @@ class ImportEggAction extends Action
$this->importEggsFromGitHub(), $this->importEggsFromGitHub(),
Tab::make('file') Tab::make('file')
->label(trans('admin/egg.import.file')) ->label(trans('admin/egg.import.file'))
->icon('tabler-file-upload') ->icon(TablerIcon::FileUpload)
->schema([ ->schema([
FileUpload::make('files') FileUpload::make('files')
->label(trans('admin/egg.model_label')) ->label(trans('admin/egg.model_label'))
@@ -152,7 +150,7 @@ class ImportEggAction extends Action
]), ]),
Tab::make('url') Tab::make('url')
->label(trans('admin/egg.import.url')) ->label(trans('admin/egg.import.url'))
->icon('tabler-world-upload') ->icon(TablerIcon::WorldUpload)
->schema([ ->schema([
Repeater::make('urls') Repeater::make('urls')
->hiddenLabel() ->hiddenLabel()
@@ -217,7 +215,7 @@ class ImportEggAction extends Action
return Tab::make('github') return Tab::make('github')
->label(trans('admin/egg.import.github')) ->label(trans('admin/egg.import.github'))
->icon('tabler-brand-github') ->icon(TablerIcon::BrandGithub)
->columnSpanFull() ->columnSpanFull()
->schema([ ->schema([
Tabs::make('egg_tabs') Tabs::make('egg_tabs')

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\SubuserPermission; use App\Enums\SubuserPermission;
use App\Enums\TablerIcon;
use App\Models\Server; use App\Models\Server;
use App\Services\Schedules\Sharing\ScheduleImporterService; use App\Services\Schedules\Sharing\ScheduleImporterService;
use Exception; use Exception;
@@ -41,7 +42,7 @@ class ImportScheduleAction extends Action
->tabs([ ->tabs([
Tab::make('file') Tab::make('file')
->label(trans('server/schedule.import_action.file')) ->label(trans('server/schedule.import_action.file'))
->icon('tabler-file-upload') ->icon(TablerIcon::FileUpload)
->schema([ ->schema([
FileUpload::make('files') FileUpload::make('files')
->hiddenLabel() ->hiddenLabel()
@@ -54,7 +55,7 @@ class ImportScheduleAction extends Action
]), ]),
Tab::make('url') Tab::make('url')
->label(trans('server/schedule.import_action.url')) ->label(trans('server/schedule.import_action.url'))
->icon('tabler-world-upload') ->icon(TablerIcon::WorldUpload)
->schema([ ->schema([
Repeater::make('urls') Repeater::make('urls')
->hiddenLabel() ->hiddenLabel()

View File

@@ -12,7 +12,7 @@ class PreviewStartupAction extends Action
{ {
public static function getDefaultName(): ?string public static function getDefaultName(): ?string
{ {
return 'preview'; return 'hint_preview';
} }
protected function setUp(): void protected function setUp(): void

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\TablerIcon;
use App\Facades\Activity; use App\Facades\Activity;
use App\Models\Database; use App\Models\Database;
use App\Services\Databases\DatabaseManagementService; use App\Services\Databases\DatabaseManagementService;
@@ -15,16 +16,16 @@ class RotateDatabasePasswordAction extends Action
{ {
public static function getDefaultName(): ?string public static function getDefaultName(): ?string
{ {
return 'rotate'; return 'hint_rotate';
} }
protected function setUp(): void protected function setUp(): void
{ {
parent::setUp(); parent::setUp();
$this->label(trans('admin/databasehost.rotate')); $this->tooltip(trans('admin/databasehost.rotate'));
$this->icon('tabler-refresh'); $this->icon(TablerIcon::Refresh);
$this->authorize(fn (Database $database) => user()?->can('update', $database)); $this->authorize(fn (Database $database) => user()?->can('update', $database));

View File

@@ -2,12 +2,12 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\TablerIcon;
use App\Models\Egg; use App\Models\Egg;
use App\Services\Eggs\Sharing\EggImporterService; use App\Services\Eggs\Sharing\EggImporterService;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Support\Enums\IconSize;
class UpdateEggAction extends Action class UpdateEggAction extends Action
{ {
@@ -20,13 +20,9 @@ class UpdateEggAction extends Action
{ {
parent::setUp(); parent::setUp();
$this->label(trans_choice('admin/egg.update', 1)); $this->tooltip(trans_choice('admin/egg.update', 1));
$this->iconButton(); $this->icon(TablerIcon::CloudDownload);
$this->icon('tabler-cloud-download');
$this->iconSize(IconSize::ExtraLarge);
$this->color('success'); $this->color('success');

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\TablerIcon;
use App\Models\Egg; use App\Models\Egg;
use App\Services\Eggs\Sharing\EggImporterService; use App\Services\Eggs\Sharing\EggImporterService;
use Exception; use Exception;
@@ -23,7 +24,7 @@ class UpdateEggBulkAction extends BulkAction
$this->label(trans_choice('admin/egg.update', 2)); $this->label(trans_choice('admin/egg.update', 2));
$this->icon('tabler-cloud-download'); $this->icon(TablerIcon::CloudDownload);
$this->color('success'); $this->color('success');

View File

@@ -2,13 +2,13 @@
namespace App\Filament\Components\Actions; namespace App\Filament\Components\Actions;
use App\Enums\TablerIcon;
use App\Models\Allocation; use App\Models\Allocation;
use App\Models\Node; use App\Models\Node;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Forms\Components\Select; use Filament\Forms\Components\Select;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Support\Enums\IconSize;
class UpdateNodeAllocations extends Action class UpdateNodeAllocations extends Action
{ {
@@ -21,11 +21,9 @@ class UpdateNodeAllocations extends Action
{ {
parent::setUp(); parent::setUp();
$this->label(trans('admin/node.bulk_update_ip')); $this->tooltip(trans('admin/node.bulk_update_ip'));
$this->icon('tabler-replace'); $this->icon(TablerIcon::Replace);
$this->iconSize(IconSize::ExtraLarge);
$this->iconButton();
$this->color('warning'); $this->color('warning');

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Components\Forms\Fields; namespace App\Filament\Components\Forms\Fields;
use App\Enums\StartupVariableType; use App\Enums\StartupVariableType;
use App\Enums\TablerIcon;
use App\Models\ServerVariable; use App\Models\ServerVariable;
use Closure; use Closure;
use Filament\Forms\Components\Concerns\HasAffixes; use Filament\Forms\Components\Concerns\HasAffixes;
@@ -46,7 +47,7 @@ class StartupVariable extends Field
$this->prefix(fn (StartupVariable $component) => '{{' . $component->getVariableEnv() . '}}'); $this->prefix(fn (StartupVariable $component) => '{{' . $component->getVariableEnv() . '}}');
$this->hintIcon('tabler-code', fn (StartupVariable $component) => implode('|', $component->getVariableRules())); $this->hintIcon(TablerIcon::Code, fn (StartupVariable $component) => implode('|', $component->getVariableRules()));
$this->helperText(fn (StartupVariable $component) => !$component->getVariableDesc() ? '—' : $component->getVariableDesc()); $this->helperText(fn (StartupVariable $component) => !$component->getVariableDesc() ? '—' : $component->getVariableDesc());

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Pages\Auth; namespace App\Filament\Pages\Auth;
use App\Enums\CustomizationKey; use App\Enums\CustomizationKey;
use App\Enums\TablerIcon;
use App\Extensions\OAuth\OAuthService; use App\Extensions\OAuth\OAuthService;
use App\Facades\Activity; use App\Facades\Activity;
use App\Models\ActivityLog; use App\Models\ActivityLog;
@@ -40,7 +41,6 @@ use Filament\Schemas\Components\Tabs\Tab;
use Filament\Schemas\Components\Utilities\Get; use Filament\Schemas\Components\Utilities\Get;
use Filament\Schemas\Schema; use Filament\Schemas\Schema;
use Filament\Support\Colors\Color; use Filament\Support\Colors\Color;
use Filament\Support\Enums\IconSize;
use Filament\Support\Enums\Width; use Filament\Support\Enums\Width;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
@@ -104,18 +104,18 @@ class EditProfile extends BaseEditProfile
return [ return [
Tab::make('account') Tab::make('account')
->label(trans('profile.tabs.account')) ->label(trans('profile.tabs.account'))
->icon('tabler-user-cog') ->icon(TablerIcon::UserCog)
->schema([ ->schema([
TextInput::make('username') TextInput::make('username')
->disabled(fn (User $user) => $user->is_managed_externally) ->disabled(fn (User $user) => $user->is_managed_externally)
->prefixIcon('tabler-user') ->prefixIcon(TablerIcon::User)
->label(trans('profile.username')) ->label(trans('profile.username'))
->required() ->required()
->maxLength(255) ->maxLength(255)
->unique(), ->unique(),
TextInput::make('email') TextInput::make('email')
->disabled(fn (User $user) => $user->is_managed_externally) ->disabled(fn (User $user) => $user->is_managed_externally)
->prefixIcon('tabler-mail') ->prefixIcon(TablerIcon::Mail)
->label(trans('profile.email')) ->label(trans('profile.email'))
->email() ->email()
->required() ->required()
@@ -125,7 +125,7 @@ class EditProfile extends BaseEditProfile
->hidden(fn (User $user) => $user->is_managed_externally) ->hidden(fn (User $user) => $user->is_managed_externally)
->label(trans('profile.password')) ->label(trans('profile.password'))
->password() ->password()
->prefixIcon('tabler-password') ->prefixIcon(TablerIcon::Password)
->revealable(filament()->arePasswordsRevealable()) ->revealable(filament()->arePasswordsRevealable())
->rule(Password::default()) ->rule(Password::default())
->autocomplete('new-password') ->autocomplete('new-password')
@@ -136,7 +136,7 @@ class EditProfile extends BaseEditProfile
TextInput::make('passwordConfirmation') TextInput::make('passwordConfirmation')
->label(trans('profile.password_confirmation')) ->label(trans('profile.password_confirmation'))
->password() ->password()
->prefixIcon('tabler-password-fingerprint') ->prefixIcon(TablerIcon::PasswordFingerprint)
->revealable(filament()->arePasswordsRevealable()) ->revealable(filament()->arePasswordsRevealable())
->required() ->required()
->visible(fn (Get $get) => filled($get('password'))) ->visible(fn (Get $get) => filled($get('password')))
@@ -144,7 +144,7 @@ class EditProfile extends BaseEditProfile
Select::make('timezone') Select::make('timezone')
->label(trans('profile.timezone')) ->label(trans('profile.timezone'))
->required() ->required()
->prefixIcon('tabler-clock-pin') ->prefixIcon(TablerIcon::ClockPin)
->default(config('app.timezone', 'UTC')) ->default(config('app.timezone', 'UTC'))
->selectablePlaceholder(false) ->selectablePlaceholder(false)
->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz])) ->options(fn () => collect(DateTimeZone::listIdentifiers())->mapWithKeys(fn ($tz) => [$tz => $tz]))
@@ -152,7 +152,7 @@ class EditProfile extends BaseEditProfile
Select::make('language') Select::make('language')
->label(trans('profile.language')) ->label(trans('profile.language'))
->required() ->required()
->prefixIcon('tabler-flag') ->prefixIcon(TablerIcon::Flag)
->live() ->live()
->default('en') ->default('en')
->selectablePlaceholder(false) ->selectablePlaceholder(false)
@@ -185,7 +185,7 @@ class EditProfile extends BaseEditProfile
]), ]),
Tab::make('oauth') Tab::make('oauth')
->label(trans('profile.tabs.oauth')) ->label(trans('profile.tabs.oauth'))
->icon('tabler-brand-oauth') ->icon(TablerIcon::BrandOauth)
->visible(count($oauthSchemas) > 0) ->visible(count($oauthSchemas) > 0)
->schema(function () use ($oauthSchemas) { ->schema(function () use ($oauthSchemas) {
$actions = []; $actions = [];
@@ -202,7 +202,7 @@ class EditProfile extends BaseEditProfile
$actions[] = Action::make("oauth_$id") $actions[] = Action::make("oauth_$id")
->label(trans('profile.' . ($unlink ? 'unlink' : 'link'), ['name' => $name])) ->label(trans('profile.' . ($unlink ? 'unlink' : 'link'), ['name' => $name]))
->icon($unlink ? 'tabler-unlink' : 'tabler-link') ->icon($unlink ? TablerIcon::Unlink : TablerIcon::Link)
->color($color) ->color($color)
->action(function (UserUpdateService $updateService) use ($id, $name, $unlink) { ->action(function (UserUpdateService $updateService) use ($id, $name, $unlink) {
if ($unlink) { if ($unlink) {
@@ -227,7 +227,7 @@ class EditProfile extends BaseEditProfile
}), }),
Tab::make('2fa') Tab::make('2fa')
->label(trans('profile.tabs.2fa')) ->label(trans('profile.tabs.2fa'))
->icon('tabler-shield-lock') ->icon(TablerIcon::ShieldLock)
->visible(fn () => Filament::hasMultiFactorAuthentication()) ->visible(fn () => Filament::hasMultiFactorAuthentication())
->schema(collect(Filament::getMultiFactorAuthenticationProviders()) ->schema(collect(Filament::getMultiFactorAuthenticationProviders())
->sort(fn (MultiFactorAuthenticationProvider $multiFactorAuthenticationProvider) => $multiFactorAuthenticationProvider->isEnabled(Filament::auth()->user()) ? 0 : 1) ->sort(fn (MultiFactorAuthenticationProvider $multiFactorAuthenticationProvider) => $multiFactorAuthenticationProvider->isEnabled(Filament::auth()->user()) ? 0 : 1)
@@ -236,7 +236,7 @@ class EditProfile extends BaseEditProfile
->all()), ->all()),
Tab::make('api_keys') Tab::make('api_keys')
->label(trans('profile.tabs.api_keys')) ->label(trans('profile.tabs.api_keys'))
->icon('tabler-key') ->icon(TablerIcon::Key)
->schema([ ->schema([
Grid::make(5) Grid::make(5)
->schema([ ->schema([
@@ -329,7 +329,7 @@ class EditProfile extends BaseEditProfile
]), ]),
Tab::make('ssh_keys') Tab::make('ssh_keys')
->label(trans('profile.tabs.ssh_keys')) ->label(trans('profile.tabs.ssh_keys'))
->icon('tabler-lock-code') ->icon(TablerIcon::LockCode)
->schema([ ->schema([
Grid::make(5)->schema([ Grid::make(5)->schema([
Section::make(trans('profile.create_ssh_key'))->columnSpan(3) Section::make(trans('profile.create_ssh_key'))->columnSpan(3)
@@ -424,7 +424,7 @@ class EditProfile extends BaseEditProfile
]), ]),
Tab::make('activity') Tab::make('activity')
->label(trans('profile.tabs.activity')) ->label(trans('profile.tabs.activity'))
->icon('tabler-history') ->icon(TablerIcon::History)
->schema([ ->schema([
Repeater::make('activity') Repeater::make('activity')
->hiddenLabel() ->hiddenLabel()
@@ -442,11 +442,11 @@ class EditProfile extends BaseEditProfile
]), ]),
Tab::make('customization') Tab::make('customization')
->label(trans('profile.tabs.customization')) ->label(trans('profile.tabs.customization'))
->icon('tabler-adjustments') ->icon(TablerIcon::Adjustments)
->schema([ ->schema([
Section::make(trans('profile.dashboard')) Section::make(trans('profile.dashboard'))
->collapsible() ->collapsible()
->icon('tabler-dashboard') ->icon(TablerIcon::Dashboard)
->schema([ ->schema([
ToggleButtons::make('dashboard_layout') ToggleButtons::make('dashboard_layout')
->label(trans('profile.dashboard_layout')) ->label(trans('profile.dashboard_layout'))
@@ -464,10 +464,19 @@ class EditProfile extends BaseEditProfile
'topbar' => trans('profile.topbar'), 'topbar' => trans('profile.topbar'),
'mixed' => trans('profile.mixed'), 'mixed' => trans('profile.mixed'),
]), ]),
ToggleButtons::make('button_style')
->label('Button Style')
->inline()
->default('icon')
->options([
true => 'Icon',
false => 'Icon Button',
]),
]), ]),
Section::make(trans('profile.console')) Section::make(trans('profile.console'))
->collapsible() ->collapsible()
->icon('tabler-brand-tabler') ->icon(TablerIcon::Terminal2)
->columns(4) ->columns(4)
->schema([ ->schema([
TextInput::make('console_font_size') TextInput::make('console_font_size')
@@ -538,7 +547,7 @@ class EditProfile extends BaseEditProfile
TextInput::make('console_graph_period') TextInput::make('console_graph_period')
->label(trans('profile.graph_period')) ->label(trans('profile.graph_period'))
->suffix(trans('profile.seconds')) ->suffix(trans('profile.seconds'))
->hintIcon('tabler-question-mark', trans('profile.graph_period_helper')) ->hintIcon(TablerIcon::QuestionMark, trans('profile.graph_period_helper'))
->columnSpan(2) ->columnSpan(2)
->numeric() ->numeric()
->default(30) ->default(30)
@@ -567,11 +576,15 @@ class EditProfile extends BaseEditProfile
{ {
return [ return [
$this->getCancelFormAction()->formId('form') $this->getCancelFormAction()->formId('form')
->iconButton()->iconSize(IconSize::ExtraLarge) ->tooltip(trans('filament-panels::auth/pages/edit-profile.actions.cancel.label'))
->icon('tabler-arrow-left'), ->hiddenLabel()
$this->getSaveFormAction()->formId('form') ->icon(TablerIcon::ArrowLeft),
->iconButton()->iconSize(IconSize::ExtraLarge) Action::make('save')
->icon('tabler-device-floppy'), ->hiddenLabel()
->action('save')
->keyBindings(['mod+s'])
->tooltip(trans('filament-panels::resources/pages/edit-record.form.actions.save.label'))
->icon(TablerIcon::DeviceFloppy),
]; ];
} }
@@ -585,9 +598,17 @@ class EditProfile extends BaseEditProfile
'console_graph_period' => $data['console_graph_period'], 'console_graph_period' => $data['console_graph_period'],
'dashboard_layout' => $data['dashboard_layout'], 'dashboard_layout' => $data['dashboard_layout'],
'top_navigation' => $data['top_navigation'], 'top_navigation' => $data['top_navigation'],
'button_style' => $data['button_style'],
]; ];
unset($data['console_font'],$data['console_font_size'], $data['console_rows'], $data['dashboard_layout'], $data['top_navigation']); unset(
$data['console_font'],
$data['console_font_size'],
$data['console_rows'],
$data['dashboard_layout'],
$data['top_navigation'],
$data['button_style'],
);
$data['customization'] = json_encode($customization); $data['customization'] = json_encode($customization);
@@ -601,6 +622,7 @@ class EditProfile extends BaseEditProfile
$data['console_rows'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleRows); $data['console_rows'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleRows);
$data['console_graph_period'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleGraphPeriod); $data['console_graph_period'] = (int) $this->getUser()->getCustomization(CustomizationKey::ConsoleGraphPeriod);
$data['dashboard_layout'] = $this->getUser()->getCustomization(CustomizationKey::DashboardLayout); $data['dashboard_layout'] = $this->getUser()->getCustomization(CustomizationKey::DashboardLayout);
$data['button_style'] = $this->getUser()->getCustomization(CustomizationKey::ButtonStyle);
// Handle migration from boolean to string navigation types // Handle migration from boolean to string navigation types
$topNavigation = $this->getUser()->getCustomization(CustomizationKey::TopNavigation); $topNavigation = $this->getUser()->getCustomization(CustomizationKey::TopNavigation);

View File

@@ -66,6 +66,14 @@ class Login extends BaseLogin
->extraInputAttributes(['tabindex' => 1]); ->extraInputAttributes(['tabindex' => 1]);
} }
protected function getPasswordFormComponent(): Component
{
/** @var TextInput $component */
$component = parent::getPasswordFormComponent();
return $component->extraInputAttributes(['tabindex' => 2]);
}
protected function getOAuthFormComponent(): Component protected function getOAuthFormComponent(): Component
{ {
$actions = []; $actions = [];

View File

@@ -5,6 +5,7 @@ namespace App\Filament\Server\Pages;
use App\Enums\ConsoleWidgetPosition; use App\Enums\ConsoleWidgetPosition;
use App\Enums\ContainerStatus; use App\Enums\ContainerStatus;
use App\Enums\SubuserPermission; use App\Enums\SubuserPermission;
use App\Enums\TablerIcon;
use App\Exceptions\Http\Server\ServerStateConflictException; use App\Exceptions\Http\Server\ServerStateConflictException;
use App\Extensions\Features\FeatureService; use App\Extensions\Features\FeatureService;
use App\Filament\Server\Widgets\ServerConsole; use App\Filament\Server\Widgets\ServerConsole;
@@ -15,6 +16,7 @@ use App\Filament\Server\Widgets\ServerOverview;
use App\Livewire\AlertBanner; use App\Livewire\AlertBanner;
use App\Models\Server; use App\Models\Server;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use BackedEnum;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Actions\ActionGroup; use Filament\Actions\ActionGroup;
use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Concerns\InteractsWithActions;
@@ -35,7 +37,7 @@ class Console extends Page
protected static ?int $navigationSort = 1; protected static ?int $navigationSort = 1;
protected static string|\BackedEnum|null $navigationIcon = 'tabler-brand-tabler'; protected static string|BackedEnum|null $navigationIcon = TablerIcon::Terminal2;
protected string $view = 'filament.server.pages.console'; protected string $view = 'filament.server.pages.console';
@@ -163,7 +165,7 @@ class Console extends Page
Action::make('start') Action::make('start')
->label(trans('server/console.power_actions.start')) ->label(trans('server/console.power_actions.start'))
->color('primary') ->color('primary')
->icon('tabler-player-play-filled') ->icon(TablerIcon::PlayerPlayFilled)
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStart, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStart, $server))
->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isStartable()) ->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isStartable())
->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'start')) ->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'start'))
@@ -171,7 +173,7 @@ class Console extends Page
Action::make('restart') Action::make('restart')
->label(trans('server/console.power_actions.restart')) ->label(trans('server/console.power_actions.restart'))
->color('gray') ->color('gray')
->icon('tabler-reload') ->icon(TablerIcon::Reload)
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlRestart, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlRestart, $server))
->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isRestartable()) ->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isRestartable())
->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'restart')) ->action(fn (Server $server) => $this->dispatch('setServerState', uuid: $server->uuid, state: 'restart'))
@@ -179,7 +181,7 @@ class Console extends Page
Action::make('stop') Action::make('stop')
->label(trans('server/console.power_actions.stop')) ->label(trans('server/console.power_actions.stop'))
->color('danger') ->color('danger')
->icon('tabler-player-stop-filled') ->icon(TablerIcon::PlayerStopFilled)
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server))
->visible(fn () => !$this->status->isKillable()) ->visible(fn () => !$this->status->isKillable())
->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isStoppable()) ->disabled(fn (Server $server) => $server->isInConflictState() || !$this->status->isStoppable())
@@ -188,7 +190,7 @@ class Console extends Page
Action::make('kill') Action::make('kill')
->label(trans('server/console.power_actions.kill')) ->label(trans('server/console.power_actions.kill'))
->color('danger') ->color('danger')
->icon('tabler-alert-square') ->icon(TablerIcon::AlertSquare)
->tooltip(trans('server/console.power_actions.kill_tooltip')) ->tooltip(trans('server/console.power_actions.kill_tooltip'))
->requiresConfirmation() ->requiresConfirmation()
->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server)) ->authorize(fn (Server $server) => user()?->can(SubuserPermission::ControlStop, $server))

Some files were not shown because too many files have changed in this diff Show More