| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 | /*! FixedColumns 4.0.0 * 2019-2020 SpryMedia Ltd - datatables.net/license */(function () {    'use strict';    var $;    var dataTable;    function setJQuery(jq) {        $ = jq;        dataTable = $.fn.dataTable;    }    var FixedColumns = /** @class */ (function () {        function FixedColumns(settings, opts) {            var _this = this;            // Check that the required version of DataTables is included            if (!dataTable || !dataTable.versionCheck || !dataTable.versionCheck('1.10.0')) {                throw new Error('StateRestore requires DataTables 1.10 or newer');            }            var table = new dataTable.Api(settings);            this.classes = $.extend(true, {}, FixedColumns.classes);            // Get options from user            this.c = $.extend(true, {}, FixedColumns.defaults, opts);            // Backwards compatibility for deprecated leftColumns            if (opts.left === undefined && this.c.leftColumns !== undefined) {                this.c.left = this.c.leftColumns;            }            // Backwards compatibility for deprecated rightColumns            if (opts.right === undefined && this.c.rightColumns !== undefined) {                this.c.right = this.c.rightColumns;            }            this.s = {                barWidth: 0,                dt: table,                rtl: $(table.table().node()).css('direction') === 'rtl'            };            // Set the bar width if vertical scrolling is enabled            if (this.s.dt.settings()[0].oInit.scrollY === true) {                this.s.barWidth = this.s.dt.settings()[0].oBrowser.barWidth;            }            // Common CSS for all blockers            var blockerCSS = {                'background-color': 'white',                'bottom': '0px',                'display': 'block',                'position': 'absolute',                'width': this.s.barWidth + 1 + 'px'            };            this.dom = {                leftBottomBlocker: $('<div>')                    .css(blockerCSS)                    .css('left', 0)                    .addClass(this.classes.leftBottomBlocker),                leftTopBlocker: $('<div>')                    .css(blockerCSS)                    .css({                    left: 0,                    top: 0                })                    .addClass(this.classes.leftTopBlocker),                rightBottomBlocker: $('<div>')                    .css(blockerCSS)                    .css('right', 0)                    .addClass(this.classes.rightBottomBlocker),                rightTopBlocker: $('<div>')                    .css(blockerCSS)                    .css({                    right: 0,                    top: 0                })                    .addClass(this.classes.rightTopBlocker)            };            if (this.s.dt.settings()[0]._bInitComplete) {                // Fixed Columns Initialisation                this._addStyles();                this._setKeyTableListener();            }            else {                table.one('preInit.dt', function () {                    // Fixed Columns Initialisation                    _this._addStyles();                    _this._setKeyTableListener();                });            }            // Make class available through dt object            table.settings()[0]._fixedColumns = this;            return this;        }        /**         * Getter/Setter for the fixedColumns.left property         *         * @param newVal Optional. If present this will be the new value for the number of left fixed columns         * @returns The number of left fixed columns         */        FixedColumns.prototype.left = function (newVal) {            // If the value is to change            if (newVal !== undefined) {                // Set the new values and redraw the columns                this.c.left = newVal;                this._addStyles();            }            return this.c.left;        };        /**         * Getter/Setter for the fixedColumns.left property         *         * @param newVal Optional. If present this will be the new value for the number of right fixed columns         * @returns The number of right fixed columns         */        FixedColumns.prototype.right = function (newVal) {            // If the value is to change            if (newVal !== undefined) {                // Set the new values and redraw the columns                this.c.right = newVal;                this._addStyles();            }            return this.c.right;        };        /**         * Iterates over the columns, fixing the appropriate ones to the left and right         */        FixedColumns.prototype._addStyles = function () {            var parentDiv = null;            // Get the header and it's height            var header = this.s.dt.column(0).header();            var headerHeight = null;            if (header !== null) {                header = $(header);                headerHeight = header.outerHeight() + 1;                parentDiv = $(header.closest('div.dataTables_scroll')).css('position', 'relative');            }            // Get the footer and it's height            var footer = this.s.dt.column(0).footer();            var footerHeight = null;            if (footer !== null) {                footer = $(footer);                footerHeight = footer.outerHeight();                // Only attempt to retrieve the parentDiv if it has not been retrieved already                if (parentDiv === null) {                    parentDiv = $(footer.closest('div.dataTables_scroll')).css('position', 'relative');                }            }            // Get the number of columns in the table - this is used often so better to only make 1 api call            var numCols = this.s.dt.columns().data().toArray().length;            // Tracker for the number of pixels should be left to the left of the table            var distLeft = 0;            // Get all of the row elements in the table            var rows = $(this.s.dt.table().node()).children('tbody').children('tr');            var invisibles = 0;            // Iterate over all of the columns            for (var i = 0; i < numCols; i++) {                var column = this.s.dt.column(i);                if (!column.visible()) {                    invisibles++;                    continue;                }                // Get the columns header and footer element                var colHeader = $(column.header());                var colFooter = $(column.footer());                // If i is less than the value of left then this column should be fixed left                if (i < this.c.left) {                    $(this.s.dt.table().node()).addClass(this.classes.tableFixedLeft);                    parentDiv.addClass(this.classes.tableFixedLeft);                    // Add the width of the previous node - only if we are on atleast the second column                    if (i !== 0) {                        var prevCol = this.s.dt.column(i - 1);                        if (prevCol.visible()) {                            distLeft += $(prevCol.nodes()[0]).outerWidth();                        }                    }                    // Iterate over all of the rows, fixing the cell to the left                    for (var _i = 0, rows_1 = rows; _i < rows_1.length; _i++) {                        var row = rows_1[_i];                        $($(row).children()[i - invisibles])                            .css(this._getCellCSS(false, distLeft, 'left'))                            .addClass(this.classes.fixedLeft);                    }                    // Add the css for the header and the footer                    colHeader                        .css(this._getCellCSS(true, distLeft, 'left'))                        .addClass(this.classes.fixedLeft);                    colFooter                        .css(this._getCellCSS(true, distLeft, 'left'))                        .addClass(this.classes.fixedLeft);                }                else {                    // Iteriate through all of the rows, making sure they aren't currently trying to fix left                    for (var _a = 0, rows_2 = rows; _a < rows_2.length; _a++) {                        var row = rows_2[_a];                        var cell = $($(row).children()[i - invisibles]);                        // If the cell is trying to fix to the left, remove the class and the css                        if (cell.hasClass(this.classes.fixedLeft)) {                            cell                                .css(this._clearCellCSS('left'))                                .removeClass(this.classes.fixedLeft);                        }                    }                    // Make sure the header for this column isn't fixed left                    if (colHeader.hasClass(this.classes.fixedLeft)) {                        colHeader                            .css(this._clearCellCSS('left'))                            .removeClass(this.classes.fixedLeft);                    }                    // Make sure the footer for this column isn't fixed left                    if (colFooter.hasClass(this.classes.fixedLeft)) {                        colFooter                            .css(this._clearCellCSS('left'))                            .removeClass(this.classes.fixedLeft);                    }                }            }            // If there is a header with the index class and reading rtl then add left top blocker            if (header !== null && !header.hasClass('index')) {                if (this.s.rtl) {                    this.dom.leftTopBlocker.outerHeight(headerHeight);                    parentDiv.append(this.dom.leftTopBlocker);                }                else {                    this.dom.rightTopBlocker.outerHeight(headerHeight);                    parentDiv.append(this.dom.rightTopBlocker);                }            }            // If there is a footer with the index class and reading rtl then add left bottom blocker            if (footer !== null && !footer.hasClass('index')) {                if (this.s.rtl) {                    this.dom.leftBottomBlocker.outerHeight(footerHeight);                    parentDiv.append(this.dom.leftBottomBlocker);                }                else {                    this.dom.rightBottomBlocker.outerHeight(footerHeight);                    parentDiv.append(this.dom.rightBottomBlocker);                }            }            var distRight = 0;            invisibles = 0;            for (var i = numCols - 1; i >= 0; i--) {                var column = this.s.dt.column(i);                // Get the columns header and footer element                var colHeader = $(column.header());                var colFooter = $(column.footer());                if (!column.visible()) {                    invisibles++;                    continue;                }                if (i >= numCols - this.c.right) {                    $(this.s.dt.table().node()).addClass(this.classes.tableFixedRight);                    parentDiv.addClass(this.classes.tableFixedLeft);                    // Add the widht of the previous node, only if we are on atleast the second column                    if (i !== numCols - 1) {                        var prevCol = this.s.dt.column(i + 1);                        if (prevCol.visible()) {                            distRight += $(prevCol.nodes()[0]).outerWidth();                        }                    }                    // Iterate over all of the rows, fixing the cell to the right                    for (var _b = 0, rows_3 = rows; _b < rows_3.length; _b++) {                        var row = rows_3[_b];                        $($(row).children()[i + invisibles])                            .css(this._getCellCSS(false, distRight, 'right'))                            .addClass(this.classes.fixedRight);                    }                    // Add the css for the header and the footer                    colHeader                        .css(this._getCellCSS(true, distRight, 'right'))                        .addClass(this.classes.fixedRight);                    colFooter                        .css(this._getCellCSS(true, distRight, 'right'))                        .addClass(this.classes.fixedRight);                }                else {                    // Iteriate through all of the rows, making sure they aren't currently trying to fix right                    for (var _c = 0, rows_4 = rows; _c < rows_4.length; _c++) {                        var row = rows_4[_c];                        var cell = $($(row).children()[i + invisibles]);                        // If the cell is trying to fix to the right, remove the class and the css                        if (cell.hasClass(this.classes.fixedRight)) {                            cell                                .css(this._clearCellCSS('right'))                                .removeClass(this.classes.fixedRight);                        }                    }                    // Make sure the header for this column isn't fixed right                    if (colHeader.hasClass(this.classes.fixedRight)) {                        colHeader                            .css(this._clearCellCSS('right'))                            .removeClass(this.classes.fixedRight);                    }                    // Make sure the footer for this column isn't fixed right                    if (colFooter.hasClass(this.classes.fixedRight)) {                        colFooter                            .css(this._clearCellCSS('right'))                            .removeClass(this.classes.fixedRight);                    }                }            }            // If there is a header with the index class and reading rtl then add right top blocker            if (header) {                if (!this.s.rtl) {                    this.dom.rightTopBlocker.outerHeight(headerHeight);                    parentDiv.append(this.dom.rightTopBlocker);                }                else {                    this.dom.leftTopBlocker.outerHeight(headerHeight);                    parentDiv.append(this.dom.leftTopBlocker);                }            }            // If there is a footer with the index class and reading rtl then add right bottom blocker            if (footer) {                if (!this.s.rtl) {                    this.dom.rightBottomBlocker.outerHeight(footerHeight);                    parentDiv.append(this.dom.rightBottomBlocker);                }                else {                    this.dom.leftBottomBlocker.outerHeight(footerHeight);                    parentDiv.append(this.dom.leftBottomBlocker);                }            }        };        /**         * Gets the correct CSS for the cell, header or footer based on options provided         *         * @param header Whether this cell is a header or a footer         * @param dist The distance that the cell should be moved away from the edge         * @param lr Indicator of fixing to the left or the right         * @returns An object containing the correct css         */        FixedColumns.prototype._getCellCSS = function (header, dist, lr) {            if (lr === 'left') {                return !this.s.rtl ?                    {                        left: dist + 'px',                        position: 'sticky'                    } :                    {                        position: 'sticky',                        right: dist + (header ? this.s.barWidth : 0) + 'px'                    };            }            else {                return !this.s.rtl ?                    {                        position: 'sticky',                        right: dist + (header ? this.s.barWidth : 0) + 'px'                    } :                    {                        left: dist + 'px',                        position: 'sticky'                    };            }        };        /**         * Gets the css that is required to clear the fixing to a side         *         * @param lr Indicator of fixing to the left or the right         * @returns An object containing the correct css         */        FixedColumns.prototype._clearCellCSS = function (lr) {            if (lr === 'left') {                return !this.s.rtl ?                    {                        left: '',                        position: ''                    } :                    {                        position: '',                        right: ''                    };            }            else {                return !this.s.rtl ?                    {                        position: '',                        right: ''                    } :                    {                        left: '',                        position: ''                    };            }        };        FixedColumns.prototype._setKeyTableListener = function () {            var _this = this;            this.s.dt.on('key-focus', function (e, dt, cell) {                var cellPos = $(cell.node()).offset();                var scroll = $($(_this.s.dt.table().node()).closest('div.dataTables_scrollBody'));                // If there are fixed columns to the left                if (_this.c.left > 0) {                    // Get the rightmost left fixed column header, it's position and it's width                    var rightMost = $(_this.s.dt.column(_this.c.left - 1).header());                    var rightMostPos = rightMost.offset();                    var rightMostWidth = rightMost.outerWidth();                    // If the current highlighted cell is left of the rightmost cell on the screen                    if (cellPos.left < rightMostPos.left + rightMostWidth) {                        // Scroll it into view                        var currScroll = scroll.scrollLeft();                        scroll.scrollLeft(currScroll - (rightMostPos.left + rightMostWidth - cellPos.left));                    }                }                // If there are fixed columns to the right                if (_this.c.right > 0) {                    // Get the number of columns and the width of the cell as doing right side calc                    var numCols = _this.s.dt.columns().data().toArray().length;                    var cellWidth = $(cell.node()).outerWidth();                    // Get the leftmost right fixed column header and it's position                    var leftMost = $(_this.s.dt.column(numCols - _this.c.right).header());                    var leftMostPos = leftMost.offset();                    // If the current highlighted cell is right of the leftmost cell on the screen                    if (cellPos.left + cellWidth > leftMostPos.left) {                        // Scroll it into view                        var currScroll = scroll.scrollLeft();                        scroll.scrollLeft(currScroll - (leftMostPos.left - (cellPos.left + cellWidth)));                    }                }            });            // Whenever a draw occurs there is potential for the data to have changed and therefore also the column widths            // Therefore it is necessary to recalculate the values for the fixed columns            this.s.dt.on('draw', function () {                _this._addStyles();            });            this.s.dt.on('column-reorder', function () {                _this._addStyles();            });            this.s.dt.on('column-visibility', function () {                _this._addStyles();            });        };        FixedColumns.version = '4.0.0';        FixedColumns.classes = {            fixedLeft: 'dtfc-fixed-left',            fixedRight: 'dtfc-fixed-right',            leftBottomBlocker: 'dtfc-left-bottom-blocker',            leftTopBlocker: 'dtfc-left-top-blocker',            rightBottomBlocker: 'dtfc-right-bottom-blocker',            rightTopBlocker: 'dtfc-right-top-blocker',            tableFixedLeft: 'dtfc-has-left',            tableFixedRight: 'dtfc-has-right'        };        FixedColumns.defaults = {            i18n: {                button: 'FixedColumns'            },            left: 1,            right: 0        };        return FixedColumns;    }());    /*! FixedColumns 4.0.0     * 2019-2020 SpryMedia Ltd - datatables.net/license     */    // DataTables extensions common UMD. Note that this allows for AMD, CommonJS    // (with window and jQuery being allowed as parameters to the returned    // function) or just default browser loading.    (function (factory) {        if (typeof define === 'function' && define.amd) {            // AMD            define(['jquery', 'datatables.net'], function ($) {                return factory($, window, document);            });        }        else if (typeof exports === 'object') {            // CommonJS            module.exports = function (root, $) {                if (!root) {                    root = window;                }                if (!$ || !$.fn.dataTable) {                    // eslint-disable-next-line @typescript-eslint/no-var-requires                    $ = require('datatables.net')(root, $).$;                }                return factory($, root, root.document);            };        }        else {            // Browser - assume jQuery has already been loaded            factory(window.jQuery, window, document);        }    }(function ($, window, document) {        setJQuery($);        var dataTable = $.fn.dataTable;        $.fn.dataTable.FixedColumns = FixedColumns;        $.fn.DataTable.FixedColumns = FixedColumns;        var apiRegister = $.fn.dataTable.Api.register;        apiRegister('fixedColumns()', function () {            return this;        });        apiRegister('fixedColumns().left()', function (newVal) {            var ctx = this.context[0];            if (newVal !== undefined) {                ctx._fixedColumns.left(newVal);                return this;            }            else {                return ctx._fixedColumns.left();            }        });        apiRegister('fixedColumns().right()', function (newVal) {            var ctx = this.context[0];            if (newVal !== undefined) {                ctx._fixedColumns.right(newVal);                return this;            }            else {                return ctx._fixedColumns.right();            }        });        $.fn.dataTable.ext.buttons.fixedColumns = {            action: function (e, dt, node, config) {                if ($(node).attr('active')) {                    $(node).removeAttr('active').removeClass('active');                    dt.fixedColumns().left(0);                    dt.fixedColumns().right(0);                }                else {                    $(node).attr('active', true).addClass('active');                    dt.fixedColumns().left(config.config.left);                    dt.fixedColumns().right(config.config.right);                }            },            config: {                left: 1,                right: 0            },            init: function (dt, node, config) {                if (dt.settings()[0]._fixedColumns === undefined) {                    _init(dt.settings(), config);                }                $(node).attr('active', true).addClass('active');                dt.button(node).text(config.text || dt.i18n('buttons.fixedColumns', dt.settings()[0]._fixedColumns.c.i18n.button));            },            text: null        };        function _init(settings, options) {            if (options === void 0) { options = null; }            var api = new dataTable.Api(settings);            var opts = options                ? options                : api.init().fixedColumns || dataTable.defaults.fixedColumns;            var fixedColumns = new FixedColumns(api, opts);            return fixedColumns;        }        // Attach a listener to the document which listens for DataTables initialisation        // events so we can automatically initialise        $(document).on('init.dt.dtfc', function (e, settings) {            if (e.namespace !== 'dt') {                return;            }            if (settings.oInit.fixedColumns ||                dataTable.defaults.fixedColumns) {                if (!settings._fixedColumns) {                    _init(settings, null);                }            }        });    }));}());
 |