/** * Shared list DataTable behavior (aligned with batch_list.php): * - Temporarily neutralize scroll defaults during init * - Force scrollX/Y/Collapse off, autoWidth/responsive false * - Sync horizontal scroll between scrollHead and scrollBody when present * - columns.adjust on draw, resize, and after first paint */ (function (window, $) { "use strict"; if (typeof $ === "undefined" || !$ || !$.fn || !$.fn.DataTable) { return; } var _savedDefaults = null; window.nhanceListDataTableBeforeInit = function () { _savedDefaults = { scrollX: $.fn.dataTable.defaults.scrollX, scrollY: $.fn.dataTable.defaults.scrollY, scrollCollapse: $.fn.dataTable.defaults.scrollCollapse, bScrollCollapse: $.fn.dataTable.defaults.bScrollCollapse, sScrollX: $.fn.dataTable.defaults.sScrollX, sScrollY: $.fn.dataTable.defaults.sScrollY, sScrollXInner: $.fn.dataTable.defaults.sScrollXInner, }; $.extend($.fn.dataTable.defaults, { scrollX: false, scrollY: false, scrollCollapse: false, bScrollCollapse: false, sScrollX: "", sScrollY: "", sScrollXInner: "", }); }; window.nhanceListDataTableAfterInit = function () { if (_savedDefaults) { $.extend($.fn.dataTable.defaults, _savedDefaults); _savedDefaults = null; } }; window.nhanceListDataTableBaseInitComplete = function () { return function () { var api = this.api(); var $wrap = $(api.table().container()); var $body = $wrap.find(".dataTables_scrollBody"); var $head = $wrap.find(".dataTables_scrollHead"); if ($body.length && $head.length) { $body.off("scroll.nhanceListHScroll").on("scroll.nhanceListHScroll", function () { $head.scrollLeft($(this).scrollLeft()); }); $head.off("scroll.nhanceListHScroll").on("scroll.nhanceListHScroll", function () { $body.scrollLeft($(this).scrollLeft()); }); } }; }; /** * Merge page-specific DataTable options with batch_list-style list defaults. * User initComplete runs after base scroll sync. */ window.nhanceMergeListDataTableOptions = function (userOptions) { userOptions = userOptions || {}; var userInit = userOptions.initComplete; var merged = $.extend(true, {}, userOptions); /* DataTables maps these to oScroll *before* pb()/tb() runs. CamelCase alone is not enough if sScrollX/sScrollY were set via defaults, Hungarian options, or truthy strings. */ merged.scrollX = false; merged.scrollY = false; merged.scrollCollapse = false; merged.sScrollX = ""; merged.sScrollY = ""; merged.sScrollXInner = ""; merged.bScrollCollapse = false; merged.autoWidth = false; merged.responsive = false; if (merged.paging === undefined) { merged.paging = true; } var baseInit = window.nhanceListDataTableBaseInitComplete(); merged.initComplete = function () { baseInit.call(this); if (typeof userInit === "function") { userInit.call(this); } }; return merged; }; window.nhanceListDataTableBindAdjust = function (dtApi) { if (!dtApi || !dtApi.on) { return; } var tid = $(dtApi.table().node()).attr("id") || "nhance_dt"; var resizeNs = "resize.nhanceListDt_" + tid; dtApi.columns.adjust(); dtApi.on("draw.dt", function () { dtApi.columns.adjust(); }); $(window).off(resizeNs).on(resizeNs, function () { dtApi.columns.adjust(); }); setTimeout(function () { dtApi.columns.adjust(); }, 0); }; })(window, jQuery);