laravel-backpack

How can I use Datatables outside of CrudControllers?


I am using Laravel 11 and Backpack v6 with Tabler.

I am creating a custom page that won't use Backpack's CRUD operations and instead has some logic for querying a database table and displaying it using Datatables for easy sorting etc.

I would like the look of the Datatable to look similar to the list methods on Backpack's crud controllers but I am unsure of the best way to do this.

I have tried this in my custom blade view:

@extends(backpack_view('blank'))

@section('content')
<table id="custom-datatable" class="table">
    <thead>
        <tr>
            <th>Appointment ID</th>
            <th>Pet Name</th>
            <th>Owner Name</th>
            <th>Breed</th>
            <th>Appointment Date</th>
            <th>Veterinarian</th>
            <th>Status</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>AP001</td>
            <td>Max</td>
            <td>John Smith</td>
            <td>Golden Retriever</td>
            <td>2024-11-22</td>
            <td>Dr. Emily Green</td>
            <td>Confirmed</td>
        </tr>
        <tr>
            <td>AP002</td>
            <td>Bella</td>
            <td>Sarah Johnson</td>
            <td>Siberian Husky</td>
            <td>2024-11-23</td>
            <td>Dr. Peter Brown</td>
            <td>Pending</td>
        </tr>
    </tbody>
</table>
@endsection

@section('after_styles')
  {{-- DATA TABLES --}}
  @basset('https://cdn.datatables.net/1.13.1/css/dataTables.bootstrap5.min.css')
  @basset('https://cdn.datatables.net/fixedheader/3.3.1/css/fixedHeader.dataTables.min.css')
  @basset('https://cdn.datatables.net/responsive/2.4.0/css/responsive.dataTables.min.css')

  {{-- CRUD LIST CONTENT - crud_list_styles stack --}}
  @stack('crud_list_styles')
@endsection

@section('after_scripts')
{{-- DATA TABLES SCRIPT --}}
  @basset('https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js')
  @basset('https://cdn.datatables.net/1.13.1/js/dataTables.bootstrap5.min.js')
  @basset('https://cdn.datatables.net/responsive/2.4.0/js/dataTables.responsive.min.js')
  @basset('https://cdn.datatables.net/responsive/2.4.0/css/responsive.dataTables.min.css')
  @basset('https://cdn.datatables.net/fixedheader/3.3.1/js/dataTables.fixedHeader.min.js')
  @basset('https://cdn.datatables.net/fixedheader/3.3.1/css/fixedHeader.dataTables.min.css')
@endsection

@push('after_scripts')
<script>
$(document).ready(function () {
    $('#custom-datatable').DataTable();
});
</script>
@endpush

This is obviously a very simple example, but the logic of what I am trying to achieve is here. This works but doesn't look like/styled like the other lovely backpack datatables that my crudcontroller's list methods use. Ideally, I'm looking for consistency.

Am I doing this correctly by including the Datatables assets like this? Is there a better way of achieving what I am trying to do?


Solution

  • You need to configure the UI elements on data tables object $('#custom-datatable').DataTable($config).

    If we don't configure it, it will add its default element that does not match the theme. For example, I replaced the default search box input with a custom input element in the following code.

    
    @extends(backpack_view('blank'))
    @section('header')
        <section class="header-operation container-fluid animated fadeIn d-flex mb-2 align-items-baseline d-print-none"
            bp-section="page-header">
            <h1 class="text-capitalize mb-0" bp-section="page-heading">custom_page1</h1>
            <p class="ms-2 ml-2 mb-0" id="datatable_info_stack" bp-section="page-subheading">custom_page1</p>
        </section>
    @endsection
    
    @section('content')
        {{-- Default box --}}
        <div class="row" bp-section="crud-operation-list">
    
            {{-- THE ACTUAL CONTENT --}}
            <div class="col-md-12">
    
                <div class="row mb-2 align-items-center">
                    <div class="col-sm-9">
    
                    </div>
    
                    <div class="col-sm-3">
                        <div id="datatable_search_stack" class="mt-sm-0 mt-2 d-print-none">
                            <div class="input-icon">
                                <span class="input-icon-addon">
                                    <svg xmlns="http://www.w3.org/2000/svg" class="icon" width="24" height="24"
                                        viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none"
                                        stroke-linecap="round" stroke-linejoin="round">
                                        <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
                                        <path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0"></path>
                                        <path d="M21 21l-6 -6"></path>
                                    </svg>
                                </span>
                                <input type="search" class="form-control"
                                    placeholder="{{ trans('backpack::crud.search') }}..." />
                            </div>
                        </div>
                    </div>
    
                </div>
    
                <div class="{{ backpack_theme_config('classes.tableWrapper') }}">
                    <table id="custom-datatable"
                        class="{{ backpack_theme_config('classes.table') ?? 'table table-striped table-hover nowrap rounded card-table table-vcenter card d-table shadow-xs border-xs' }}"
                        cellspacing="0">
                        <thead>
                            <tr>
                                <th>Appointment ID</th>
                                <th>Pet Name</th>
                                <th>Owner Name</th>
                                <th>Breed</th>
                                <th>Appointment Date</th>
                                <th>Veterinarian</th>
                                <th>Status</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td>AP001</td>
                                <td>Max</td>
                                <td>John Smith</td>
                                <td>Golden Retriever</td>
                                <td>2024-11-22</td>
                                <td>Dr. Emily Green</td>
                                <td>Confirmed</td>
                            </tr>
                            <tr>
                                <td>AP002</td>
                                <td>Bella</td>
                                <td>Sarah Johnson</td>
                                <td>Siberian Husky</td>
                                <td>2024-11-23</td>
                                <td>Dr. Peter Brown</td>
                                <td>Pending</td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
    
        </div>
    @endsection
    
    @section('after_styles')
        {{-- DATA TABLES --}}
        @basset('https://cdn.datatables.net/1.13.1/css/dataTables.bootstrap5.min.css')
        @basset('https://cdn.datatables.net/fixedheader/3.3.1/css/fixedHeader.dataTables.min.css')
        @basset('https://cdn.datatables.net/responsive/2.4.0/css/responsive.dataTables.min.css')
    
        {{-- CRUD LIST CONTENT - crud_list_styles stack --}}
        @stack('crud_list_styles')
    @endsection
    
    @section('after_scripts')
        {{-- DATA TABLES SCRIPT --}}
        @basset('https://cdn.datatables.net/1.13.1/js/jquery.dataTables.min.js')
        @basset('https://cdn.datatables.net/1.13.1/js/dataTables.bootstrap5.min.js')
        @basset('https://cdn.datatables.net/responsive/2.4.0/js/dataTables.responsive.min.js')
        @basset('https://cdn.datatables.net/responsive/2.4.0/css/responsive.dataTables.min.css')
        @basset('https://cdn.datatables.net/fixedheader/3.3.1/js/dataTables.fixedHeader.min.js')
        @basset('https://cdn.datatables.net/fixedheader/3.3.1/css/fixedHeader.dataTables.min.css')
    
        <script>
            $(document).ready(function() {
            // Initialize DataTable with custom settings
            var table = $('#custom-datatable').DataTable({
                // Disable default search box in DataTable
                dom: 'rtip', // removes the default search box, leaving table, pagination, and info
            });
    
            // Custom search input functionality
            $('#datatable_search_stack input').on('keyup', function() {
                table.search(this.value).draw();
            });
        });
        </script>
    
        {{-- CRUD LIST CONTENT - crud_list_scripts stack --}}
        @stack('crud_list_scripts')
    @endsection
    
    

    enter image description here