In Filament, sometimes you need to show/hide elements based on a condition, like user's role. In this tutorial, we will see how to hide/disable Filament Relation Manager if the record doesn't belong to the logged-in user.

This apartment does not belong to us, so how can we hide the Filament Relation Manager?
Project
In our project, we have two connected Resources:
- Apartments - Where people put their apartment information (in our case, this is listing information)
 - Apartment Documents - A relation manager where we should be able to upload private documents without showing the relation manager to unauthorized users.
 
This is how it looks right now:
app/Filament/Resources/ApartmentResource.php
// ... public static function form(Form $form): Form{    return $form        ->schema([            Forms\Components\Select::make('user_id')                ->relationship('user', 'name')                ->required(),            Forms\Components\TextInput::make('name')                ->required(),            Forms\Components\Textarea::make('description')                ->required()                ->columnSpanFull(),            Forms\Components\TextInput::make('price')                ->required()                ->numeric()                ->prefix('$'),            Forms\Components\TextInput::make('bedrooms')                ->required()                ->numeric(),        ]);} public static function table(Table $table): Table{    return $table        ->columns([            Tables\Columns\TextColumn::make('user.name')                ->numeric()                ->sortable(),            Tables\Columns\TextColumn::make('name')                ->searchable(),            Tables\Columns\TextColumn::make('price')                ->money()                ->sortable(),            Tables\Columns\TextColumn::make('bedrooms')                ->numeric()                ->sortable(),            Tables\Columns\TextColumn::make('created_at')                ->dateTime()                ->sortable()                ->toggleable(isToggledHiddenByDefault: true),            Tables\Columns\TextColumn::make('updated_at')                ->dateTime()                ->sortable()                ->toggleable(isToggledHiddenByDefault: true),        ])        ->filters([            //        ])        ->actions([            Tables\Actions\EditAction::make(),        ])        ->bulkActions([            Tables\Actions\BulkActionGroup::make([                Tables\Actions\DeleteBulkAction::make(),            ]),        ]);} public static function getRelations(): array{    return [        RelationManagers\ApartmentDocumentsRelationManager::class    ];} // ...
And our ApartmentDocumentsRelationManager looks like this:
app/Filament/Resources/ApartmentResource/RelationManagers/ApartmentDocumentsRelationManager.php
// ... protected static string $relationship = 'apartmentDocuments'; public function form(Form $form): Form{    return $form        ->schema([            Forms\Components\FileUpload::make('file')                ->required(),            Forms\Components\TextInput::make('description')                ->required()                ->maxLength(255),        ]);} public function table(Table $table): Table{    return $table        ->recordTitleAttribute('description')        ->columns([            Tables\Columns\TextColumn::make('file'),            Tables\Columns\TextColumn::make('description'),        ])        ->filters([            //        ])        ->headerActions([            Tables\Actions\CreateAction::make(),        ])        ->actions([            Tables\Actions\EditAction::make(),            Tables\Actions\DeleteAction::make(),        ])        ->bulkActions([            Tables\Actions\BulkActionGroup::make([                Tables\Actions\DeleteBulkAction::make(),            ]),        ]);} // ...
While this is a simple example, we still want to hide the Relation Manager! So let's do that next.
Hiding the Relation Manager
To hide the Relation manager - we can use the function canViewForRecord():
app/Filament/Resources/ApartmentResource/RelationManagers/ApartmentDocumentsRelationManager.php
use Illuminate\Database\Eloquent\Model; // ... public static function canViewForRecord(Model $ownerRecord, string $pageClass): bool{    return $ownerRecord->user_id === auth()->id();}
If we reload the page, we will see that the Relation Manager is hidden!

If we open the apartment assigned to our user, we will see the Relation Manager:

That's it! You have successfully hidden the Relation Manager based on a condition. While this was a simple example, here are the key points:
- The 
canViewForRecord()method controls whether the User can see the Relation Manager. - 
$ownerRecordwill give us the owner Record (in our case, this was the Apartment). - You can add any condition to the 
canViewForRecord()method if it returns a boolean. 
                                                    
                                                    
                                                    
No comments or questions yet...