Move buttons to toolbars

This commit is contained in:
notCharles 2025-08-12 13:26:07 -04:00
parent ae11fd2a5e
commit 23f6825072
7 changed files with 77 additions and 148 deletions

View File

@ -8,7 +8,6 @@ use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Resources\Pages\ListRecords;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
class ListUsers extends ListRecords
{
@ -20,8 +19,6 @@ class ListUsers extends ListRecords
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make(),
];
return [];
}
}

View File

@ -7,15 +7,18 @@ use App\Facades\Activity;
use App\Models\Allocation;
use App\Models\Permission;
use App\Models\Server;
use App\Services\Allocations\FindAssignableAllocationService;
use App\Traits\Filament\BlockAccessInConflict;
use App\Traits\Filament\CanCustomizePages;
use App\Traits\Filament\CanCustomizeRelations;
use App\Traits\Filament\CanModifyTable;
use Exception;
use Filament\Actions\Action;
use Filament\Actions\DetachAction;
use Filament\Facades\Filament;
use Filament\Resources\Pages\PageRegistration;
use Filament\Resources\Resource;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\TextInputColumn;
@ -88,6 +91,28 @@ class AllocationResource extends Resource
->log();
})
->after(fn (Allocation $allocation) => $allocation->id === $server->allocation_id && $server->update(['allocation_id' => $server->allocations()->first()?->id])),
])
->toolbarActions([
Action::make('addAllocation')
->hiddenLabel()->iconButton()->iconSize(IconSize::Large)
->icon(fn () => $server->allocations()->count() >= $server->allocation_limit ? 'tabler-network-off' : 'tabler-network')
->authorize(fn () => auth()->user()->can(Permission::ACTION_ALLOCATION_CREATE, $server))
->tooltip(fn () => $server->allocations()->count() >= $server->allocation_limit ? trans('server/network.limit') : trans('server/network.add'))
->hidden(fn () => !config('panel.client_features.allocations.enabled'))
->disabled(fn () => $server->allocations()->count() >= $server->allocation_limit)
->color(fn () => $server->allocations()->count() >= $server->allocation_limit ? 'danger' : 'primary')
->action(function (FindAssignableAllocationService $service) use ($server) {
$allocation = $service->handle($server);
if (!$server->allocation_id) {
$server->update(['allocation_id' => $allocation->id]);
}
Activity::event('server:allocation.create')
->subject($allocation)
->property('allocation', $allocation->address)
->log();
}),
]);
}

View File

@ -2,18 +2,12 @@
namespace App\Filament\Server\Resources\AllocationResource\Pages;
use App\Facades\Activity;
use App\Filament\Server\Resources\AllocationResource;
use App\Models\Permission;
use App\Models\Server;
use App\Services\Allocations\FindAssignableAllocationService;
use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Facades\Filament;
use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListAllocations extends ListRecords
{
@ -25,31 +19,7 @@ class ListAllocations extends ListRecords
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
/** @var Server $server */
$server = Filament::getTenant();
return [
Action::make('addAllocation')
->hiddenLabel()->iconButton()->iconSize(IconSize::Large)
->icon(fn () => $server->allocations()->count() >= $server->allocation_limit ? 'tabler-network-off' : 'tabler-network')
->authorize(fn () => auth()->user()->can(Permission::ACTION_ALLOCATION_CREATE, $server))
->tooltip(fn () => $server->allocations()->count() >= $server->allocation_limit ? trans('server/network.limit') : trans('server/network.add'))
->hidden(fn () => !config('panel.client_features.allocations.enabled'))
->disabled(fn () => $server->allocations()->count() >= $server->allocation_limit)
->color(fn () => $server->allocations()->count() >= $server->allocation_limit ? 'danger' : 'primary')
->action(function (FindAssignableAllocationService $service) use ($server) {
$allocation = $service->handle($server);
if (!$server->allocation_id) {
$server->update(['allocation_id' => $allocation->id]);
}
Activity::event('server:allocation.create')
->subject($allocation)
->property('allocation', $allocation->address)
->log();
}),
];
return [];
}
public function getBreadcrumbs(): array

View File

