diff --git a/app/Filament/Resources/ServerResource.php b/app/Filament/Resources/ServerResource.php index 4f7ab8dc6..1c58887f0 100644 --- a/app/Filament/Resources/ServerResource.php +++ b/app/Filament/Resources/ServerResource.php @@ -3,19 +3,19 @@ namespace App\Filament\Resources; use App\Filament\Resources\ServerResource\Pages; -use App\Filament\Resources\ServerResource\RelationManagers; use App\Models\Allocation; use App\Models\Egg; use App\Models\Node; use App\Models\Server; use App\Services\Allocations\AssignmentService; +use Closure; use Filament\Forms; use Filament\Forms\Form; use Filament\Resources\Resource; use Filament\Tables; use Filament\Tables\Table; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\SoftDeletingScope; +use Illuminate\Support\Facades\Validator; use Illuminate\Support\HtmlString; class ServerResource extends Resource @@ -123,7 +123,22 @@ class ServerResource extends Resource ->searchable() ->preload() ->live() - ->afterStateUpdated(fn ($state, Forms\Set $set) => $set('startup', Egg::find($state)->startup)) + ->afterStateUpdated(function ($state, Forms\Set $set) { + $egg = Egg::find($state); + $set('startup', $egg->startup); + + $variables = $egg->variables ?? []; + $serverVariables = collect(); + foreach ($variables as $variable) { + $serverVariables->add($variable->toArray()); + } + + $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']); + } + }) ->required(), Forms\Components\ToggleButtons::make('skip_scripts') @@ -270,41 +285,56 @@ class ServerResource extends Resource }) ->columnSpanFull(), - Forms\Components\Repeater::make('s') - ->reorderable(false) - ->addable(false) - ->deletable(false) - ->label('Egg Variables') - ->columnSpanFull() - ->grid(2) - ->default(function (Forms\Get $get) { - $variables = Egg::find($get('egg_id'))->variables ?? []; - $serverVariables = collect(); - foreach ($variables as $variable) { - $serverVariables->add($variable->toArray()); - } - - return $serverVariables->all(); - }) - // ->relationship('serverVariables') - // ->default([1, 2, 3]) - ->name('name') - // ->itemLabel(fn (array $state) => 'asdf') + Forms\Components\Section::make('Egg Variables') + ->icon('tabler-eggs') + ->iconColor('primary') + ->collapsible() + ->collapsed() ->schema([ - Forms\Components\TextInput::make('value') - ->label(fn (Forms\Get $get) => $get('name')) - ->helperText(fn (Forms\Get $get) => new HtmlString(" - {$get('description')}
- Access in Startup: {{{$get('env_variable')}}}
- Validation Rules: {$get('rules')} - ")) - // ->inlineLabel() - ->maxLength(191), -// Forms\Components\Textarea::make('description')->columnSpanFull(), -// Forms\Components\TextInput::make('env_variable')->maxLength(191), -// Forms\Components\TextInput::make('default_value')->maxLength(191), -// Forms\Components\Textarea::make('rules')->rows(3)->columnSpanFull()->required(), - ]) + Forms\Components\Placeholder::make('Select an egg first to show its variables!') + ->hidden(fn (Forms\Get $get) => !empty($get('server_variables'))), + + Forms\Components\Repeater::make('server_variables') + ->relationship('serverVariables') + ->grid(2) + ->reorderable(false) + ->addable(false) + ->deletable(false) + ->default([]) + ->hidden(fn ($state) => empty($state)) + ->afterStateUpdated(function () { + + }) + + ->schema([ + Forms\Components\TextInput::make('variable_value') + //->rule(0, fn (Forms\Get $get) => str($get('rules'))) // TODO + + ->rules([ + fn (Forms\Get $get): Closure => function (string $attribute, $value, Closure $fail) use ($get) { + $validator = Validator::make(['validatorkey' => $value], [ + 'validatorkey' => $get('rules'), + ]); + + if ($validator->fails()) { + $message = str($validator->errors()->first())->replace('validatorkey', $get('name')); + + $fail($message); + } + }, + ]) + + ->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), + + Forms\Components\Hidden::make('variable_id')->default(0) + ]) + ->columnSpanFull(), + ]), ]); } diff --git a/app/Models/Server.php b/app/Models/Server.php index 8c30fb423..b96198d69 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -251,6 +251,11 @@ class Server extends Model return $this->hasOne(Egg::class, 'id', 'egg_id'); } + public function eggVariables(): HasMany + { + return $this->hasMany(EggVariable::class, 'egg_id', 'egg_id'); + } + /** * Gets information for the egg variables associated with this server. */