From 70da7c0f51437baf975111bd64ad1bcf968b7e5e Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Mon, 29 Apr 2024 20:06:34 -0400 Subject: [PATCH] Add allocations to node pages --- app/Filament/Resources/NodeResource.php | 1 + .../AllocationsRelationManager.php | 142 ++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php diff --git a/app/Filament/Resources/NodeResource.php b/app/Filament/Resources/NodeResource.php index a16e47d36..143ef54f8 100644 --- a/app/Filament/Resources/NodeResource.php +++ b/app/Filament/Resources/NodeResource.php @@ -18,6 +18,7 @@ class NodeResource extends Resource public static function getRelations(): array { return [ + RelationManagers\AllocationsRelationManager::class, RelationManagers\NodesRelationManager::class, ]; } diff --git a/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php b/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php new file mode 100644 index 000000000..64002cce9 --- /dev/null +++ b/app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php @@ -0,0 +1,142 @@ +schema([ + Forms\Components\TextInput::make('ip') + ->required() + ->maxLength(255), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('ip') + + // Non Primary Allocations + // ->checkIfRecordIsSelectableUsing(fn (Allocation $allocation) => $allocation->id !== $allocation->server?->allocation_id) + + // All assigned allocations + ->checkIfRecordIsSelectableUsing(fn (Allocation $allocation) => $allocation->server_id === null) + + ->columns([ + Tables\Columns\TextColumn::make('server.name')->label('Server')->icon('tabler-brand-docker'), + Tables\Columns\TextColumn::make('ip_alias')->label('Alias'), + Tables\Columns\TextColumn::make('ip')->label('IP'), + Tables\Columns\TextColumn::make('port')->label('Port'), + ]) + ->filters([ + // + ]) + ->actions([ + // + ]) + ->headerActions([ + Tables\Actions\Action::make('create new allocation')->label('Create Allocations') + ->form(fn () => [ + Forms\Components\TextInput::make('allocation_ip') + ->datalist($this->getOwnerRecord()->ipAddresses() ?? []) + ->label('IP Address') + ->inlineLabel() + ->ipv4() + ->helperText("Usually your machine's public IP unless you are port forwarding.") + // ->selectablePlaceholder(false) + ->required(), + Forms\Components\TextInput::make('allocation_alias') + ->label('Alias') + ->inlineLabel() + ->default(null) + ->helperText('Optional display name to help you remember what these are.') + ->required(false), + Forms\Components\TagsInput::make('allocation_ports') + ->placeholder('Examples: 27015, 27017-27019') + ->helperText(new HtmlString(' + These are the ports that users can connect to this Server through. +
+ You would have to port forward these on your home network. + ')) + ->label('Ports') + ->inlineLabel() + ->live() + ->afterStateUpdated(function ($state, Forms\Set $set) { + $ports = collect(); + $update = false; + foreach ($state as $portEntry) { + if (!str_contains($portEntry, '-')) { + if (is_numeric($portEntry)) { + $ports->push((int) $portEntry); + + continue; + } + + // Do not add non numerical ports + $update = true; + + continue; + } + + $update = true; + [$start, $end] = explode('-', $portEntry); + if (!is_numeric($start) || !is_numeric($end)) { + continue; + } + + $start = max((int) $start, 0); + $end = min((int) $end, 2 ** 16 - 1); + for ($i = $start; $i <= $end; $i++) { + $ports->push($i); + } + } + + $uniquePorts = $ports->unique()->values(); + if ($ports->count() > $uniquePorts->count()) { + $update = true; + $ports = $uniquePorts; + } + + $sortedPorts = $ports->sort()->values(); + if ($sortedPorts->all() !== $ports->all()) { + $update = true; + $ports = $sortedPorts; + } + + if ($update) { + $set('allocation_ports', $ports->all()); + } + }) + ->splitKeys(['Tab', ' ', ',']) + ->required(), + ]) + ->action(fn (array $data) => resolve(AssignmentService::class)->handle($this->getOwnerRecord(), $data)), + ]) + ->bulkActions([ + Tables\Actions\BulkActionGroup::make([ + // Tables\Actions\DissociateBulkAction::make(), + Tables\Actions\DeleteBulkAction::make(), + ]), + ]); + } +}