mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-10-31 20:06:52 +01:00 
			
		
		
		
	Wip
This commit is contained in:
		
							parent
							
								
									48fd3cc84e
								
							
						
					
					
						commit
						eb0bad82e6
					
				| @ -2,6 +2,9 @@ | |||||||
| 
 | 
 | ||||||
| namespace App\Filament\Resources\ServerResource\Pages; | namespace App\Filament\Resources\ServerResource\Pages; | ||||||
| 
 | 
 | ||||||
|  | use App\Models\Node; | ||||||
|  | use App\Models\Objects\Endpoint; | ||||||
|  | use Illuminate\Support\HtmlString; | ||||||
| use LogicException; | use LogicException; | ||||||
| use App\Filament\Resources\ServerResource; | use App\Filament\Resources\ServerResource; | ||||||
| use App\Http\Controllers\Admin\ServersController; | use App\Http\Controllers\Admin\ServersController; | ||||||
| @ -15,7 +18,6 @@ use App\Enums\ServerState; | |||||||
| use App\Models\Egg; | use App\Models\Egg; | ||||||
| use App\Models\Server; | use App\Models\Server; | ||||||
| use App\Models\ServerVariable; | use App\Models\ServerVariable; | ||||||
| use App\Repositories\Daemon\DaemonServerRepository; |  | ||||||
| use App\Services\Servers\ServerDeletionService; | use App\Services\Servers\ServerDeletionService; | ||||||
| use Filament\Forms\Components\Tabs; | use Filament\Forms\Components\Tabs; | ||||||
| use Filament\Forms\Form; | use Filament\Forms\Form; | ||||||
| @ -27,6 +29,11 @@ use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; | |||||||
| 
 | 
 | ||||||
| class EditServer extends EditRecord | class EditServer extends EditRecord | ||||||
| { | { | ||||||
|  |     public ?Node $node = null; | ||||||
|  |     public ?Egg $egg = null; | ||||||
|  |     public array $ports = []; | ||||||
|  |     public array $eggDefaultPorts = []; | ||||||
|  | 
 | ||||||
|     protected static string $resource = ServerResource::class; |     protected static string $resource = ServerResource::class; | ||||||
| 
 | 
 | ||||||
|     public function form(Form $form): Form |     public function form(Form $form): Form | ||||||
| @ -152,7 +159,8 @@ class EditServer extends EditRecord | |||||||
|                                     ]) |                                     ]) | ||||||
|                                     ->disabled(), |                                     ->disabled(), | ||||||
|                             ]), |                             ]), | ||||||
|                         Tabs\Tab::make('Environment') |                         Tabs\Tab::make('env-tab') | ||||||
|  |                             ->label('Environment') | ||||||
|                             ->icon('tabler-brand-docker') |                             ->icon('tabler-brand-docker') | ||||||
|                             ->schema([ |                             ->schema([ | ||||||
|                                 Forms\Components\Fieldset::make('Resource Limits') |                                 Forms\Components\Fieldset::make('Resource Limits') | ||||||
| @ -437,6 +445,9 @@ class EditServer extends EditRecord | |||||||
|                                         'md' => 3, |                                         'md' => 3, | ||||||
|                                         'lg' => 5, |                                         'lg' => 5, | ||||||
|                                     ]) |                                     ]) | ||||||
|  |                                     ->afterStateHydrated(function (Forms\Set $set, Forms\Get $get) { | ||||||
|  |                                         // $this->resetEggVariables($set, $get);
 | ||||||
|  |                                     }) | ||||||
|                                     ->relationship('egg', 'name') |                                     ->relationship('egg', 'name') | ||||||
|                                     ->searchable() |                                     ->searchable() | ||||||
|                                     ->preload() |                                     ->preload() | ||||||
| @ -458,6 +469,50 @@ class EditServer extends EditRecord | |||||||
|                                     ]) |                                     ]) | ||||||
|                                     ->required(), |                                     ->required(), | ||||||
| 
 | 
 | ||||||
