filafly/filament-identity-column
Installation:
composer require filafly/filament-identity-column
php artisan filament:assets
Verify package auto-discovery is enabled in composer.json under "extra": { "laravel": { "providers": [...] } }.
First Use Case: Add to a Filament Table column:
use Filafly\IdentityColumn\Tables\Columns\IdentityColumn;
IdentityColumn::make('user')
->avatar('avatar_url')
->primary('name')
->secondary('email')
->size('md');
For Infolists:
use Filafly\IdentityColumn\Infolists\Components\IdentityEntry;
IdentityEntry::make('user')
->avatar('avatar_url')
->primary('name')
->secondary('email')
->size('md');
Where to Look First:
src/Tables/Columns/IdentityColumn.php and src/Infolists/Components/IdentityEntry.php for method signatures and default behaviors.Dynamic Avatar Sources: Use closures for dynamic avatar paths (e.g., Gravatar, storage paths):
->avatar(fn ($record) => $record->profile_photo_url ?? 'default-avatar.png')
Conditional URLs: Dynamically set primary/secondary URLs based on record state:
->primaryUrl(fn ($record) => $record->is_active ? route('users.show', $record) : null)
Reusable Components: Create a trait or base class for consistent identity columns across tables:
trait UsesIdentityColumn {
protected function identityColumn(string $field): IdentityColumn {
return IdentityColumn::make($field)
->avatar('avatar_url')
->size('sm')
->primaryUrl(fn ($record) => route('users.edit', $record));
}
}
Infolist Integration:
Use IdentityEntry in Infolists for consistent UI across pages:
Infolist::make()
->schema([
IdentityEntry::make('user')
->avatar('avatar_url')
->primary('full_name')
->secondary('role'),
]);
Custom Avatar Shapes: Override avatar shape dynamically:
->avatarShape(fn ($record) => $record->is_admin ? 'circular' : 'rounded')
Filament Tables: Combine with other Filament features like sorting, searching, and actions:
IdentityColumn::make('user')
->sortable()
->searchable()
->primaryUrl(fn ($record) => route('users.show', $record))
->action(EditAction::make());
Livewire Integration: Ensure the column works seamlessly with Livewire by leveraging Filament’s built-in Livewire support. No additional setup is required.
Testing: Test avatar rendering with mocked records:
$record = new User(['avatar_url' => 'test.jpg', 'name' => 'Test User']);
$column = IdentityColumn::make('user')->avatar('avatar_url')->primary('name');
$this->assertStringContainsString('Test User', $column->getState());
Avatar Path Resolution:
storage/avatars/user.jpg) may not resolve correctly in production./storage/avatars/user.jpg).Closure Evaluation:
avatar(), primary(), or primaryUrl() are evaluated per record, not once. This can cause performance overhead if closures are complex.->avatar(fn ($record) => Cache::remember("avatar_{$record->id}", now()->addHours(1), fn () => $record->generateAvatarUrl()))
URL Generation:
primaryUrl() or secondaryUrl() may fail if the route/model binding is incorrect.dd() or Log::debug() to inspect the generated URL:
->primaryUrl(fn ($record) => {
Log::debug('Generating URL for:', $record);
return route('users.show', $record);
})
Size Classes:
size() values (e.g., 'custom') may not render as expected if CSS is not overridden./* resources/css/filament/identity-column.css */
.custom-identity-column { /* Your custom styles */ }
Infolist vs. Table Behavior:
IdentityEntry in Infolists may behave slightly differently than IdentityColumn in Tables (e.g., hover effects, click handling).Inspect Rendered HTML: Use browser dev tools to verify the column’s structure and identify missing classes/attributes.
Log Column State:
Override getState() in custom columns to log values:
public function getState(): array {
$state = parent::getState();
Log::debug('IdentityColumn state:', $state);
return $state;
}
Disable Caching: Temporarily disable Filament’s asset caching to rule out stale CSS/JS:
php artisan filament:assets --purge
Custom Avatar Component: Override the default avatar rendering by publishing and modifying the view:
php artisan vendor:publish --tag="filafly-identity-column:views"
Edit resources/views/vendor/filafly/identity-column/avatar.blade.php.
Add Tooltips: Extend the column to include tooltips for secondary text:
IdentityColumn::make('user')
->avatar('avatar_url')
->primary('name')
->secondary('email')
->secondaryTooltip(fn ($record) => "Email: {$record->email}")
->size('md');
(Requires custom CSS/JS for tooltip implementation.)
Accessibility: Enhance accessibility by adding ARIA labels or keyboard navigation:
->avatarAttributes(['aria-label' => 'User avatar'])
->primaryAttributes(['aria-label' => 'User name'])
Dark Mode Support:
Ensure avatar/column styles work in dark mode by using Tailwind’s dark: variants or custom CSS:
.dark .identity-column-avatar {
filter: brightness(0) invert(1);
}
How can I help you explore Laravel packages today?