File: /var/www/html/dashboard.orbiwheels.com/app/DataTables/Admin/BookingDataTable.php
<?php
namespace App\DataTables\Admin;
use App\Models\Booking;
use App\Models\Trip;
use Illuminate\Database\Eloquent\Builder as QueryBuilder;
use Yajra\DataTables\EloquentDataTable;
use Yajra\DataTables\Html\Builder as HtmlBuilder;
use Yajra\DataTables\Html\Button;
use Yajra\DataTables\Html\Column;
use Yajra\DataTables\Html\Editor\Editor;
use Yajra\DataTables\Html\Editor\Fields;
use Yajra\DataTables\Services\DataTable;
class BookingDataTable extends DataTable
{
/**
* Build the DataTable class.
*
* @param QueryBuilder<Booking> $query Results from query() method.
*/
public function dataTable(QueryBuilder $query): EloquentDataTable
{
return (new EloquentDataTable($query))
->addIndexColumn()
->addColumn('booking_code', function ($row) {
$url = route('admin.booking.view', encrypt($row->id));
return '<a href="' . $url . '">' . e($row->booking_code) . '</a>';
})
->addColumn('transporters', function ($row) {
$names = $row->trips
->filter(fn($t) => $t->transporter_id)
->pluck('transporter.company_name')
->unique()
->implode(', ');
return $names ?: '-';
})
->addColumn('ride_type', function ($row) {
return $row->ride_type_name; // single ride type
})
->addColumn('booking_type', function ($row) {
return $row->booking_type ? 'One Way' : 'Two Way';
})
->addColumn('total_trips', function ($row) {
return $row->trips_count;
})
->addColumn('status', function ($row) {
return match ($row->booking_status) {
'pending' => '<span class="badge badge-warning text-white">Pending</span>',
'assigned' => '<span class="badge badge-dark text-white">Assigned</span>',
'ongoing' => '<span class="badge badge-info text-white">Ongoing</span>',
'completed' => '<span class="badge badge-success text-white">Completed</span>',
'cancelled' => '<span class="badge badge-danger text-white">Cancelled</span>',
'in_progress' => '<span class="badge badge-primary text-white">In Progress</span>',
default => '<span class="badge badge-secondary text-white">Unknown</span>',
};
})
->addColumn('action', function ($row) {
$assignBtn = '';
if ($row->trips->count() > 0 && $row->trips->whereNull('transporter_id')->count() === $row->trips->count()) {
$assignBtn = '
<a href="javascript:void(0)"
class="btn btn-success btn-sm assign-transporter"
data-booking-id="' . $row->id . '"
title="Assign Transporter">
<i class="fa fa-truck"></i>
</a>';
}
return '
<div class="table-actions d-flex">
<a href="' . route('admin.booking.view', encrypt($row->id)) . '"
class="btn btn-primary btn-sm" title="View">
<i class="fa fa-eye"></i>
</a>
<a href="' . route('admin.booking.edit', $row->id) . '"
class="btn btn-primary btn-sm" title="Edit">
<i class="fa fa-edit"></i>
</a>
' . $assignBtn . '
</div>';
})
->rawColumns(['booking_code', 'transporters', 'status', 'action'])
->orderColumns(['booking_code', 'ride_type', 'booking_type', 'total_trips', 'status'], false);
}
/**
* Get query source of dataTable.
*
* @return QueryBuilder<Trip>
*/
public function query(\App\Models\Booking $model): QueryBuilder
{
return $model->newQuery()
->with(['trips.transporter'])
->withCount('trips')
->select('bookings.*');
if (request()->filled('status')) {
$query->where('status', request('status'));
}
if (request()->filled('booking_type')) {
$query->where('booking_type', request('booking_type'));
}
if (request()->filled('ride_type')) {
$query->whereHas('trips', function ($q) {
$q->where('ride_type', request('ride_type'));
});
}
if (request()->filled('from_date') && request()->filled('to_date')) {
$query->where(function ($q) {
$q->whereBetween('dates->from_date', [request('from_date'), request('to_date')])
->orWhereBetween('dates->to_date', [request('from_date'), request('to_date')]);
});
}
return $query;
}
/**
* Optional method if you want to use the html builder.
*/
public function html(): HtmlBuilder
{
return $this->builder()
->setTableId('booking-table')
->setTableAttribute('data-namespace', 'booking-table')
->setTableAttribute('class', 'table table-striped table-bordered dt-responsive nowrap jambo_table bulk_action')
->columns($this->getColumns())
// ->minifiedAjax(route('admin.booking.index', [], true))
->ajax([
'url' => route('admin.booking.index'),
'data' => 'function(d) {
d.status = $("#status").val();
d.booking_type = $("#booking_type").val();
d.ride_type = $("#ride_type_filter").val();
d.from_date = $("#from_date").val();
d.to_date = $("#to_date").val();
}',
])
->orderBy(1)
->selectStyleSingle()
->responsive(true)
->autoWidth(false)
->buttons([
// Button::make('excel'),
// Button::make('csv'),
// Button::make('pdf'),
// Button::make('print'),
// Button::make('reset'),
// Button::make('reload')
]);
}
/**
* Get the dataTable columns definition.
*/
public function getColumns(): array
{
return [
Column::computed('control')
->title('')
->exportable(false)
->printable(false)
->width(30)
->addClass('control')
->orderable(false)
->searchable(false)
->data('control')
->defaultContent(''),
Column::make('transporters')->title('Transporter')->orderable(false)->addClass('none'),
Column::make('booking_code')->title('Booking Code')->addClass('all'),
Column::make('ride_type')->title('Ride Type')->addClass('all'),
Column::make('booking_type')->title('Booking Type'),
// Column::make('total_trips')->title('Total Trips')->addClass('none'),
// Column::make('no_of_passengers')->title('Passenger')->addClass('none'),
Column::make('status')->title('Status')->addClass('all'),
Column::computed('action')
->exportable(false)
->printable(false)
->width(120)
->addClass('text-center all'),
];
}
/**
* Get the filename for export.
*/
protected function filename(): string
{
return 'Booking_' . date('YmdHis');
}
}