// @ts-nocheck jQuery( document ).ready( function ( $ ) { let dataTableInitialized = false; let currentIsMobile = window.matchMedia( '(max-width: 767px)' ).matches; /** * Initialize DataTable with given responsive setting * * @param {boolean} isMobile */ function initializeDataTable( isMobile ) { if ( dataTableInitialized ) { const table = $( '#data-table' ).DataTable(); table.destroy(); // Remove any existing dt-last-visible classes before reinitializing $( '#data-table thead th' ).removeClass( 'dt-last-visible' ); } $( '#data-table' ).DataTable( { paging: false, searching: false, ordering: false, info: false, columnDefs: [ { width: '20%', targets: 0 } ], fixedColumns: true, scrollCollapse: true, scrollX: true, responsive: isMobile, // Callback after table is drawn /** * Set the last visible after the table is drawn */ drawCallback: function () { setLastVisibleTh(); } } ); dataTableInitialized = true; // Initialize tooltips only if not mobile if ( ! isMobile ) { initializeTooltips(); } } /** * Initialize tooltips for non-mobile views */ function initializeTooltips() { tippy( '.tooltip-icon', { /** * @param reference */ content: ( reference ) => reference.getAttribute( 'data-tooltip' ), allowHTML: true, placement: 'top', arrow: true, maxWidth: 300 } ); } /** * Set the 'dt-last-visible' class on the last visible */ function setLastVisibleTh() { const table = $( '#data-table' ).DataTable(); const columns = table.columns().indexes().toArray(); // Remove the class from all headers first $( '#data-table thead th' ).removeClass( 'dt-last-visible' ); // Iterate from the end to find the last visible column for ( let i = columns.length - 1; i >= 0; i-- ) { if ( table.column( columns[i] ).visible() ) { const header = $( table.column( columns[i] ).header() ); // Ensure the header is visible via jQuery if ( header.is( ':visible' ) ) { header.addClass( 'dt-last-visible' ); break; } } } } initializeDataTable( currentIsMobile ); setLastVisibleTh(); /** * Debounce utility function * * @param {Function} func The function to debounce. * @param {number} wait The number of milliseconds to delay. * @returns {Function} The debounced function. */ function debounce( func, wait ) { let timeout; return function () { const context = this, args = arguments; clearTimeout( timeout ); timeout = setTimeout( () => func.apply( context, args ), wait ); }; } $( window ).resize( debounce( function () { const isMobile = window.matchMedia( '(max-width: 767px)' ).matches; if ( isMobile !== currentIsMobile ) { currentIsMobile = isMobile; initializeDataTable( currentIsMobile ); // After re-initialization, set the last visible setLastVisibleTh(); } }, 250 ) ); /** * Listen for DataTable responsive events to update dt-last-visible */ $( '#data-table' ).on( 'responsive-display', function () { setLastVisibleTh(); } ); } );