squarified
Version:
squarified tree map
83 lines (80 loc) • 3.17 kB
JavaScript
import { l as logger, m as mixin, E as Event, a as assertExists, b as bindParentForModule, C as Component, D as DOMEvent } from './dom-event-DrYYfglv.mjs';
export { G as DefaultMap, x as applyCanvasTransform, c as c2m, w as createCanvasElement, r as createRoundBlock, t as createTitleText, h as definePlugin, f as findRelativeNode, d as findRelativeNodeById, e as flattenModule, g as getNodeDepth, o as hashCode, i as isClickEvent, j as isContextMenuEvent, k as isMouseEvent, F as isScrollWheelOrRightButtonOnMouseupAndDown, n as isWheelEvent, q as noop, p as perferNumeric, u as raf, B as smoothFrame, s as sortChildrenByKey, z as stackMatrixTransform, A as stackMatrixTransformWithGraphAndLayer, y as typedForIn, v as visit } from './dom-event-DrYYfglv.mjs';
function createTreemap(// @ts-expect-error todo fix
options) {
const { plugins = [], graphic = {} } = options || {};
let root = null;
let installed = false;
let domEvent = null;
let component = null;
const exposedEvent = new Event();
if (!Array.isArray(plugins)) {
logger.panic('Plugins should be an array');
}
const ctx = {
init,
dispose,
resize,
setOptions
};
function init(el) {
component = new Component(graphic, el);
domEvent = new DOMEvent(component);
root = el;
root.style.position = 'relative';
if (!installed) {
plugins.forEach((plugin)=>component?.pluginDriver.use(plugin));
installed = true;
component.pluginDriver.runHook('onLoad', ctx, domEvent);
}
domEvent.on('__exposed__', (type, args)=>exposedEvent.emit(type, args));
}
function dispose() {
if (root && component && domEvent) {
domEvent.destory();
component.destory();
root.removeChild(root.firstChild);
for(const evt in exposedEvent.eventCollections){
exposedEvent.off(evt);
}
component.pluginDriver.runHook('onDispose');
root = null;
component = null;
domEvent = null;
}
}
function resize() {
if (!component || !root) {
return;
}
const { width, height } = root.getBoundingClientRect();
component.render.initOptions({
height,
width,
devicePixelRatio: window.devicePixelRatio
});
component.render.canvas.style.position = 'absolute';
if (domEvent) {
component.pluginDriver.runHook('onResize', domEvent);
}
component.cleanup();
component.draw();
}
function setOptions(options) {
assertExists(component, logger, 'Treemap not initialized. Please call `init()` before setOptions.');
component.data = bindParentForModule(options.data);
resize();
}
const base = mixin(ctx, [
{
name: 'on',
fn: ()=>exposedEvent.on.bind(exposedEvent)
},
{
name: 'off',
fn: ()=>exposedEvent.off.bind(exposedEvent)
}
]);
return base;
}
export { createTreemap, mixin };