$query Results from query() method. */ public function dataTable(QueryBuilder $query): EloquentDataTable { return (new EloquentDataTable($query)) ->editColumn('net_amount', fn(Invoice $invoice) => $invoice->net_amount->format()) ->editColumn('type', fn(Invoice $invoice) => view('components.badge', [ 'label' => $invoice->type->label(), 'variant' => $invoice->type->variant(), ])) ->editColumn('status', fn(Invoice $invoice) => view('components.badge', [ 'label' => $invoice->status->label(), 'variant' => $invoice->status->variant(), ])) ->addColumn( 'action', fn (Invoice $invoice) => view('components.datatables.action-button', [ 'view' => [ 'url' => route('invoices.view', ['id' => $invoice]), 'permission' => true, ], 'edit' => [ 'url' => route('invoices.update', ['invoice' => $invoice]), 'permission' => $invoice->status->isDraft(), ], 'table_name' => 'invoice-table', 'id' => $invoice->ulid, ]) ) ->addIndexColumn(); } /** * Get the query source of dataTable. * * @return QueryBuilder */ public function query(Invoice $model): QueryBuilder { return $model->newQuery(); } /** * Optional method if you want to use the html builder. */ public function html(): HtmlBuilder { return $this->builder() ->setTableId('invoice-table') ->columns($this->getColumns()) ->minifiedAjax() ->orderBy(1) ->layout([ 'topStart' => [ 'className' => 'col-md-auto me-auto d-flex flex-sm-row flex-column justify-content-center justify-content-md-start align-items-center align-items-md-start gap-1', 'features' => ['buttons', 'pageLength'], ], 'topEnd' => [ 'className' => 'col-md-auto ms-auto d-flex flex-sm-row flex-column justify-content-center justify-content-md-end align-items-center align-items-md-start gap-1', 'features' => ['search'], ], 'bottomStart' => 'info', 'bottomEnd' => 'paging', ]) ->parameters([ 'language' => [ 'search' => '', 'searchPlaceholder' => __('ui/button.lookup'), ], ]) ->buttons([ Button::make('add') ->text(svg('tabler-plus', ['width' => 16, 'height' => 16])->toHtml()) ->addClass('btn-sm'), Button::make('reload') ->text(svg('tabler-reload', ['width' => 16, 'height' => 16])->toHtml()) ->addClass('btn-sm'), ]); } /** * Get the dataTable columns definition. */ public function getColumns(): array { return [ Column::computed('DT_RowIndex') ->title('#') ->searchable(false) ->orderable(false), Column::make('code') ->title(__('domains/billing/field.invoice.code')), Column::make('name') ->title(__('domains/billing/field.invoice.name')), Column::make('type') ->title(__('domains/billing/field.invoice.type')), Column::make('net_amount') ->title(__('domains/billing/field.invoice.net_amount')), Column::make('status') ->title(__('domains/billing/field.invoice.status')), Column::computed('action') ->title(__('ui/label.actions')) ->exportable(false) ->printable(false) ->width(60) ->addClass('text-center'), ]; } /** * Get the filename for export. */ protected function filename(): string { return 'InvoiceDataTable_' . date('YmdHis'); } }