return $table
->groups([
Group::make('user.name'),
Group::make('start')->label('Start date (UTC)')->date(),
])
// [...]
->columns([
Tables\Columns\TextColumn::make('start')
->date()
->label('Start date (UTC)')
->icon('heroicon-o-calendar')
->sortable(query: function (Builder $query, string $direction) {
$query->orderBy('start', $direction);
}),
Tables\Columns\TextColumn::make('start_time')
->label('Start time (UTC)')
->getStateUsing(fn (Model $record) => $record->start)
->icon('heroicon-o-arrow-left-on-rectangle')
->time()
->sortable(query: function (Builder $query, string $direction) {
$query->orderByRaw('TIME(start) '.$direction);
}),
Tables\Columns\TextColumn::make('end')
->label('End time (UTC)')
->icon('heroicon-o-arrow-right-on-rectangle')
->time()
->sortable(query: function (Builder $query, string $direction) {
$query->orderByRaw('TIME(end) '.$direction);
}),
Tables\Columns\TextColumn::make('duration')
->state(fn (Model $record) => CarbonInterval::seconds($record->duration)->cascade()->format('%H:%I:%S'))
->sortable()
->icon('heroicon-o-clock')
->summarize(
Tables\Columns\Summarizers\Summarizer::make()->using(function ($query): string {
return DateService::fromSecondsToHours($query->sum('duration'));
})
),
)];
return $table
->groups([
Group::make('user.name'),
Group::make('start')->label('Start date (UTC)')->date(),
])
// [...]
->columns([
Tables\Columns\TextColumn::make('start')
->date()
->label('Start date (UTC)')
->icon('heroicon-o-calendar')
->sortable(query: function (Builder $query, string $direction) {
$query->orderBy('start', $direction);
}),
Tables\Columns\TextColumn::make('start_time')
->label('Start time (UTC)')
->getStateUsing(fn (Model $record) => $record->start)
->icon('heroicon-o-arrow-left-on-rectangle')
->time()
->sortable(query: function (Builder $query, string $direction) {
$query->orderByRaw('TIME(start) '.$direction);
}),
Tables\Columns\TextColumn::make('end')
->label('End time (UTC)')
->icon('heroicon-o-arrow-right-on-rectangle')
->time()
->sortable(query: function (Builder $query, string $direction) {
$query->orderByRaw('TIME(end) '.$direction);
}),
Tables\Columns\TextColumn::make('duration')
->state(fn (Model $record) => CarbonInterval::seconds($record->duration)->cascade()->format('%H:%I:%S'))
->sortable()
->icon('heroicon-o-clock')
->summarize(
Tables\Columns\Summarizers\Summarizer::make()->using(function ($query): string {
return DateService::fromSecondsToHours($query->sum('duration'));
})
),
)];