validateCurrentState(); } catch (ServerStateConflictException $exception) { AlertBanner::make('server_conflict') ->title('Warning') ->body($exception->getMessage()) ->warning() ->send(); } } public function getWidgetData(): array { return [ 'server' => Filament::getTenant(), 'user' => auth()->user(), ]; } /** * @return class-string[] */ public function getWidgets(): array { return [ ServerOverview::class, ServerConsole::class, ServerCpuChart::class, ServerMemoryChart::class, //ServerNetworkChart::class, TODO: convert units. ]; } /** * @return array | WidgetConfiguration> */ public function getVisibleWidgets(): array { return $this->filterVisibleWidgets($this->getWidgets()); } public function getColumns(): int { return 3; } #[On('console-status')] public function receivedConsoleUpdate(?string $state = null): void { if ($state) { $this->status = ContainerStatus::from($state); } $this->cachedHeaderActions = []; $this->cacheHeaderActions(); } protected function getHeaderActions(): array { /** @var Server $server */ $server = Filament::getTenant(); return [ Action::make('start') ->color('primary') ->size(ActionSize::ExtraLarge) ->action(fn () => $this->dispatch('setServerState', state: 'start', uuid: $server->uuid)) ->authorize(fn () => auth()->user()->can(Permission::ACTION_CONTROL_START, $server)) ->disabled(fn () => $server->isInConflictState() || !$this->status->isStartable()), Action::make('restart') ->color('gray') ->size(ActionSize::ExtraLarge) ->action(fn () => $this->dispatch('setServerState', state: 'restart', uuid: $server->uuid)) ->authorize(fn () => auth()->user()->can(Permission::ACTION_CONTROL_RESTART, $server)) ->disabled(fn () => $server->isInConflictState() || !$this->status->isRestartable()), Action::make('stop') ->color('danger') ->size(ActionSize::ExtraLarge) ->action(fn () => $this->dispatch('setServerState', state: 'stop', uuid: $server->uuid)) ->authorize(fn () => auth()->user()->can(Permission::ACTION_CONTROL_STOP, $server)) ->hidden(fn () => $this->status->isStartingOrStopping() || $this->status->isKillable()) ->disabled(fn () => $server->isInConflictState() || !$this->status->isStoppable()), Action::make('kill') ->color('danger') ->requiresConfirmation() ->modalHeading('Do you wish to kill this server?') ->modalDescription('This can result in data corruption and/or data loss!') ->modalSubmitActionLabel('Kill Server') ->size(ActionSize::ExtraLarge) ->action(fn () => $this->dispatch('setServerState', state: 'kill', uuid: $server->uuid)) ->authorize(fn () => auth()->user()->can(Permission::ACTION_CONTROL_STOP, $server)) ->hidden(fn () => $server->isInConflictState() || !$this->status->isKillable()), ]; } }