schema([ Forms\Components\Select::make('node_id') ->label('Node') ->required() ->relationship('node', 'name') ->searchable() ->reactive() ->disabledOn('edit') ->helperText(fn ($record) => $record?->node ? 'Common Name: ' . $record->node->notes : null) ->afterStateUpdated(function (callable $set, $state) { $set('os_id', null); }), Forms\Components\Select::make('os_id') ->label('OS') ->required() ->relationship('os', 'name') ->searchable() ->helperText('Select the OS for the server (if editing, requires reinstallation)') ->reactive(), Forms\Components\Select::make('service_id') ->label('Service') ->required() ->relationship('service', 'id') ->getOptionLabelFromRecordUsing(fn ($record) => "{$record->product->name} - " . ucfirst($record->status)) ->searchable() ->disabledOn('edit'), Forms\Components\TextInput::make('vm_id') ->label('VM ID') ->required() ->unique(ignoreRecord: true) ->maxLength(255) ->reactive(), Forms\Components\Select::make('status') ->label('Status') ->options([ 'active' => 'Active', 'installing' => 'Installing', 'suspended' => 'Suspended', ]) ->default('active') ->required() ->reactive(), Forms\Components\TextInput::make('hostname') ->label('Hostname') ->required() ->maxLength(255) ->reactive(), Forms\Components\Select::make('primary_ipv4') ->label('Primary IPv4') ->relationship('primaryIpv4', 'ip', fn ($query, $record) => $query->where('server_id', $record?->id)->where('type', 'ipv4')) ->searchable() ->reactive() ->helperText('Select the primary IP for the server (if editing, requires reinstallation)'), Forms\Components\Select::make('primary_ipv6') ->label('Primary IPv6') ->relationship('primaryIpv6', 'ip', fn ($query, $record) => $query->where('server_id', $record?->id)->where('type', 'ipv6')) ->searchable() ->preload() ->helperText('Select the primary IP for the server (if editing, requires reinstallation)'), ]); } public static function table(Table $table): Table { return $table ->columns([ Tables\Columns\TextColumn::make('id') ->label('ID') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('node.name') ->label('Node') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('os.name') ->label('OS') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('service.id') ->label('Service') ->sortable() ->searchable(), Tables\Columns\TextColumn::make('vm_id') ->label('VM ID') ->sortable() ->searchable(), ]) ->filters([ // ]) ->actions([ Tables\Actions\EditAction::make(), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), ]), ]); } public static function getRelations(): array { return [ RelationManagers\Ipv4RelationManager::class, ]; } public static function getPages(): array { return [ 'index' => Pages\ListServers::route('/'), 'create' => Pages\CreateServer::route('/create'), 'edit' => Pages\EditServer::route('/{record}/edit'), ]; } }