Certainly! Let’s solve your question about adding an icon column that checks if a record's step_date is older than 6 weeks, showing a warning or check icon accordingly.
Why isn't icon() working?
From your description, it seems you’re returning raw PHP arrays as your table data (return $widget_data;). Filament expects an Eloquent Collection or objects, not arrays, so $record is just a plain array in your case—not an Eloquent model. That’s why the icon() closures might feel "skipped" or the data isn't acting as you expect.
Solution
1. Convert your $widget_data items to objects
At the end of your records() callback, wrap $widget_data as a collect() of objects. For each entry, convert to a simple object:
->records(function (): \Illuminate\Support\Collection {
$widget_data = [];
// ... your logic populating $widget_data as arrays ...
// sort as before
$dates = array_column($widget_data, 'step_date');
array_multisort($dates, SORT_ASC, $widget_data);
// map arrays to objects
return collect($widget_data)
->map(function ($item) {
return (object) $item;
});
})
Now, in your column callbacks, $record will be an object as expected.
2. Add the IconColumn
In your columns() array, add:
IconColumn::make('status_icon')
->label('Status')
->icon(function ($record) {
// Ensure $record is an object; if not, convert as above
$stepDate = \Carbon\Carbon::parse($record->step_date);
if ($stepDate->lt(now()->subWeeks(6))) {
return \Filament\Support\Icons\Heroicon::ExclamationCircle;
}
return \Filament\Support\Icons\Heroicon::Check;
})
->color(function ($record) {
$stepDate = \Carbon\Carbon::parse($record->step_date);
if ($stepDate->lt(now()->subWeeks(6))) {
return 'danger';
}
return 'success';
})
Note: The
icon()function must return a string of one of the Supported Heroicon constants.
3. Full Columns Example
->columns([
IconColumn::make('status_icon')
->label('Status')
->icon(function ($record) {
$stepDate = \Carbon\Carbon::parse($record->step_date);
if ($stepDate->lt(now()->subWeeks(6))) {
return \Filament\Support\Icons\Heroicon::ExclamationCircle;
}
return \Filament\Support\Icons\Heroicon::Check;
}),
TextColumn::make('catalog_number')
->label('Catalog Number'),
TextColumn::make('last_step')
->label('Step'),
TextColumn::make('step_date')
->label('Date'),
])
4. Don't forget to import Carbon:
use Carbon\Carbon;
Final code for records()
->records(function (): \Illuminate\Support\Collection {
$widget_data = [];
// ... your current logic ...
$dates = array_column($widget_data, 'step_date');
array_multisort($dates, SORT_ASC, $widget_data);
// Convert arrays to objects
return collect($widget_data)->map(fn($item) => (object) $item);
})
Now your icon column should work!
If you want to use Ray for debugging, try ray($record) inside your closure and you should now see the record output.
Let me know if you need any further help!