cl-react-graph
Version:
67 lines (59 loc) • 1.85 kB
text/typescript
import {
select,
Selection,
} from 'd3-selection';
import { IMargin } from '../legacy/types';
export type TSelection = Selection<any, any, any, any>;
export type TTextSelection = Selection<SVGTextElement, any, any, any>;
interface ISizeProps {
margin: IMargin;
width: number | string;
height: number | string;
className: string;
}
export const makeSvg = (el: Element, svg: TSelection | undefined, svgId?: string): TSelection => {
if (svg) {
svg.selectAll('svg > *').remove();
svg.remove();
const childNodes = el.getElementsByTagName('svg');
if (childNodes.length > 0) {
el.removeChild(childNodes[0]);
}
}
// Reference to svg element containing chart
svg = select(el).append('svg');
// If svg id passed in (for download target) then assign it
if (svgId) {
svg.attr('id', svgId);
}
return svg;
}
export const sizeSVG = (svg: TSelection | undefined, props: ISizeProps) => {
if (!svg) {
return;
}
const { margin, width, height, className } = props;
svg.attr('class', className)
.attr('width', width)
.attr('height', height)
.attr('viewBox', `0 0 ${width} ${height}`)
.append('g')
.attr('transform', `translate(${margin.left},${margin.top})`);
};
export const makeGrid = (svg: TSelection): [TSelection, TSelection] => {
const gridX = svg.append('g')
.attr('class', 'grid gridX');
const gridY = svg.append('g')
.attr('class', 'grid gridY');
return [gridX, gridY];
}
export const makeScales = (svg: TSelection): [TSelection, TSelection, TSelection, TSelection, TSelection, TSelection] => {
return [
svg.append('g').attr('class', 'x-axis'),
svg.append('g').attr('class', 'y-axis'),
svg.append('g'),
svg.append('g'),
svg.append('g').attr('class', 'x-axis-bottom'),
svg.append('g').attr('class', 'y-axis-left'),
];
};