diff --git a/app/Filament/Resources/ServerResource.php b/app/Filament/Resources/ServerResource.php index 440dbf57c..8dac7edd9 100644 --- a/app/Filament/Resources/ServerResource.php +++ b/app/Filament/Resources/ServerResource.php @@ -70,9 +70,11 @@ class ServerResource extends Resource ->relationship('node', 'name') ->searchable() ->preload() + ->afterStateUpdated(fn (Forms\Set $set) => $set('allocation_id', null)) ->required(), Forms\Components\Select::make('allocation_id') + ->preload() ->prefixIcon('tabler-network') ->label('Primary Allocation') ->columnSpan(3) @@ -93,7 +95,9 @@ class ServerResource extends Resource ->relationship( 'allocation', 'ip', - fn (Builder $query, Forms\Get $get) => $query->where('node_id', $get('node_id')), + fn (Builder $query, Forms\Get $get) => $query + ->where('node_id', $get('node_id')) + ->whereNull('server_id'), ) ->createOptionForm(fn (Forms\Get $get) => [ Forms\Components\TextInput::make('allocation_ip') @@ -153,23 +157,25 @@ class ServerResource extends Resource ->searchable() ->preload() ->live() - ->afterStateUpdated(function ($state, Forms\Set $set) { + ->afterStateUpdated(function ($state, Forms\Set $set, Forms\Get $get) { $egg = Egg::find($state); $set('startup', $egg->startup); - $set('image', array_flip($egg->docker_images ?? [])); - $variables = $egg->variables ?? []; $serverVariables = collect(); foreach ($variables as $variable) { $serverVariables->add($variable->toArray()); } + $variables = []; $set($path = 'server_variables', $serverVariables->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); }) ->required(), @@ -196,7 +202,14 @@ class ServerResource extends Resource ->disabled(fn (Forms\Get $get) => $get('custom_image')) ->label('Docker Image') ->prefixIcon('tabler-brand-docker') - ->options(fn (Forms\Get $get) => array_flip(Egg::find($get('egg_id'))->docker_images ?? [])) + ->options(function (Forms\Get $get, Forms\Set $set) { + $images = Egg::find($get('egg_id'))->docker_images ?? []; + + $set('image', collect($images)->first()); + + return $images; + }) + ->disabled(fn (Forms\Components\Select $component) => empty($component->getOptions())) ->selectablePlaceholder(false) ->columnSpan(2) ->required(), @@ -332,6 +345,9 @@ class ServerResource extends Resource }) ->columnSpanFull(), + Forms\Components\KeyValue::make('environment') + ->default([]), + Forms\Components\Section::make('Egg Variables') ->icon('tabler-eggs') ->iconColor('primary') @@ -349,10 +365,6 @@ class ServerResource extends Resource ->deletable(false) ->default([]) ->hidden(fn ($state) => empty($state)) - ->afterStateUpdated(function () { - - }) - ->schema([ Forms\Components\TextInput::make('variable_value') ->rules([ @@ -368,11 +380,9 @@ class ServerResource extends Resource } }, ]) - ->label(fn (Forms\Get $get) => $get('name')) ->hint(fn (Forms\Get $get) => $get('rules')) ->prefix(fn (Forms\Get $get) => '{{' . $get('env_variable') . '}}') - ->helperText(fn (Forms\Get $get) => empty($get('description')) ? '—' : $get('description')) ->maxLength(191), diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php index f5cfd3bbc..57778ac6b 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -3,11 +3,28 @@ namespace App\Filament\Resources\ServerResource\Pages; use App\Filament\Resources\ServerResource; +use App\Services\Servers\ServerCreationService; use Filament\Actions; use Filament\Resources\Pages\CreateRecord; +use Illuminate\Database\Eloquent\Model; class CreateServer extends CreateRecord { protected static string $resource = ServerResource::class; protected static bool $canCreateAnother = false; + + protected function handleRecordCreation(array $data): Model + { + /** @var ServerCreationService $service */ + $service = resolve(ServerCreationService::class); + + $server = $service->handle($data); + + return $server; + } + +// protected function getRedirectUrl(): string +// { +// return $this->getResource()::getUrl('edit'); +// } } diff --git a/app/Services/Allocations/AssignmentService.php b/app/Services/Allocations/AssignmentService.php index 22db2e33f..81c29c0e6 100644 --- a/app/Services/Allocations/AssignmentService.php +++ b/app/Services/Allocations/AssignmentService.php @@ -101,7 +101,7 @@ class AssignmentService ]; } - $ids = Allocation::query()->insertOrIgnore($insertData); + $ids[] = Allocation::query()->insertOrIgnore($insertData); } }