@ -2,21 +2,12 @@
namespace App\Filament\Server\Resources\BackupResource\Pages;
use App\Facades\Activity;
use App\Filament\Server\Resources\BackupResource;
use App\Models\Permission;
use App\Models\Server;
use App\Services\Backups\InitiateBackupService;
use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Facades\Filament;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
use Symfony\Component\HttpKernel\Exception\HttpException;
class ListBackups extends ListRecords
{
@ -28,46 +19,7 @@ class ListBackups extends ListRecords
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
/** @var Server $server */
$server = Filament::getTenant();
return [
CreateAction::make()
->authorize(fn () => auth()->user()->can(Permission::ACTION_BACKUP_CREATE, $server))
->icon('tabler-file-zip')->iconButton()->iconSize(IconSize::Large)
->disabled(fn () => $server->backups()->count() >= $server->backup_limit)
->tooltip(fn () => $server->backups()->count() >= $server->backup_limit ? trans('server/backup.actions.create.limit') : trans('server/backup.actions.create.title'))
->color(fn () => $server->backups()->count() >= $server->backup_limit ? 'danger' : 'primary')
->createAnother(false)
->action(function (InitiateBackupService $initiateBackupService, $data) use ($server) {
$action = $initiateBackupService->setIgnoredFiles(explode(PHP_EOL, $data['ignored'] ?? ''));
if (auth()->user()->can(Permission::ACTION_BACKUP_DELETE, $server)) {
$action->setIsLocked((bool) $data['is_locked']);
}
try {
$backup = $action->handle($server, $data['name']);
Activity::event('server:backup.start')
->subject($backup)
->property(['name' => $backup->name, 'locked' => (bool) $data['is_locked']])
->log();
return Notification::make()
->title(trans('server/backup.actions.create.notification_success'))
->body(trans('server/backup.actions.create.created', ['name' => $backup->name]))
->success()
->send();
} catch (HttpException $e) {
return Notification::make()
->title(trans('server/backup.actions.create.notification_fail'))
->body($e->getMessage() . ' Try again' . ($e->getHeaders()['Retry-After'] ? ' in ' . $e->getHeaders()['Retry-After'] . ' seconds.' : ''))
->danger()
->send();
}
}),
];
return [];
}
public function getBreadcrumbs(): array

View File

@ -7,6 +7,7 @@ use App\Filament\Components\Actions\RotateDatabasePasswordAction;
use App\Filament\Server\Resources\DatabaseResource\Pages\ListDatabases;
use App\Filament\Components\Tables\Columns\DateTimeColumn;
use App\Models\Database;
use App\Models\DatabaseHost;
use App\Models\Permission;
use App\Models\Server;
use App\Services\Databases\DatabaseManagementService;
@ -17,13 +18,17 @@ use App\Traits\Filament\CanModifyForm;
use App\Traits\Filament\CanModifyTable;
use App\Traits\Filament\HasLimitBadge;
use Exception;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\ViewAction;
use Filament\Facades\Filament;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Pages\PageRegistration;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Grid;
use Filament\Schemas\Schema;
use Filament\Support\Enums\IconSize;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model;
@ -109,6 +114,9 @@ class DatabaseResource extends Resource
*/
public static function defaultTable(Table $table): Table
{
/** @var Server $server */
$server = Filament::getTenant();
return $table
->columns([
TextColumn::make('host')
@ -130,6 +138,45 @@ class DatabaseResource extends Resource
->modalHeading(fn (Database $database) => 'Viewing ' . $database->database),
DeleteAction::make()
->using(fn (Database $database, DatabaseManagementService $service) => $service->delete($database)),
])
->toolbarActions([
CreateAction::make('new')
->hiddenLabel()->iconButton()->iconSize(IconSize::Large)
->icon(fn () => $server->databases()->count() >= $server->database_limit ? 'tabler-database-x' : 'tabler-database-plus')
->tooltip(fn () => $server->databases()->count() >= $server->database_limit ? trans('server/database.limit') : trans('server/database.create_database'))
->disabled(fn () => $server->databases()->count() >= $server->database_limit)
->color(fn () => $server->databases()->count() >= $server->database_limit ? 'danger' : 'primary')
->createAnother(false)
->schema([
Grid::make()
->columns(2)
->schema([
Select::make('database_host_id')
->label(trans('server/database.database_host'))
->columnSpan(2)
->required()
->placeholder(trans('server/database.database_host_select'))
->options(fn () => $server->node->databaseHosts->mapWithKeys(fn (DatabaseHost $databaseHost) => [$databaseHost->id => $databaseHost->name])),
TextInput::make('database')
->label(trans('server/database.name'))
->columnSpan(1)
->prefix('s'. $server->id . '_')
->hintIcon('tabler-question-mark')
->hintIconTooltip(trans('server/database.name_hint')),
TextInput::make('remote')
->label(trans('server/database.connections_from'))
->columnSpan(1)
->default('%'),
]),
])
->action(function ($data, DatabaseManagementService $service) use ($server) {
if (empty($data['database'])) {
$data['database'] = str_random(12);
}
$data['database'] = 's'. $server->id . '_' . $data['database'];
$service->create($server, $data);
}),
]);
}

