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