devletes/filament-timeline-view
Render Filament Tables as chronological timelines. Adds Table macros ->asTimeline() and ->asDoubleSidedTimeline(), plus a TimelineEntry column to turn any table query into date-grouped cards with avatars, timestamps, actions dropdown, collapsible days, and load-more.
Installation:
composer require devletes/filament-timeline-view
php artisan filament:assets
First Use Case:
Add TimelineEntry to a Filament table column in a resource's table() method:
use Devletes\FilamentTimelineView\Tables\Columns\TimelineEntry;
public function table(Table $table): Table
{
return $table
->columns([
TimelineEntry::make()
->title('title')
->content('body')
->time('published_at'),
])
->asTimeline();
}
src/Tables/Columns/TimelineEntry.php for customization options.resources/views/vendor/filament-timeline-view/ for styling hooks.Data Preparation:
Ensure your query returns data with the fields specified in TimelineEntry (e.g., title, content, time). Use closures for dynamic data:
TimelineEntry::make()
->title(fn ($record) => $record->formattedTitle())
->content('description')
Grouping:
Use Filament’s Group for date-based grouping:
->defaultGroup(Group::make('published_at')->date()->orderQueryUsing(fn ($query) => $query->orderByDesc('published_at')))
Actions:
Attach actions via recordActions:
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
Pagination: Replace pagination with "Load More":
->paginated([5]) // Loads 5 records initially, then 5 more per click
Widgets: Use TableWidget for dashboard timelines:
class TimelineWidget extends TableWidget {
public function table(Table $table): Table {
return $table
->columns([TimelineEntry::make()->title('title')->content('body')])
->asTimeline();
}
}
Custom Layouts: Replace TimelineEntry with Stack/Split for full control:
->columns([
Stack::make([
TextColumn::make('title'),
TextColumn::make('content'),
]),
])
Dark Mode: Leverage Filament’s built-in dark mode support—no extra config needed.
Date Grouping Order:
Filament’s default Group sorts ascending (oldest first). Override with:
->orderQueryUsing(fn ($query) => $query->orderByDesc('published_at'))
Pagination Conflicts:
Avoid mixing paginated([5, 10]) with asTimeline(). Only the first value (5) is used for "Load More."
Collapsible Groups:
Collapsible groups require ->collapsible() on the Group, but only works with date groups.
CSS Overrides:
Custom properties (e.g., --ftv-line-color) must target .ftv-shell or .ftv-group-body. Use:
.fi-ta-timeline .ftv-shell {
--ftv-line-color: #ff0000;
}
php artisan filament:assets if CSS isn’t loading.TimelineEntry fields match your model’s attributes or closures.recordActions contains at least one ActionGroup.Custom Templates:
Override Blade templates in resources/views/vendor/filament-timeline-view/ (e.g., timeline-entry.blade.php).
Dynamic Data: Use closures for dynamic content:
->image(fn ($record) => $record->getCoverUrl())
Theming: Extend CSS variables for global theming:
.dark .ftv-shell {
--ftv-card-surface: #333;
}
Localization:
Translate date headers (e.g., "Today") via Filament’s filament.php language files:
'collapsed_summary' => '{{ $count }} posts hidden',
How can I help you explore Laravel packages today?