@toast-ui/chart
Version:
TOAST UI Application: Chart
94 lines (93 loc) • 3.17 kB
JavaScript
import { isNull, isUndefined, last } from "../helpers/utils";
const TREEMAP_ID_PREFIX = '__TOAST_UI_TREEMAP';
export const TREEMAP_ROOT_ID = `${TREEMAP_ID_PREFIX}_ROOT`;
function makeTreeModel(series, indexes, depth, parentId) {
var _a;
const idx = last(indexes);
const id = parentId ? `${parentId}_${idx}` : `${TREEMAP_ID_PREFIX}_${idx}`;
const { colorValue } = series;
const models = [
{
label: series.label,
hasChild: !!series.children,
id,
indexes,
parentId: parentId ? parentId : TREEMAP_ROOT_ID,
depth,
data: (_a = series.data, (_a !== null && _a !== void 0 ? _a : 0)),
colorValue,
},
];
if (series.children) {
series.children.forEach((child, childIdx) => {
if (!isNull(child.data)) {
models.push(...makeTreeModel(child, [...indexes, childIdx], depth + 1, id));
}
});
}
return models;
}
function setParentSeriesData(treemapSeries) {
treemapSeries.forEach(({ parentId, data }) => {
if (parentId !== TREEMAP_ROOT_ID) {
treemapSeries.find(({ id }) => id === parentId).data += data;
}
});
}
function setParentColorValue(treemapSeries) {
treemapSeries.forEach((datum) => {
const { id, colorValue } = datum;
if (isUndefined(colorValue)) {
const series = treemapSeries.filter(({ parentId }) => parentId === id);
const totalColorValue = series.reduce((acc, cur) => {
return acc + (isUndefined(cur.colorValue) ? 0 : cur.colorValue);
}, 0);
datum.colorValue = totalColorValue / series.length;
}
});
}
function setRatio(treemapSeries) {
const rootTotal = treemapSeries
.filter(({ parentId }) => parentId === TREEMAP_ROOT_ID)
.reduce((acc, { data }) => acc + data, 0);
treemapSeries.forEach((series) => {
const total = series.parentId === TREEMAP_ROOT_ID
? rootTotal
: treemapSeries.find(({ id }) => id === series.parentId).data;
series.ratio = series.data / total;
});
}
function makeTreemapSeries(series, options) {
var _a;
if (!series.treemap) {
return [];
}
const treemapSeries = series.treemap.data
.filter((datum) => !isNull(datum.data))
.map((datum, idx) => makeTreeModel(datum, [idx], 0))
.flatMap((s) => s)
.sort((a, b) => b.depth - a.depth);
setParentSeriesData(treemapSeries);
setRatio(treemapSeries);
if ((_a = options.series) === null || _a === void 0 ? void 0 : _a.useColorValue) {
setParentColorValue(treemapSeries);
}
return treemapSeries;
}
const treemapSeriesData = {
name: 'treemapSeriesData',
state: () => ({
treemapSeries: [],
}),
action: {
setTreemapSeriesData({ state }) {
state.treemapSeries = makeTreemapSeries(state.series, state.options);
},
},
observe: {
updateTreemapSeriesData() {
this.dispatch('setTreemapSeriesData');
},
},
};
export default treemapSeriesData;