class Chart {
constructor() {
this.state = {
svgWidth: 400,
svgHeight: 400,
marginTop: 5,
marginBottom: 5,
marginRight: 5,
marginLeft: 5,
container: d3.select("body")
};
}
container(newContainer) {
this.state.container = d3.select(newContainer);
return this;
}
svgWidth(newSvgWidth) {
this.state.svgWidth = newSvgWidth;
return this;
}
data(newData) {
this.state.data = newData;
return this;
}
render() {
this.calculateProperties();
this.drawSvg();
this.drawContent();
return this;
}
drawContent() {
const { chart, data } = this.state;
chart
.selectAll(".example-text")
.data([data])
.join("text")
.attr("class", "example-text")
.text((d) => d.message)
.attr("x", 10)
.attr("y", 20);
}
drawSvg() {
const {
container,
svgWidth,
svgHeight,
defaultFont,
calc,
data
} = this.state;
const svg = container
.selectAll(".svg-chart-container")
.data(["svg"])
.join("svg")
.attr("class", "svg-chart-container")
.attr("width", svgWidth)
.attr("height", svgHeight)
.attr("font-family", defaultFont);
const chart = svg
.selectAll(".chart")
.data(["chart"])
.join("g")
.attr("class", "chart")
.attr(
"transform",
"translate(" + calc.chartLeftMargin + "," + calc.chartTopMargin + ")"
);
this.state = { ...this.state, chart, svg };
}
calculateProperties() {
const state = this.state;
var calc = {
chartTopMargin: null,
chartLeftMargin: null,
chartWidth: null,
chartHeight: null
};
calc.chartLeftMargin = state.marginLeft;
calc.chartTopMargin = state.marginTop;
calc.chartWidth = state.svgWidth - state.marginRight - calc.chartLeftMargin;
calc.chartHeight =
state.svgHeight - state.marginBottom - calc.chartTopMargin;
this.state = { ...this.state, calc };
}
}