View File

@ -3,20 +3,11 @@
namespace App\Filament\Server\Resources\DatabaseResource\Pages;
use App\Filament\Server\Resources\DatabaseResource;
use App\Models\DatabaseHost;
use App\Models\Server;
use App\Services\Databases\DatabaseManagementService;
use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Facades\Filament;
use Filament\Schemas\Components\Grid;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListDatabases extends ListRecords
{
@ -28,48 +19,7 @@ class ListDatabases extends ListRecords
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
/** @var Server $server */
$server = Filament::getTenant();
return [
CreateAction::make('new')
->hiddenLabel()->iconButton()->iconSize(IconSize::Large)
->icon(fn () => $server->databases()->count() >= $server->database_limit ? 'tabler-database-x' : 'tabler-database-plus')
->tooltip(fn () => $server->databases()->count() >= $server->database_limit ? trans('server/database.limit') : trans('server/database.create_database'))
->disabled(fn () => $server->databases()->count() >= $server->database_limit)
->color(fn () => $server->databases()->count() >= $server->database_limit ? 'danger' : 'primary')
->createAnother(false)
->schema([
Grid::make()
->columns(2)
->schema([
Select::make('database_host_id')
->label(trans('server/database.database_host'))
->columnSpan(2)
->required()
->placeholder(trans('server/database.database_host_select'))
->options(fn () => $server->node->databaseHosts->mapWithKeys(fn (DatabaseHost $databaseHost) => [$databaseHost->id => $databaseHost->name])),
TextInput::make('database')
->label(trans('server/database.name'))
->columnSpan(1)
->prefix('s'. $server->id . '_')
->hintIcon('tabler-question-mark')
->hintIconTooltip(trans('server/database.name_hint')),
TextInput::make('remote')
->label(trans('server/database.connections_from'))
->columnSpan(1)
->default('%'),
]),
])
->action(function ($data, DatabaseManagementService $service) use ($server) {
if (empty($data['database'])) {
$data['database'] = str_random(12);
}
$data['database'] = 's'. $server->id . '_' . $data['database'];
$service->create($server, $data);
}),
];
return [];
}
public function getBreadcrumbs(): array

View File

@ -2,15 +2,12 @@
namespace App\Filament\Server\Resources\ScheduleResource\Pages;
use App\Filament\Components\Actions\ImportScheduleAction;
use App\Filament\Server\Resources\ScheduleResource;
use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Actions\Action;
use Filament\Actions\ActionGroup;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
use Filament\Support\Enums\IconSize;
class ListSchedules extends ListRecords
{
@ -22,16 +19,7 @@ class ListSchedules extends ListRecords
/** @return array<Action|ActionGroup> */
protected function getDefaultHeaderActions(): array
{
return [
CreateAction::make()
->hiddenLabel()->iconButton()->iconSize(IconSize::Large)
->icon('tabler-calendar-plus')
->tooltip(trans('server/schedule.new')),
ImportScheduleAction::make()
->hiddenLabel()->iconButton()->iconSize(IconSize::Large)
->icon('tabler-download')
->tooltip(trans('server/schedule.import')),
];
return [];
}
public function getBreadcrumbs(): array