File "custom_datatable.js"

Full Path: /home/trinadezambia/public_html/ecommerce/assets/admin/js/custom_datatable.js
File size: 3.57 KB
MIME-type: text/plain
Charset: utf-8



// Define a global namespace for datatable utilities
window.DatatableUtils = {
    // Public method to refresh a specific datatable by ID or all datatables
    refreshDatatable: function (tableId = null) {
        if (tableId && $.fn.DataTable.isDataTable('#' + tableId)) {
            // Refresh specific table if ID is provided and table exists
            $('#' + tableId).DataTable().ajax.reload(function () {
                console.log('Datatable ' + tableId + ' refreshed successfully');
            }, false);
        } else {
            // Refresh all datatables if no ID provided or table not found
            const datatables = $.fn.dataTable.tables();
            if (datatables.length > 0) {
                $(datatables).each(function () {
                    $(this).DataTable().ajax.reload(function () {
                        console.log('Datatable refreshed successfully');
                    }, false);
                });
            }
        }
    }
};

document.addEventListener("DOMContentLoaded", function () {

    // Show spinner on AJAX start, hide on complete
    $(document).on('ajaxStart', function () {
        $('#datatable-loading').removeClass('d-none');
    }).on('ajaxStop', function () {
        $('#datatable-loading').addClass('d-none');
    });
    // Reset filters
    $('#resetFilters').on('click', function () {
        $('#statusFilter, #brandFilter, #categoryFilter').val('');
        $('#reportrange').val('');
        // Trigger filter update if needed
    });


    const datatableElements = document.querySelectorAll("[data-datatable]");

    datatableElements.forEach((el) => {
        const route = el.getAttribute("data-route");
        const columns = JSON.parse(el.getAttribute("data-columns"));
        const options = el.getAttribute("data-options")
            ? JSON.parse(el.getAttribute("data-options"))
            : {};

        // Check if the DataTable is already initialized
        if ($.fn.DataTable.isDataTable(el)) {
            return; // Skip initialization if already initialized
        }


        // Default options
        let defaultOptions = {
            language: {
                emptyTable: "<div class='text-center text-secondary p-3'><i class='ti ti-database fs-1'></i><br>No data available.</div>"
            },
            select: false,
            responsive: true,
            processing: true,
            serverSide: true,
            ajax: {
                url: route,
                type: "POST",
            },
            columns: columns,
            
        };

        // Merge options (user defined overrides defaults)
        let finalOptions = Object.assign({}, defaultOptions, options);

        // Initialize DataTable
        $(el).DataTable(finalOptions);
    });
});

$(document).ready(function () {
    // Add click event listener for refresh button
    $('#refresh, .refresh-table').on('click', function () {
        // Try to find the closest datatable to the clicked button
        const closestTable = $(this).closest('.card').find('table.dataTable');

        if (closestTable.length > 0) {
            // If found, refresh only that table
            const tableId = closestTable.attr('id');
            if (tableId) {
                // Use the global method to refresh the specific table
                window.DatatableUtils.refreshDatatable(tableId);
                return;
            }
        }

        // If no specific table found, refresh all datatables
        window.DatatableUtils.refreshDatatable();
    });
});