tabulator-tables
Version:
Interactive table generation JavaScript library
1,126 lines (871 loc) • 28.3 kB
JavaScript
/* Tabulator v4.9.3 (c) Oliver Folkerd */
//public group object
var GroupComponent = function GroupComponent(group) {
this._group = group;
this.type = "GroupComponent";
};
GroupComponent.prototype.getKey = function () {
return this._group.key;
};
GroupComponent.prototype.getField = function () {
return this._group.field;
};
GroupComponent.prototype.getElement = function () {
return this._group.element;
};
GroupComponent.prototype.getRows = function () {
return this._group.getRows(true);
};
GroupComponent.prototype.getSubGroups = function () {
return this._group.getSubGroups(true);
};
GroupComponent.prototype.getParentGroup = function () {
return this._group.parent ? this._group.parent.getComponent() : false;
};
GroupComponent.prototype.getVisibility = function () {
console.warn("getVisibility function is deprecated, you should now use the isVisible function");
return this._group.visible;
};
GroupComponent.prototype.isVisible = function () {
return this._group.visible;
};
GroupComponent.prototype.show = function () {
this._group.show();
};
GroupComponent.prototype.hide = function () {
this._group.hide();
};
GroupComponent.prototype.toggle = function () {
this._group.toggleVisibility();
};
GroupComponent.prototype._getSelf = function () {
return this._group;
};
GroupComponent.prototype.getTable = function () {
return this._group.groupManager.table;
};
//////////////////////////////////////////////////
//////////////// Group Functions /////////////////
//////////////////////////////////////////////////
var Group = function Group(groupManager, parent, level, key, field, generator, oldGroup) {
this.groupManager = groupManager;
this.parent = parent;
this.key = key;
this.level = level;
this.field = field;
this.hasSubGroups = level < groupManager.groupIDLookups.length - 1;
this.addRow = this.hasSubGroups ? this._addRowToGroup : this._addRow;
this.type = "group"; //type of element
this.old = oldGroup;
this.rows = [];
this.groups = [];
this.groupList = [];
this.generator = generator;
this.elementContents = false;
this.height = 0;
this.outerHeight = 0;
this.initialized = false;
this.calcs = {};
this.initialized = false;
this.modules = {};
this.arrowElement = false;
this.visible = oldGroup ? oldGroup.visible : typeof groupManager.startOpen[level] !== "undefined" ? groupManager.startOpen[level] : groupManager.startOpen[0];
this.component = null;
this.createElements();
this.addBindings();
this.createValueGroups();
};
Group.prototype.wipe = function () {
if (this.groupList.length) {
this.groupList.forEach(function (group) {
group.wipe();
});
} else {
this.element = false;
this.arrowElement = false;
this.elementContents = false;
}
};
Group.prototype.createElements = function () {
var arrow = document.createElement("div");
arrow.classList.add("tabulator-arrow");
this.element = document.createElement("div");
this.element.classList.add("tabulator-row");
this.element.classList.add("tabulator-group");
this.element.classList.add("tabulator-group-level-" + this.level);
this.element.setAttribute("role", "rowgroup");
this.arrowElement = document.createElement("div");
this.arrowElement.classList.add("tabulator-group-toggle");
this.arrowElement.appendChild(arrow);
//setup movable rows
if (this.groupManager.table.options.movableRows !== false && this.groupManager.table.modExists("moveRow")) {
this.groupManager.table.modules.moveRow.initializeGroupHeader(this);
}
};
Group.prototype.createValueGroups = function () {
var _this = this;
var level = this.level + 1;
if (this.groupManager.allowedValues && this.groupManager.allowedValues[level]) {
this.groupManager.allowedValues[level].forEach(function (value) {
_this._createGroup(value, level);
});
}
};
Group.prototype.addBindings = function () {
var self = this,
dblTap,
tapHold,
tap,
toggleElement;
//handle group click events
if (self.groupManager.table.options.groupClick) {
self.element.addEventListener("click", function (e) {
self.groupManager.table.options.groupClick.call(self.groupManager.table, e, self.getComponent());
});
}
if (self.groupManager.table.options.groupDblClick) {
self.element.addEventListener("dblclick", function (e) {
self.groupManager.table.options.groupDblClick.call(self.groupManager.table, e, self.getComponent());
});
}
if (self.groupManager.table.options.groupContext) {
self.element.addEventListener("contextmenu", function (e) {
self.groupManager.table.options.groupContext.call(self.groupManager.table, e, self.getComponent());
});
}
if ((self.groupManager.table.options.groupContextMenu || self.groupManager.table.options.groupClickMenu) && self.groupManager.table.modExists("menu")) {
self.groupManager.table.modules.menu.initializeGroup.call(self.groupManager.table.modules.menu, self);
}
if (self.groupManager.table.options.groupTap) {
tap = false;
self.element.addEventListener("touchstart", function (e) {
tap = true;
}, { passive: true });
self.element.addEventListener("touchend", function (e) {
if (tap) {
self.groupManager.table.options.groupTap(e, self.getComponent());
}
tap = false;
});
}
if (self.groupManager.table.options.groupDblTap) {
dblTap = null;
self.element.addEventListener("touchend", function (e) {
if (dblTap) {
clearTimeout(dblTap);
dblTap = null;
self.groupManager.table.options.groupDblTap(e, self.getComponent());
} else {
dblTap = setTimeout(function () {
clearTimeout(dblTap);
dblTap = null;
}, 300);
}
});
}
if (self.groupManager.table.options.groupTapHold) {
tapHold = null;
self.element.addEventListener("touchstart", function (e) {
clearTimeout(tapHold);
tapHold = setTimeout(function () {
clearTimeout(tapHold);
tapHold = null;
tap = false;
self.groupManager.table.options.groupTapHold(e, self.getComponent());
}, 1000);
}, { passive: true });
self.element.addEventListener("touchend", function (e) {
clearTimeout(tapHold);
tapHold = null;
});
}
if (self.groupManager.table.options.groupToggleElement) {
toggleElement = self.groupManager.table.options.groupToggleElement == "arrow" ? self.arrowElement : self.element;
toggleElement.addEventListener("click", function (e) {
e.stopPropagation();
e.stopImmediatePropagation();
self.toggleVisibility();
});
}
};
Group.prototype._createGroup = function (groupID, level) {
var groupKey = level + "_" + groupID;
var group = new Group(this.groupManager, this, level, groupID, this.groupManager.groupIDLookups[level].field, this.groupManager.headerGenerator[level] || this.groupManager.headerGenerator[0], this.old ? this.old.groups[groupKey] : false);
this.groups[groupKey] = group;
this.groupList.push(group);
};
Group.prototype._addRowToGroup = function (row) {
var level = this.level + 1;
if (this.hasSubGroups) {
var groupID = this.groupManager.groupIDLookups[level].func(row.getData()),
groupKey = level + "_" + groupID;
if (this.groupManager.allowedValues && this.groupManager.allowedValues[level]) {
if (this.groups[groupKey]) {
this.groups[groupKey].addRow(row);
}
} else {
if (!this.groups[groupKey]) {
this._createGroup(groupID, level);
}
this.groups[groupKey].addRow(row);
}
}
};
Group.prototype._addRow = function (row) {
this.rows.push(row);
row.modules.group = this;
};
Group.prototype.insertRow = function (row, to, after) {
var data = this.conformRowData({});
row.updateData(data);
var toIndex = this.rows.indexOf(to);
if (toIndex > -1) {
if (after) {
this.rows.splice(toIndex + 1, 0, row);
} else {
this.rows.splice(toIndex, 0, row);
}
} else {
if (after) {
this.rows.push(row);
} else {
this.rows.unshift(row);
}
}
row.modules.group = this;
this.generateGroupHeaderContents();
if (this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.options.columnCalcs != "table") {
this.groupManager.table.modules.columnCalcs.recalcGroup(this);
}
this.groupManager.updateGroupRows(true);
};
Group.prototype.scrollHeader = function (left) {
this.arrowElement.style.marginLeft = left;
this.groupList.forEach(function (child) {
child.scrollHeader(left);
});
};
Group.prototype.getRowIndex = function (row) {};
//update row data to match grouping contraints
Group.prototype.conformRowData = function (data) {
if (this.field) {
data[this.field] = this.key;
} else {
console.warn("Data Conforming Error - Cannot conform row data to match new group as groupBy is a function");
}
if (this.parent) {
data = this.parent.conformRowData(data);
}
return data;
};
Group.prototype.removeRow = function (row) {
var index = this.rows.indexOf(row);
var el = row.getElement();
if (index > -1) {
this.rows.splice(index, 1);
}
if (!this.groupManager.table.options.groupValues && !this.rows.length) {
if (this.parent) {
this.parent.removeGroup(this);
} else {
this.groupManager.removeGroup(this);
}
this.groupManager.updateGroupRows(true);
} else {
if (el.parentNode) {
el.parentNode.removeChild(el);
}
this.generateGroupHeaderContents();
if (this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.options.columnCalcs != "table") {
this.groupManager.table.modules.columnCalcs.recalcGroup(this);
}
}
};
Group.prototype.removeGroup = function (group) {
var groupKey = group.level + "_" + group.key,
index;
if (this.groups[groupKey]) {
delete this.groups[groupKey];
index = this.groupList.indexOf(group);
if (index > -1) {
this.groupList.splice(index, 1);
}
if (!this.groupList.length) {
if (this.parent) {
this.parent.removeGroup(this);
} else {
this.groupManager.removeGroup(this);
}
}
}
};
Group.prototype.getHeadersAndRows = function (noCalc) {
var output = [];
output.push(this);
this._visSet();
if (this.visible) {
if (this.groupList.length) {
this.groupList.forEach(function (group) {
output = output.concat(group.getHeadersAndRows(noCalc));
});
} else {
if (!noCalc && this.groupManager.table.options.columnCalcs != "table" && this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.modules.columnCalcs.hasTopCalcs()) {
if (this.calcs.top) {
this.calcs.top.detachElement();
this.calcs.top.deleteCells();
}
this.calcs.top = this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows);
output.push(this.calcs.top);
}
output = output.concat(this.rows);
if (!noCalc && this.groupManager.table.options.columnCalcs != "table" && this.groupManager.table.modExists("columnCalcs") && this.groupManager.table.modules.columnCalcs.hasBottomCalcs()) {
if (this.calcs.bottom) {
this.calcs.bottom.detachElement();
this.calcs.bottom.deleteCells();
}
this.calcs.bottom = this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows);
output.push(this.calcs.bottom);
}
}
} else {
if (!this.groupList.length && this.groupManager.table.options.columnCalcs != "table") {
if (this.groupManager.table.modExists("columnCalcs")) {
if (!noCalc && this.groupManager.table.modules.columnCalcs.hasTopCalcs()) {
if (this.calcs.top) {
this.calcs.top.detachElement();
this.calcs.top.deleteCells();
}
if (this.groupManager.table.options.groupClosedShowCalcs) {
this.calcs.top = this.groupManager.table.modules.columnCalcs.generateTopRow(this.rows);
output.push(this.calcs.top);
}
}
if (!noCalc && this.groupManager.table.modules.columnCalcs.hasBottomCalcs()) {
if (this.calcs.bottom) {
this.calcs.bottom.detachElement();
this.calcs.bottom.deleteCells();
}
if (this.groupManager.table.options.groupClosedShowCalcs) {
this.calcs.bottom = this.groupManager.table.modules.columnCalcs.generateBottomRow(this.rows);
output.push(this.calcs.bottom);
}
}
}
}
}
return output;
};
Group.prototype.getData = function (visible, transform) {
var self = this,
output = [];
this._visSet();
if (!visible || visible && this.visible) {
this.rows.forEach(function (row) {
output.push(row.getData(transform || "data"));
});
}
return output;
};
// Group.prototype.getRows = function(){
// this._visSet();
// return this.visible ? this.rows : [];
// };
Group.prototype.getRowCount = function () {
var count = 0;
if (this.groupList.length) {
this.groupList.forEach(function (group) {
count += group.getRowCount();
});
} else {
count = this.rows.length;
}
return count;
};
Group.prototype.toggleVisibility = function () {
if (this.visible) {
this.hide();
} else {
this.show();
}
};
Group.prototype.hide = function () {
this.visible = false;
if (this.groupManager.table.rowManager.getRenderMode() == "classic" && !this.groupManager.table.options.pagination) {
this.element.classList.remove("tabulator-group-visible");
if (this.groupList.length) {
this.groupList.forEach(function (group) {
var rows = group.getHeadersAndRows();
rows.forEach(function (row) {
row.detachElement();
});
});
} else {
this.rows.forEach(function (row) {
var rowEl = row.getElement();
rowEl.parentNode.removeChild(rowEl);
});
}
this.groupManager.table.rowManager.setDisplayRows(this.groupManager.updateGroupRows(), this.groupManager.getDisplayIndex());
this.groupManager.table.rowManager.checkClassicModeGroupHeaderWidth();
} else {
this.groupManager.updateGroupRows(true);
}
this.groupManager.table.options.groupVisibilityChanged.call(this.table, this.getComponent(), false);
};
Group.prototype.show = function () {
var self = this;
self.visible = true;
if (this.groupManager.table.rowManager.getRenderMode() == "classic" && !this.groupManager.table.options.pagination) {
this.element.classList.add("tabulator-group-visible");
var prev = self.getElement();
if (this.groupList.length) {
this.groupList.forEach(function (group) {
var rows = group.getHeadersAndRows();
rows.forEach(function (row) {
var rowEl = row.getElement();
prev.parentNode.insertBefore(rowEl, prev.nextSibling);
row.initialize();
prev = rowEl;
});
});
} else {
self.rows.forEach(function (row) {
var rowEl = row.getElement();
prev.parentNode.insertBefore(rowEl, prev.nextSibling);
row.initialize();
prev = rowEl;
});
}
this.groupManager.table.rowManager.setDisplayRows(this.groupManager.updateGroupRows(), this.groupManager.getDisplayIndex());
this.groupManager.table.rowManager.checkClassicModeGroupHeaderWidth();
} else {
this.groupManager.updateGroupRows(true);
}
this.groupManager.table.options.groupVisibilityChanged.call(this.table, this.getComponent(), true);
};
Group.prototype._visSet = function () {
var data = [];
if (typeof this.visible == "function") {
this.rows.forEach(function (row) {
data.push(row.getData());
});
this.visible = this.visible(this.key, this.getRowCount(), data, this.getComponent());
}
};
Group.prototype.getRowGroup = function (row) {
var match = false;
if (this.groupList.length) {
this.groupList.forEach(function (group) {
var result = group.getRowGroup(row);
if (result) {
match = result;
}
});
} else {
if (this.rows.find(function (item) {
return item === row;
})) {
match = this;
}
}
return match;
};
Group.prototype.getSubGroups = function (component) {
var output = [];
this.groupList.forEach(function (child) {
output.push(component ? child.getComponent() : child);
});
return output;
};
Group.prototype.getRows = function (compoment) {
var output = [];
this.rows.forEach(function (row) {
output.push(compoment ? row.getComponent() : row);
});
return output;
};
Group.prototype.generateGroupHeaderContents = function () {
var data = [];
this.rows.forEach(function (row) {
data.push(row.getData());
});
this.elementContents = this.generator(this.key, this.getRowCount(), data, this.getComponent());
while (this.element.firstChild) {
this.element.removeChild(this.element.firstChild);
}if (typeof this.elementContents === "string") {
this.element.innerHTML = this.elementContents;
} else {
this.element.appendChild(this.elementContents);
}
this.element.insertBefore(this.arrowElement, this.element.firstChild);
};
Group.prototype.getPath = function () {
var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
path.unshift(this.key);
if (this.parent) {
this.parent.getPath(path);
}
return path;
};
////////////// Standard Row Functions //////////////
Group.prototype.getElement = function () {
this.addBindingsd = false;
this._visSet();
if (this.visible) {
this.element.classList.add("tabulator-group-visible");
} else {
this.element.classList.remove("tabulator-group-visible");
}
for (var i = 0; i < this.element.childNodes.length; ++i) {
this.element.childNodes[i].parentNode.removeChild(this.element.childNodes[i]);
}
this.generateGroupHeaderContents();
// this.addBindings();
return this.element;
};
Group.prototype.detachElement = function () {
if (this.element && this.element.parentNode) {
this.element.parentNode.removeChild(this.element);
}
};
//normalize the height of elements in the row
Group.prototype.normalizeHeight = function () {
this.setHeight(this.element.clientHeight);
};
Group.prototype.initialize = function (force) {
if (!this.initialized || force) {
this.normalizeHeight();
this.initialized = true;
}
};
Group.prototype.reinitialize = function () {
this.initialized = false;
this.height = 0;
if (Tabulator.prototype.helpers.elVisible(this.element)) {
this.initialize(true);
}
};
Group.prototype.setHeight = function (height) {
if (this.height != height) {
this.height = height;
this.outerHeight = this.element.offsetHeight;
}
};
//return rows outer height
Group.prototype.getHeight = function () {
return this.outerHeight;
};
Group.prototype.getGroup = function () {
return this;
};
Group.prototype.reinitializeHeight = function () {};
Group.prototype.calcHeight = function () {};
Group.prototype.setCellHeight = function () {};
Group.prototype.clearCellHeight = function () {};
//////////////// Object Generation /////////////////
Group.prototype.getComponent = function () {
if (!this.component) {
this.component = new GroupComponent(this);
}
return this.component;
};
//////////////////////////////////////////////////
////////////// Group Row Extension ///////////////
//////////////////////////////////////////////////
var GroupRows = function GroupRows(table) {
this.table = table; //hold Tabulator object
this.groupIDLookups = false; //enable table grouping and set field to group by
this.startOpen = [function () {
return false;
}]; //starting state of group
this.headerGenerator = [function () {
return "";
}];
this.groupList = []; //ordered list of groups
this.allowedValues = false;
this.groups = {}; //hold row groups
this.displayIndex = 0; //index in display pipeline
};
//initialize group configuration
GroupRows.prototype.initialize = function () {
var self = this,
groupBy = self.table.options.groupBy,
startOpen = self.table.options.groupStartOpen,
groupHeader = self.table.options.groupHeader;
this.allowedValues = self.table.options.groupValues;
if (Array.isArray(groupBy) && Array.isArray(groupHeader) && groupBy.length > groupHeader.length) {
console.warn("Error creating group headers, groupHeader array is shorter than groupBy array");
}
self.headerGenerator = [function () {
return "";
}];
this.startOpen = [function () {
return false;
}]; //starting state of group
self.table.modules.localize.bind("groups|item", function (langValue, lang) {
self.headerGenerator[0] = function (value, count, data) {
//header layout function
return (typeof value === "undefined" ? "" : value) + "<span>(" + count + " " + (count === 1 ? langValue : lang.groups.items) + ")</span>";
};
});
this.groupIDLookups = [];
if (Array.isArray(groupBy) || groupBy) {
if (this.table.modExists("columnCalcs") && this.table.options.columnCalcs != "table" && this.table.options.columnCalcs != "both") {
this.table.modules.columnCalcs.removeCalcs();
}
} else {
if (this.table.modExists("columnCalcs") && this.table.options.columnCalcs != "group") {
var cols = this.table.columnManager.getRealColumns();
cols.forEach(function (col) {
if (col.definition.topCalc) {
self.table.modules.columnCalcs.initializeTopRow();
}
if (col.definition.bottomCalc) {
self.table.modules.columnCalcs.initializeBottomRow();
}
});
}
}
if (!Array.isArray(groupBy)) {
groupBy = [groupBy];
}
groupBy.forEach(function (group, i) {
var lookupFunc, column;
if (typeof group == "function") {
lookupFunc = group;
} else {
column = self.table.columnManager.getColumnByField(group);
if (column) {
lookupFunc = function lookupFunc(data) {
return column.getFieldValue(data);
};
} else {
lookupFunc = function lookupFunc(data) {
return data[group];
};
}
}
self.groupIDLookups.push({
field: typeof group === "function" ? false : group,
func: lookupFunc,
values: self.allowedValues ? self.allowedValues[i] : false
});
});
if (startOpen) {
if (!Array.isArray(startOpen)) {
startOpen = [startOpen];
}
startOpen.forEach(function (level) {
level = typeof level == "function" ? level : function () {
return true;
};
});
self.startOpen = startOpen;
}
if (groupHeader) {
self.headerGenerator = Array.isArray(groupHeader) ? groupHeader : [groupHeader];
}
this.initialized = true;
};
GroupRows.prototype.setDisplayIndex = function (index) {
this.displayIndex = index;
};
GroupRows.prototype.getDisplayIndex = function () {
return this.displayIndex;
};
//return appropriate rows with group headers
GroupRows.prototype.getRows = function (rows) {
if (this.groupIDLookups.length) {
this.table.options.dataGrouping.call(this.table);
this.generateGroups(rows);
if (this.table.options.dataGrouped) {
this.table.options.dataGrouped.call(this.table, this.getGroups(true));
}
return this.updateGroupRows();
} else {
return rows.slice(0);
}
};
GroupRows.prototype.getGroups = function (compoment) {
var groupComponents = [];
this.groupList.forEach(function (group) {
groupComponents.push(compoment ? group.getComponent() : group);
});
return groupComponents;
};
GroupRows.prototype.getChildGroups = function (group) {
var _this2 = this;
var groupComponents = [];
if (!group) {
group = this;
}
group.groupList.forEach(function (child) {
if (child.groupList.length) {
groupComponents = groupComponents.concat(_this2.getChildGroups(child));
} else {
groupComponents.push(child);
}
});
return groupComponents;
};
GroupRows.prototype.wipe = function () {
this.groupList.forEach(function (group) {
group.wipe();
});
};
GroupRows.prototype.pullGroupListData = function (groupList) {
var self = this;
var groupListData = [];
groupList.forEach(function (group) {
var groupHeader = {};
groupHeader.level = 0;
groupHeader.rowCount = 0;
groupHeader.headerContent = "";
var childData = [];
if (group.hasSubGroups) {
childData = self.pullGroupListData(group.groupList);
groupHeader.level = group.level;
groupHeader.rowCount = childData.length - group.groupList.length; // data length minus number of sub-headers
groupHeader.headerContent = group.generator(group.key, groupHeader.rowCount, group.rows, group);
groupListData.push(groupHeader);
groupListData = groupListData.concat(childData);
} else {
groupHeader.level = group.level;
groupHeader.headerContent = group.generator(group.key, group.rows.length, group.rows, group);
groupHeader.rowCount = group.getRows().length;
groupListData.push(groupHeader);
group.getRows().forEach(function (row) {
groupListData.push(row.getData("data"));
});
}
});
return groupListData;
};
GroupRows.prototype.getGroupedData = function () {
return this.pullGroupListData(this.groupList);
};
GroupRows.prototype.getRowGroup = function (row) {
var match = false;
this.groupList.forEach(function (group) {
var result = group.getRowGroup(row);
if (result) {
match = result;
}
});
return match;
};
GroupRows.prototype.countGroups = function () {
return this.groupList.length;
};
GroupRows.prototype.generateGroups = function (rows) {
var self = this,
oldGroups = self.groups;
self.groups = {};
self.groupList = [];
if (this.allowedValues && this.allowedValues[0]) {
this.allowedValues[0].forEach(function (value) {
self.createGroup(value, 0, oldGroups);
});
rows.forEach(function (row) {
self.assignRowToExistingGroup(row, oldGroups);
});
} else {
rows.forEach(function (row) {
self.assignRowToGroup(row, oldGroups);
});
}
};
GroupRows.prototype.createGroup = function (groupID, level, oldGroups) {
var groupKey = level + "_" + groupID,
group;
oldGroups = oldGroups || [];
group = new Group(this, false, level, groupID, this.groupIDLookups[0].field, this.headerGenerator[0], oldGroups[groupKey]);
this.groups[groupKey] = group;
this.groupList.push(group);
};
// GroupRows.prototype.assignRowToGroup = function(row, oldGroups){
// var groupID = this.groupIDLookups[0].func(row.getData()),
// groupKey = "0_" + groupID;
// if(!this.groups[groupKey]){
// this.createGroup(groupID, 0, oldGroups);
// }
// this.groups[groupKey].addRow(row);
// };
GroupRows.prototype.assignRowToExistingGroup = function (row, oldGroups) {
var groupID = this.groupIDLookups[0].func(row.getData()),
groupKey = "0_" + groupID;
if (this.groups[groupKey]) {
this.groups[groupKey].addRow(row);
}
};
GroupRows.prototype.assignRowToGroup = function (row, oldGroups) {
var groupID = this.groupIDLookups[0].func(row.getData()),
newGroupNeeded = !this.groups["0_" + groupID];
if (newGroupNeeded) {
this.createGroup(groupID, 0, oldGroups);
}
this.groups["0_" + groupID].addRow(row);
return !newGroupNeeded;
};
GroupRows.prototype.reassignRowToGroup = function (row) {
var oldRowGroup = row.getGroup(),
oldGroupPath = oldRowGroup.getPath(),
newGroupPath = this.getExpectedPath(row),
samePath = true;
// figure out if new group path is the same as old group path
var samePath = oldGroupPath.length == newGroupPath.length && oldGroupPath.every(function (element, index) {
return element === newGroupPath[index];
});
// refresh if they new path and old path aren't the same (aka the row's groupings have changed)
if (!samePath) {
oldRowGroup.removeRow(row);
this.assignRowToGroup(row, self.groups);
this.table.rowManager.refreshActiveData("group", false, true);
}
};
GroupRows.prototype.getExpectedPath = function (row) {
var groupPath = [],
rowData = row.getData();
this.groupIDLookups.forEach(function (groupId) {
groupPath.push(groupId.func(rowData));
});
return groupPath;
};
GroupRows.prototype.updateGroupRows = function (force) {
var self = this,
output = [],
oldRowCount;
self.groupList.forEach(function (group) {
output = output.concat(group.getHeadersAndRows());
});
//force update of table display
if (force) {
var displayIndex = self.table.rowManager.setDisplayRows(output, this.getDisplayIndex());
if (displayIndex !== true) {
this.setDisplayIndex(displayIndex);
}
self.table.rowManager.refreshActiveData("group", true, true);
}
return output;
};
GroupRows.prototype.scrollHeaders = function (left) {
if (this.table.options.virtualDomHoz) {
left -= this.table.vdomHoz.vDomPadLeft;
}
left = left + "px";
this.groupList.forEach(function (group) {
group.scrollHeader(left);
});
};
GroupRows.prototype.removeGroup = function (group) {
var groupKey = group.level + "_" + group.key,
index;
if (this.groups[groupKey]) {
delete this.groups[groupKey];
index = this.groupList.indexOf(group);
if (index > -1) {
this.groupList.splice(index, 1);
}
}
};
Tabulator.prototype.registerModule("groupRows", GroupRows);