LinkResource.php
TLDR
This file defines the LinkResource
class, which is a resource for managing blog links. It includes methods for managing the form, infolist, and table representation of the links.
Methods
form
Defines the structure and behavior of the form for creating or updating links. It includes text inputs for the title and URL, a color picker for the link color, a textarea for the link description, and a file upload for the link image.
infolist
Defines the structure and behavior of the infolist representation of the links. It includes entries for the title, color, description, URL, and image of the links.
table
Defines the structure and behavior of the table representation of the links. It includes columns for the link image, title, URL, color, and description. It also includes filters, content grid settings, pagination options, and actions for visiting a link and editing the link.
getRelations
Returns an empty array. (No further documentation needed)
getPages
Returns an array of page routes for various link resource pages, including listing links, creating a link, viewing a link, and editing a link.
<?php
namespace App\Filament\Resources\Blog;
use App\Filament\Resources\Blog\LinkResource\Pages;
use App\Models\Blog\Link;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Infolists\Components\ColorEntry;
use Filament\Infolists\Components\ImageEntry;
use Filament\Infolists\Components\TextEntry;
use Filament\Infolists\Infolist;
use Filament\Notifications\Notification;
use Filament\Resources\Concerns\Translatable;
use Filament\Resources\Resource;
use Filament\Support\Enums\FontWeight;
use Filament\Tables;
use Filament\Tables\Table;
class LinkResource extends Resource
{
use Translatable;
protected static ?string $model = Link::class;
protected static ?string $navigationIcon = 'heroicon-o-link';
protected static ?string $navigationGroup = 'Blog';
protected static ?int $navigationSort = 3;
public static function form(Form $form): Form
{
return $form
->schema([
Forms\Components\TextInput::make('title')
->maxLength(255)
->required(),
Forms\Components\ColorPicker::make('color')
->required()
->hex()
->hexColor(),
Forms\Components\Textarea::make('description')
->maxLength(1024)
->required()
->columnSpanFull(),
Forms\Components\TextInput::make('url')
->label('URL')
->required()
->maxLength(255)
->columnSpanFull(),
Forms\Components\FileUpload::make('image')
->image(),
]);
}
public static function infolist(Infolist $infolist): Infolist
{
return $infolist
->schema([
TextEntry::make('title'),
ColorEntry::make('color'),
TextEntry::make('description')
->columnSpanFull(),
TextEntry::make('url')
->label('URL')
->columnSpanFull()
->url(fn (Link $record): string => '#' . urlencode($record->url)),
ImageEntry::make('image'),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\Layout\Stack::make([
Tables\Columns\ImageColumn::make('image')
->height('100%')
->width('100%'),
Tables\Columns\Layout\Stack::make([
Tables\Columns\TextColumn::make('title')
->weight(FontWeight::Bold),
Tables\Columns\TextColumn::make('url')
->formatStateUsing(fn (string $state): string => str($state)->after('://')->ltrim('www.')->trim('/'))
->color('gray')
->limit(30),
]),
])->space(3),
Tables\Columns\Layout\Panel::make([
Tables\Columns\Layout\Split::make([
Tables\Columns\ColorColumn::make('color')
->grow(false),
Tables\Columns\TextColumn::make('description')
->color('gray'),
]),
])->collapsible(),
])
->filters([
//
])
->contentGrid([
'md' => 2,
'xl' => 3,
])
->paginated([
18,
36,
72,
'all',
])
->actions([
Tables\Actions\Action::make('visit')
->label('Visit link')
->icon('heroicon-m-arrow-top-right-on-square')
->color('gray')
->url(fn (Link $record): string => '#' . urlencode($record->url)),
Tables\Actions\EditAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make()
->action(function () {
Notification::make()
->title('Now, now, don\'t be cheeky, leave some records for others to play with!')
->warning()
->send();
}),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => Pages\ListLinks::route('/'),
'create' => Pages\CreateLink::route('/create'),
'view' => Pages\ViewLink::route('/{record}'),
'edit' => Pages\EditLink::route('/{record}/edit'),
];
}
}