You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
8.9 KiB
JavaScript
257 lines
8.9 KiB
JavaScript
2 years ago
|
(function (global, factory) {
|
||
|
if (typeof define === "function" && define.amd) {
|
||
|
define([], factory);
|
||
|
} else if (typeof exports !== "undefined") {
|
||
|
factory();
|
||
|
} else {
|
||
|
var mod = {
|
||
|
exports: {}
|
||
|
};
|
||
|
factory();
|
||
|
global.bootstrapTableGroupBy = mod.exports;
|
||
|
}
|
||
|
})(this, function () {
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* @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 getParentRowId(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 sumData(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[that.fieldsColumnsIndex[prop]].groupBySumGroup) {
|
||
|
if (sumRow[prop] === undefined) {
|
||
|
sumRow[prop] = 0;
|
||
|
}
|
||
|
sumRow[prop] += +row[prop];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
return sumRow;
|
||
|
};
|
||
|
|
||
|
var rowAttr = function rowAttr(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 setObjectKeys() {
|
||
|
// 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 getDataArrayFromItem(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 getNewRow(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 groupBy(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 makeGrouped(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.off('post-body.bs.table').on('post-body.bs.table', function () {
|
||
|
that.$el.treetable({
|
||
|
expandable: true,
|
||
|
onNodeExpand: function onNodeExpand() {
|
||
|
if (that.options.height) {
|
||
|
that.resetHeader();
|
||
|
}
|
||
|
},
|
||
|
onNodeCollapse: function onNodeCollapse() {
|
||
|
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);
|
||
|
});
|