aboutsummaryrefslogtreecommitdiff
/** Handlers for events in datatables **/

var addTableLength = (menuList, lengthToAdd, dataLength) => {
    if(dataLength >= lengthToAdd) {
        newList = structuredClone(menuList);//menuList.slice(0, menuList.length); // shallow copy
        newList.push(lengthToAdd);
        return newList;
    }
    return menuList;
};

var defaultLengthMenu = (data) => {
    menuList = []
    var lengths = [10, 25, 50, 100, 1000, data.length];
    lengths.forEach((len) => {
        menuList = addTableLength(menuList, len, data.length);
    });
    return menuList;
};

var buildDataTable = (tableId, data = [], columns = [], userSettings = {}) => {
    var defaultSettings = {
        responsive: true,
        layout: {
            topStart: null,
            topEnd: null,
            bottomStart: null,
            bottomEnd: null,
        },
        select: true,
        /* == Scroller settings == */
        scroller: true,
        paging: true, // MUST be true for scroller to work
        scrollY: "750px",
        deferRender: true,
        /* == END: Scroller settings == */
        lengthMenu: defaultLengthMenu(data),
        language: {
            processing: "Processing… Please wait.",
            loadingRecords: "Loading table data… Please wait.",
            lengthMenu: "",
            info: ""
        },
        data: data,
        columns: columns,
        drawCallback: (settings) => {
            $(this[0]).find("tbody tr").each((idx, row) => {
                var arow = $(row);
                var checkboxOrRadio = arow.find(".chk-row-select");
                if (checkboxOrRadio) {
                    if (arow.hasClass("selected")) {
                        checkboxOrRadio.prop("checked", true);
                    } else {
                        checkboxOrRadio.prop("checked", false);
                    }
                }
            });
        }
    }
    var theDataTable = $(tableId).DataTable({
        ...defaultSettings,
        ...userSettings
    });
    theDataTable.on("select", (event, datatable, type, cell, originalEvent) => {
        datatable.rows({selected: true}).nodes().each((node, index) => {
            $(node).find(".chk-row-select").prop("checked", true)
        });
    });
    theDataTable.on("deselect", (event, datatable, type, cell, originalEvent) => {
        datatable.rows({selected: false}).nodes().each((node, index) => {
            $(node).find(".chk-row-select").prop("checked", false)
        });
    });
    return theDataTable;
};