| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 | /** * @author: Dennis Hernández * @webSite: http://djhvscf.github.io/Blog * @version: v1.1.0 */!function ($) {    'use strict';    var originalRowAttr,        dataTTId = 'data-tt-id',        dataTTParentId = 'data-tt-parent-id',        obj = {},        parentId = undefined;    var getParentRowId = function (that, id) {        var parentRows = that.$body.find('tr').not('[' + 'data-tt-parent-id]');        for (var i = 0; i < parentRows.length; i++) {            if (i === id) {                return $(parentRows[i]).attr('data-tt-id');            }        }        return undefined;    };    var sumData = function (that, data) {        var sumRow = {};        $.each(data, function (i, row) {            if (!row.IsParent) {                for (var prop in row) {                    if (!isNaN(parseFloat(row[prop]))) {                        if (that.columns[$.fn.bootstrapTable.utils.getFieldIndex(that.columns, prop)].groupBySumGroup) {                            if (sumRow[prop] === undefined) {                                sumRow[prop] = 0;                            }                            sumRow[prop] += +row[prop];                        }                    }                }            }        });        return sumRow;    };    var rowAttr = function (row, index) {        //Call the User Defined Function        originalRowAttr.apply([row, index]);        obj[dataTTId.toString()] = index;        if (!row.IsParent) {            obj[dataTTParentId.toString()] = parentId === undefined ? index : parentId;        } else {            parentId = index;            delete obj[dataTTParentId.toString()];        }        return obj;    };    var setObjectKeys = function () {        // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys        Object.keys = function (o) {            if (o !== Object(o)) {                throw new TypeError('Object.keys called on a non-object');            }            var k = [],                p;            for (p in o) {                if (Object.prototype.hasOwnProperty.call(o, p)) {                    k.push(p);                }            }            return k;        }    };    var getDataArrayFromItem = function (that, item) {        var itemDataArray = [];        for (var i = 0; i < that.options.groupByField.length; i++) {            itemDataArray.push(item[that.options.groupByField[i]]);        }        return itemDataArray;    };    var getNewRow = function (that, result, index) {        var newRow = {};        for (var i = 0; i < that.options.groupByField.length; i++) {            newRow[that.options.groupByField[i].toString()] = result[index][0][that.options.groupByField[i]];        }        newRow.IsParent = true;        return newRow;    };    var groupBy = function (array, f) {        var groups = {};        $.each(array, function (i, o) {            var group = JSON.stringify(f(o));            groups[group] = groups[group] || [];            groups[group].push(o);        });        return Object.keys(groups).map(function (group) {            return groups[group];        });    };    var makeGrouped = function (that, data) {        var newData = [],            sumRow = {};        var result = groupBy(data, function (item) {            return getDataArrayFromItem(that, item);        });        for (var i = 0; i < result.length; i++) {            result[i].unshift(getNewRow(that, result, i));            if (that.options.groupBySumGroup) {                sumRow = sumData(that, result[i]);                if (!$.isEmptyObject(sumRow)) {                    result[i].push(sumRow);                }            }        }        newData = newData.concat.apply(newData, result);        if (!that.options.loaded && newData.length > 0) {            that.options.loaded = true;            that.options.originalData = that.options.data;            that.options.data = newData;        }        return newData;    };    $.extend($.fn.bootstrapTable.defaults, {        groupBy: false,        groupByField: [],        groupBySumGroup: false,        groupByInitExpanded: undefined, //node, 'all'        //internal variables        loaded: false,        originalData: undefined    });    $.fn.bootstrapTable.methods.push('collapseAll', 'expandAll', 'refreshGroupByField');    $.extend($.fn.bootstrapTable.COLUMN_DEFAULTS, {        groupBySumGroup: false    });    var BootstrapTable = $.fn.bootstrapTable.Constructor,        _init = BootstrapTable.prototype.init,        _initData = BootstrapTable.prototype.initData;    BootstrapTable.prototype.init = function () {        //Temporal validation        if (!this.options.sortName) {            if ((this.options.groupBy) && (this.options.groupByField.length > 0)) {                var that = this;                // Compatibility: IE < 9 and old browsers                if (!Object.keys) {                    $.fn.bootstrapTable.utils.objectKeys();                }                //Make sure that the internal variables are set correctly                this.options.loaded = false;                this.options.originalData = undefined;                originalRowAttr = this.options.rowAttributes;                this.options.rowAttributes = rowAttr;                this.$el.on('post-body.bs.table', function () {                    that.$el.treetable({                        expandable: true,                        onNodeExpand: function () {                            if (that.options.height) {                                that.resetHeader();                            }                        },                        onNodeCollapse: function () {                            if (that.options.height) {                                that.resetHeader();                            }                        }                    }, true);                    if (that.options.groupByInitExpanded !== undefined) {                        if (typeof that.options.groupByInitExpanded === 'number') {                            that.expandNode(that.options.groupByInitExpanded);                        } else if (that.options.groupByInitExpanded.toLowerCase() === 'all') {                            that.expandAll();                        }                    }                });            }        }        _init.apply(this, Array.prototype.slice.apply(arguments));    };    BootstrapTable.prototype.initData = function (data, type) {        //Temporal validation        if (!this.options.sortName) {            if ((this.options.groupBy) && (this.options.groupByField.length > 0)) {                this.options.groupByField = typeof this.options.groupByField === 'string' ?                    this.options.groupByField.replace('[', '').replace(']', '')                        .replace(/ /g, '').toLowerCase().split(',') : this.options.groupByField;                data = makeGrouped(this, data ? data : this.options.data);            }        }        _initData.apply(this, [data, type]);    };    BootstrapTable.prototype.expandAll = function () {        this.$el.treetable('expandAll');    };    BootstrapTable.prototype.collapseAll = function () {        this.$el.treetable('collapseAll');    };    BootstrapTable.prototype.expandNode = function (id) {        id = getParentRowId(this, id);        if (id !== undefined) {            this.$el.treetable('expandNode', id);        }    };    BootstrapTable.prototype.refreshGroupByField = function (groupByFields) {        if (!$.fn.bootstrapTable.utils.compareObjects(this.options.groupByField, groupByFields)) {            this.options.groupByField = groupByFields;            this.load(this.options.originalData);        }    };}(jQuery);
 |