billboard.js
Version:
Re-usable easy interface JavaScript chart library, based on D3 v4+
159 lines (158 loc) • 4.93 kB
JavaScript
/*!
* Copyright (c) 2017 ~ present NAVER Corp.
* billboard.js project is licensed under the MIT license
*
* billboard.js, JavaScript chart library
* https://naver.github.io/billboard.js/
*
* @version 4.1.1
*/
import { endall } from "../../module/util/object.js";
import { $LEGEND } from "../../config/classes.js";
import { KEY } from "../../module/Cache.js";
//#region src/ChartInternal/data/load.ts
/**
* Copyright (c) 2017 ~ present NAVER Corp.
* billboard.js project is licensed under the MIT license
*/
/**
* Call done callback with resize after transition
* @param {function} fn Callback function
* @param {boolean} resizeAfter Weather to resize chart after the load
* @private
*/
function callDone(fn, resizeAfter = false) {
const $$ = this;
const { api } = $$;
resizeAfter && $$.api.flush(true);
fn?.call(api);
}
var load_default = {
load(rawTargets, args) {
const $$ = this;
const { axis, data, org, scale } = $$;
const { append } = args;
const zoomState = {
domain: null,
currentDomain: null,
x: null
};
let targets = rawTargets;
if (targets) {
if (args.filter) targets = targets.filter(args.filter);
if (args.type || args.types) targets.forEach((t) => {
$$.setTargetType(t.id, args.types?.[t.id] || args.type);
});
const incoming = new Map(targets.map((t) => [t.id, t]));
data.targets.forEach((d) => {
const t = incoming.get(d.id);
if (t) {
if (append) {
const values = t.values;
for (let j = 0; j < values.length; j++) d.values.push(values[j]);
} else d.values = t.values;
incoming.delete(d.id);
}
});
incoming.forEach((t) => data.targets.push(t));
}
if ($$.state.isCanvasMode) {
$$.redraw({
withUpdateOrgXDomain: true,
withUpdateXDomain: true,
withLegend: true
});
$$.updateTypesElements();
callDone.call($$, args.done, args.resizeAfter);
return;
}
$$.updateTargets(data.targets);
if (scale.zoom) {
zoomState.x = axis.isCategorized() ? scale.x.orgScale() : (org.xScale || scale.x).copy();
zoomState.domain = $$.getXDomain(data.targets);
zoomState.x.domain(zoomState.domain);
zoomState.currentDomain = $$.zoom.getDomain();
if (!$$.withinRange(zoomState.currentDomain, void 0, zoomState.domain)) {
scale.x.domain(zoomState.domain);
scale.zoom = null;
$$.$el.eventRect.property("__zoom", null);
}
}
$$.redraw({
withUpdateOrgXDomain: true,
withUpdateXDomain: true,
withLegend: true
});
if (scale.zoom) {
org.xDomain = zoomState.domain;
org.xScale = zoomState.x;
if (axis.isCategorized()) {
zoomState.currentDomain = $$.getZoomDomainValue(zoomState.currentDomain);
org.xDomain = $$.getZoomDomainValue(org.xDomain);
org.xScale = zoomState.x.domain(org.xDomain);
}
$$.updateCurrentZoomTransform(zoomState.x, zoomState.currentDomain);
} else if (org.xScale) org.xScale.domain(org.xDomain);
$$.updateTypesElements();
callDone.call($$, args.done, args.resizeAfter);
},
loadFromArgs(args) {
const $$ = this;
if (!$$.config) return;
$$.cache.reset(false, [
KEY.filteredTargets,
KEY.maxDataCountTarget,
KEY.valuesXIndexMap,
KEY.maxTickSize
]);
$$.convertData(args, (d) => {
const data = args.data || d;
args.append && (data.__append__ = true);
data && $$.load($$.convertDataToTargets.call($$, data), args);
});
},
unload(rawTargetIds, customDoneCb) {
const $$ = this;
const { state, $el, $T } = $$;
const hasLegendDefsPoint = !!$$.hasLegendDefsPoint?.();
let done = customDoneCb;
let targetIds = rawTargetIds;
$$.cache.reset(false, [
KEY.filteredTargets,
KEY.maxDataCountTarget,
KEY.valuesXIndexMap,
KEY.maxTickSize
]);
if (!done) done = () => {};
targetIds = targetIds.filter((id) => $$.hasTarget($$.data.targets, id));
if (targetIds.length === 0) {
done();
return;
}
const unloadIds = new Set(targetIds);
if (state.isCanvasMode) {
targetIds.forEach((id) => {
state.withoutFadeIn[id] = false;
});
$$.data.targets = $$.data.targets.filter((t) => !unloadIds.has(t.id));
$$.removeHiddenTargetIds(targetIds);
$$.removeHiddenLegendIds(targetIds);
$$.updateTypesElements();
done();
return;
}
targetIds.forEach((id) => {
const suffixId = $$.getTargetSelectorSuffix(id);
state.withoutFadeIn[id] = false;
if ($el.legend) $el.legend.selectAll(`.${$LEGEND.legendItem}${suffixId}`).remove();
hasLegendDefsPoint && $el.defs?.select(`#${$$.getDefsPointId(suffixId)}`).remove();
});
$$.data.targets = $$.data.targets.filter((t) => !unloadIds.has(t.id));
state.hasFunnel && $$.updateFunnel($$.data.targets);
state.hasTreemap && $$.updateTargetsForTreemap($$.data.targets);
$$.updateTypesElements();
$T($el.svg.selectAll(targetIds.map((id) => $$.selectorTarget(id)))).style("opacity", "0").remove().call(endall, done);
}
};
//#endregion
export { callDone, load_default as default };