| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 | /** * @author: Yura Knoxville * @version: v1.0.0 */!function ($) {    'use strict';    var initBodyCaller,        tableGroups;    // it only does '%s', and return '' when arguments are undefined    var sprintf = function (str) {        var args = arguments,            flag = true,            i = 1;        str = str.replace(/%s/g, function () {            var arg = args[i++];            if (typeof arg === 'undefined') {                flag = false;                return '';            }            return arg;        });        return flag ? str : '';    };    var groupBy = function (array , f) {        var groups = {};        array.forEach(function(o) {            var group = f(o);            groups[group] = groups[group] || [];            groups[group].push(o);        });        return groups;    };    $.extend($.fn.bootstrapTable.defaults, {        groupBy: false,        groupByField: ''    });    var BootstrapTable = $.fn.bootstrapTable.Constructor,        _initSort = BootstrapTable.prototype.initSort,        _initBody = BootstrapTable.prototype.initBody,        _updateSelected = BootstrapTable.prototype.updateSelected;    BootstrapTable.prototype.initSort = function () {        _initSort.apply(this, Array.prototype.slice.apply(arguments));        var that = this;        tableGroups = [];        if ((this.options.groupBy) && (this.options.groupByField !== '')) {            if ((this.options.sortName != this.options.groupByField)) {                this.data.sort(function(a, b) {                    return a[that.options.groupByField].localeCompare(b[that.options.groupByField]);                });            }            var that = this;            var groups = groupBy(that.data, function (item) {                return [item[that.options.groupByField]];            });            var index = 0;            $.each(groups, function(key, value) {                tableGroups.push({                    id: index,                    name: key                });                value.forEach(function(item) {                    if (!item._data) {                        item._data = {};                    }                    item._data['parent-index'] = index;                });                index++;            });        }    }    BootstrapTable.prototype.initBody = function () {        initBodyCaller = true;        _initBody.apply(this, Array.prototype.slice.apply(arguments));        if ((this.options.groupBy) && (this.options.groupByField !== '')) {            var that = this,                checkBox = false,                visibleColumns = 0;            this.columns.forEach(function(column) {                if (column.checkbox) {                    checkBox = true;                } else {                    if (column.visible) {                        visibleColumns += 1;                    }                }            });            if (this.options.detailView && !this.options.cardView) {                visibleColumns += 1;            }            tableGroups.forEach(function(item){                var html = [];                html.push(sprintf('<tr class="info groupBy expanded" data-group-index="%s">', item.id));                if (that.options.detailView && !that.options.cardView) {                    html.push('<td class="detail"></td>');                }                if (checkBox) {                    html.push('<td class="bs-checkbox">',                        '<input name="btSelectGroup" type="checkbox" />',                        '</td>'                    );                }                html.push('<td',                    sprintf(' colspan="%s"', visibleColumns),                    '>', item.name, '</td>'                );                html.push('</tr>');                that.$body.find('tr[data-parent-index='+item.id+']:first').before($(html.join('')));            });            this.$selectGroup = [];            this.$body.find('[name="btSelectGroup"]').each(function() {                var self = $(this);                that.$selectGroup.push({                    group: self,                    item: that.$selectItem.filter(function () {                        return ($(this).closest('tr').data('parent-index') ===                        self.closest('tr').data('group-index'));                    })                });            });            this.$container.off('click', '.groupBy')                .on('click', '.groupBy', function() {                    $(this).toggleClass('expanded');                    that.$body.find('tr[data-parent-index='+$(this).closest('tr').data('group-index')+']').toggleClass('hidden');                });            this.$container.off('click', '[name="btSelectGroup"]')                .on('click', '[name="btSelectGroup"]', function (event) {                    event.stopImmediatePropagation();                    var self = $(this);                    var checked = self.prop('checked');                    that[checked ? 'checkGroup' : 'uncheckGroup']($(this).closest('tr').data('group-index'));                });        }        initBodyCaller = false;        this.updateSelected();    };    BootstrapTable.prototype.updateSelected = function () {        if (!initBodyCaller) {            _updateSelected.apply(this, Array.prototype.slice.apply(arguments));            if ((this.options.groupBy) && (this.options.groupByField !== '')) {                this.$selectGroup.forEach(function (item) {                    var checkGroup = item.item.filter(':enabled').length ===                        item.item.filter(':enabled').filter(':checked').length;                    item.group.prop('checked', checkGroup);                });            }        }    };    BootstrapTable.prototype.getGroupSelections = function (index) {        var that = this;        return $.grep(this.data, function (row) {            return (row[that.header.stateField] && (row._data['parent-index'] === index));        });    };    BootstrapTable.prototype.checkGroup = function (index) {        this.checkGroup_(index, true);    };    BootstrapTable.prototype.uncheckGroup = function (index) {        this.checkGroup_(index, false);    };    BootstrapTable.prototype.checkGroup_ = function (index, checked) {        var rows;        var filter = function() {            return ($(this).closest('tr').data('parent-index') === index);        };        if (!checked) {            rows = this.getGroupSelections(index);        }        this.$selectItem.filter(filter).prop('checked', checked);        this.updateRows();        this.updateSelected();        if (checked) {            rows = this.getGroupSelections(index);        }        this.trigger(checked ? 'check-all' : 'uncheck-all', rows);    };}(jQuery);
 |