|  |                                 Forms\Components\TagsInput::make('ports') | ||||||
|  |                                     ->columnSpan(3) | ||||||
|  |                                     ->placeholder('Example: 25565, 8080, 1337-1340') | ||||||
|  |                                     ->splitKeys(['Tab', ' ', ',']) | ||||||
|  |                                     ->helperText(new HtmlString(' | ||||||
|  |                                         These are the ports that users can connect to this Server through. | ||||||
|  |                                         <br /> | ||||||
|  |                                         You would typically port forward these on your home network. | ||||||
|  |                                     ')) | ||||||
|  |                                     ->label('Ports') | ||||||
|  |                                     ->formatStateUsing(fn (Server $server) => $server->ports->map(fn ($port) => (string) $port)->all()) | ||||||
|  |                                     ->afterStateUpdated(self::ports(...)) | ||||||
|  |                                     ->hintAction( | ||||||
|  |                                         Forms\Components\Actions\Action::make('asdf') | ||||||
|  |                                             ->action(function (Forms\Get $get, Forms\Set $set) { | ||||||
|  |                                                 $this->resetEggVariables($set, $get); | ||||||
|  |                                             })) | ||||||
|  |                                     ->live(), | ||||||
|  | 
 | ||||||
|  |                                 Forms\Components\Repeater::make('assignments') | ||||||
|  |                                     ->columnSpan(3) | ||||||
|  |                                     ->defaultItems(fn () => count($this->eggDefaultPorts)) | ||||||
|  |                                     ->label('Port Assignments') | ||||||
|  |                                     ->helperText(fn (Forms\Get $get) => empty($get('ports')) ? 'You must add ports to assign them!' : '') | ||||||
|  |                                     ->live() | ||||||
|  |                                     ->addable(false) | ||||||
|  |                                     ->deletable(false) | ||||||
|  |                                     ->reorderable(false) | ||||||
|  |                                     ->simple( | ||||||
|  |                                         Forms\Components\Select::make('port') | ||||||
|  |                                             ->live() | ||||||
|  |                                             ->disabled(fn (Forms\Get $get) => empty($get('../../ports')) || empty($get('../../assignments'))) | ||||||
|  |                                             ->prefix(function (Forms\Components\Component $component) { | ||||||
|  |                                                 $key = str($component->getStatePath())->beforeLast('.')->afterLast('.')->toString(); | ||||||
|  | 
 | ||||||
|  |                                                 dump($key); | ||||||
|  | 
 | ||||||
|  |                                                 return $key; | ||||||
|  |                                             }) | ||||||
|  |                                             ->disableOptionsWhenSelectedInSiblingRepeaterItems() | ||||||
|  |                                             ->options(fn (Forms\Get $get) => $this->ports) | ||||||
|  |                                             ->required(), | ||||||
|  |                                     ), | ||||||
|  | 
 | ||||||
|                                 Forms\Components\Textarea::make('startup') |                                 Forms\Components\Textarea::make('startup') | ||||||
|                                     ->label('Startup Command') |                                     ->label('Startup Command') | ||||||
|                                     ->required() |                                     ->required() | ||||||
| @ -474,12 +529,11 @@ class EditServer extends EditRecord | |||||||
|                                         'md' => 4, |                                         'md' => 4, | ||||||
|                                         'lg' => 6, |                                         'lg' => 6, | ||||||
|                                     ]) |                                     ]) | ||||||
|                                     ->rows(function ($state) { |                                     ->rows(fn ($state) => str($state)->explode("\n")->reduce( | ||||||
|                                         return str($state)->explode("\n")->reduce( |                                         fn (int $carry, $line) => $carry + floor(strlen($line) / 125), 0 | ||||||
|                                             fn (int $carry, $line) => $carry + floor(strlen($line) / 125), |                                     )), | ||||||
|                                             0 | 
 | ||||||
|                                         ); |                                 Forms\Components\Hidden::make('environment')->default([]), | ||||||
|                                     }), |  | ||||||
| 
 | 
 | ||||||
|                                 Forms\Components\Repeater::make('server_variables') |                                 Forms\Components\Repeater::make('server_variables') | ||||||
|                                     ->relationship('serverVariables') |                                     ->relationship('serverVariables') | ||||||
| @ -523,10 +577,10 @@ class EditServer extends EditRecord | |||||||
|                                             $component = $component |                                             $component = $component | ||||||
|                                                 ->live(onBlur: true) |                                                 ->live(onBlur: true) | ||||||
|                                                 ->hintIcon('tabler-code') |                                                 ->hintIcon('tabler-code') | ||||||
|                                                 ->label(fn (ServerVariable $serverVariable) => $serverVariable->variable->name) |                                                 ->label(fn (ServerVariable $serverVariable) => $serverVariable->variable?->name) | ||||||
|                                                 ->hintIconTooltip(fn (ServerVariable $serverVariable) => $serverVariable->variable->rules) |                                                 ->hintIconTooltip(fn (ServerVariable $serverVariable) => $serverVariable->variable?->rules) | ||||||
|                                                 ->prefix(fn (ServerVariable $serverVariable) => '{{' . $serverVariable->variable->env_variable . '}}') |                                                 ->prefix(fn (ServerVariable $serverVariable) => '{{' . $serverVariable->variable?->env_variable . '}}') | ||||||
|                                                 ->helperText(fn (ServerVariable $serverVariable) => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description); |                                                 ->helperText(fn (ServerVariable $serverVariable) => empty($serverVariable->variable?->description) ? '—' : $serverVariable->variable->description); | ||||||
|                                         } |                                         } | ||||||
| 
 | 
 | ||||||
