nhance/public/assets/js/pages/nhance-list-datatable.js

112 lines
4.0 KiB
JavaScript

/**
* 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);