pivot-chart
Version:
pivot table react component
144 lines • 6.13 kB
JavaScript
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spread = (this && this.__spread) || function () {
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
return ar;
};
var __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
import React, { useMemo, useEffect } from "react";
import deepcopy from "deepcopy";
import { useNestTree, transTree2LeafPathList, labelHighlightNode, clearHighlight } from "./utils";
import ExpandButton from "./components/expandButton";
import { StyledTable } from "./components/styledTable";
import { getTheme } from "./theme";
var theme = getTheme();
function dfs(tree, defaultExpandedDepth, depth) {
tree.expanded = depth < defaultExpandedDepth;
tree.isHighlight = false;
tree.path ? null : (tree.path = []);
tree.valuePath ? null : (tree.valuePath = []);
if (tree.children && tree.children.length > 0) {
tree.children.forEach(function (child, index) {
child.path = __spread((tree.path || []), [index]);
child.valuePath = __spread((tree.valuePath || []), [index]);
dfs(child, defaultExpandedDepth, depth + 1);
});
}
}
function tree2renderTree(tree, defaultExpandedDepth) {
var renderTree = deepcopy(tree);
dfs(renderTree, defaultExpandedDepth, 0);
return renderTree;
}
function getExpandedChildSize(tree) {
var e_1, _a;
// todo: cache
var size = 1;
if (tree.expanded && tree.children && tree.children.length > 0) {
try {
for (var _b = __values(tree.children), _c = _b.next(); !_c.done; _c = _b.next()) {
var child = _c.value;
size += getExpandedChildSize(child);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
}
return size;
}
function dfsRender(tree, leftRowNumber, rows, showAggregatedNode, callback) {
var e_2, _a;
if (tree.expanded && tree.children && tree.children.length > 0) {
rows.push(React.createElement("tr", { key: tree.path.join("-") + "-" + tree.id },
React.createElement("th", { className: tree.isHighlight ? "highlight" : undefined, rowSpan: getExpandedChildSize(tree), onClick: function () {
callback(tree.path);
} },
React.createElement(ExpandButton, { type: tree.expanded ? "minus" : "plus" }),
"\u00A0",
tree.id),
showAggregatedNode && (React.createElement("th", { colSpan: leftRowNumber },
tree.id,
theme.summary.label))));
try {
for (var _b = __values(tree.children), _c = _b.next(); !_c.done; _c = _b.next()) {
var child = _c.value;
dfsRender(child, leftRowNumber - 1, rows, showAggregatedNode, callback);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_2) throw e_2.error; }
}
}
else {
rows.push(React.createElement("tr", { key: tree.path.join("-") + "-" + tree.id },
React.createElement("th", { className: tree.isHighlight ? "highlight" : undefined, colSpan: leftRowNumber + 1, onClick: function () {
callback(tree.path);
} },
tree.children && tree.children.length > 0 && (React.createElement(ExpandButton, { type: tree.expanded ? "minus" : "plus" })),
"\u00A0",
tree.id)));
}
}
var LeftNestGrid = function (props) {
var data = props.data, depth = props.depth, onExpandChange = props.onExpandChange, visType = props.visType, defaultExpandedDepth = props.defaultExpandedDepth, showAggregatedNode = props.showAggregatedNode, _a = props.highlightPathList, highlightPathList = _a === void 0 ? [] : _a;
var _b = useNestTree(), nestTree = _b.nestTree, setNestTree = _b.setNestTree, repaint = _b.repaint;
useEffect(function () {
var newTree = tree2renderTree(data, defaultExpandedDepth);
setNestTree(newTree);
}, [data, defaultExpandedDepth]);
useEffect(function () {
if (onExpandChange) {
var lpList = transTree2LeafPathList(nestTree, showAggregatedNode);
onExpandChange(lpList, nestTree);
}
}, [nestTree, showAggregatedNode]);
var renderTree = useMemo(function () {
var ans = [];
if (nestTree) {
clearHighlight(nestTree);
highlightPathList.forEach(function (path) {
labelHighlightNode(nestTree, [], path, 0);
});
dfsRender(nestTree, depth, ans, showAggregatedNode, repaint);
}
return ans;
}, [nestTree, repaint, showAggregatedNode, highlightPathList]);
return (React.createElement("div", null,
React.createElement(StyledTable, null,
React.createElement("thead", { className: visType === "number" ? undefined : "vis" }, renderTree))));
};
export default LeftNestGrid;
//# sourceMappingURL=leftNestGrid.js.map