|                                         return $components; |                                         return $components; | ||||||
| @ -740,4 +794,81 @@ class EditServer extends EditRecord | |||||||
|             ->mapWithKeys(fn ($value) => [$value => $value]) |             ->mapWithKeys(fn ($value) => [$value => $value]) | ||||||
|             ->all(); |             ->all(); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     public function ports($state, Forms\Set $set) | ||||||
|  |     { | ||||||
|  |         $ports = collect(); | ||||||
|  |         foreach ($state as $portEntry) { | ||||||
|  |             if (str_contains($portEntry, '-')) { | ||||||
|  |                 [$start, $end] = explode('-', $portEntry); | ||||||
|  |                 if (!is_numeric($start) || !is_numeric($end)) { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 $start = max((int) $start, Endpoint::PORT_FLOOR); | ||||||
|  |                 $end = min((int) $end, Endpoint::PORT_CEIL); | ||||||
|  |                 for ($i = $start; $i <= $end; $i++) { | ||||||
|  |                     $ports->push($i); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (!is_numeric($portEntry)) { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $ports->push((int) $portEntry); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $uniquePorts = $ports->unique()->values(); | ||||||
|  |         if ($ports->count() > $uniquePorts->count()) { | ||||||
|  |             $ports = $uniquePorts; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $ports = $ports->filter(fn ($port) => $port > 1024 && $port < 65535)->values(); | ||||||
|  | 
 | ||||||
|  |         $set('ports', $ports->all()); | ||||||
|  |         $this->ports = $ports->all(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function resetEggVariables(Forms\Set $set, Forms\Get $get) | ||||||
|  |     { | ||||||
|  |         $set('assignments', []); | ||||||
|  | 
 | ||||||
|  |         $i = 0; | ||||||
|  |         $this->eggDefaultPorts = []; | ||||||
|  |         if (str_contains($get('startup'), '{{SERVER_PORT}}')) { | ||||||
|  |             $this->eggDefaultPorts['SERVER_PORT'] = null; | ||||||
|  |             $set('assignments.SERVER_PORT', ['port' => null]); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $variables = $this->getRecord()->egg->variables ?? []; | ||||||
|  |         $serverVariables = collect(); | ||||||
|  |         $this->ports = []; | ||||||
|  |         foreach ($variables as $variable) { | ||||||
|  |             if (str_contains($variable->rules, 'port')) { | ||||||
|  |                 $this->eggDefaultPorts[$variable->env_variable] = $variable->default_value; | ||||||
|  |                 $this->ports[] = (int) $variable->default_value; | ||||||
|  | 
 | ||||||
|  |                 $set("assignments.$variable->env_variable", ['port' => $i++]); | ||||||
|  | 
 | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             $serverVariables->add($variable->toArray()); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $set('ports', $this->ports); | ||||||
|  | 
 | ||||||
|  |         $variables = []; | ||||||
|  |         $set($path = 'server_variables', $serverVariables->sortBy(['sort'])->all()); | ||||||
|  |         for ($i = 0; $i < $serverVariables->count(); $i++) { | ||||||
|  |             $set("$path.$i.variable_value", $serverVariables[$i]['default_value']); | ||||||
|  |             $set("$path.$i.variable_id", $serverVariables[$i]['id']); | ||||||
|  |             $variables[$serverVariables[$i]['env_variable']] = $serverVariables[$i]['default_value']; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $set('environment', $variables); | ||||||
|  | 
 | ||||||
|  |         // dump($variables, $this->ports, $this->eggDefaultPorts, $get('assignments'));
 | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Lance Pioch
						Lance Pioch