function Chart() {
var attrs = {
svgWidth: 400,
svgHeight: 400,
marginTop: 5,
marginBottom: 5,
marginRight: 5,
marginLeft: 5,
container: "body",
defaultTextFill: "#2C3E50",
defaultFont: "Helvetica",
data: null
};
var main = function () {
var container = d3.select(attrs.container);
var calc = {
id: null,
chartTopMargin: null,
chartLeftMargin: null,
chartWidth: null,
chartHeight: null
};
calc.chartLeftMargin = attrs.marginLeft;
calc.chartTopMargin = attrs.marginTop;
calc.chartWidth = attrs.svgWidth - attrs.marginRight - calc.chartLeftMargin;
calc.chartHeight =
attrs.svgHeight - attrs.marginBottom - calc.chartTopMargin;
var svg = container
._add({ tag: "svg", className: "svg-chart-container" })
.attr("width", attrs.svgWidth)
.attr("height", attrs.svgHeight)
.attr("font-family", attrs.defaultFont);
var chart = svg
._add({ tag: "g", className: "chart" })
.attr(
"transform",
"translate(" + calc.chartLeftMargin + "," + calc.chartTopMargin + ")"
);
chart
._add({
tag: "text",
className: "example-text",
data: [attrs.data.message]
})
.text((d) => d)
.attr("x", 10)
.attr("y", 20);
chart
._add({
tag: "circle",
className: "single-circle"
})
.attr("r", 30)
.attr("fill", "blue")
.attr("cx", 100)
.attr("cy", 100);
chart
._add({
tag: "circle",
className: "multi-circle",
data: [10, 15, 20, 25]
})
.attr("r", (d) => d)
.attr("fill", "red")
.attr("cx", (d, i) => i * 40 + 100)
.attr("cy", 150);
};
d3.selection.prototype._add = function ({ className, tag, data }) {
var container = this;
var localData = data || [selector];
var selector = className || selector + "-element";
let selection = container
.selectAll("." + selector)
.data(localData, (d, i) => {
if (typeof d === "object") {
return d.id || d.key || i;
}
return i;
});
selection.exit().remove();
selection = selection.enter().append(tag).merge(selection);
selection.attr("class", className);
return selection;
};
main["render"] = function () {
main();
return main;
};
main["container"] = function (container) {
attrs.container = container;
return main;
};
main["data"] = function (data) {
attrs.data = data;
return main;
};
return main;
}