undoing changes to draw file.

This commit is contained in:
Kaleb White 2021-11-12 18:58:41 -08:00
parent 539bc50883
commit a5a5fc051b
3 changed files with 560 additions and 633 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,4 @@
import {
getBarHeightAndYAttr,
truncateString,
shortenLargeNumber,
getSplineCurvePointsStr
} from './draw-utils';
import { getBarHeightAndYAttr, truncateString, shortenLargeNumber, getSplineCurvePointsStr } from './draw-utils';
import { getStringWidth, isValidNumber } from './helpers';
import { DOT_OVERLAY_SIZE_INCR, PERCENTAGE_BAR_DEFAULT_DEPTH } from './constants';
import { lightenDarkenColor } from './colors';
@ -16,32 +11,32 @@ const BASE_LINE_COLOR = '#dadada';
const FONT_FILL = '#555b51';
function $(expr, con) {
return typeof expr === 'string' ? (con || document).querySelector(expr) : expr || null;
return typeof expr === "string"? (con || document).querySelector(expr) : expr || null;
}
export function createSVG(tag, o) {
var element = document.createElementNS('http://www.w3.org/2000/svg', tag);
var element = document.createElementNS("http://www.w3.org/2000/svg", tag);
for (var i in o) {
var val = o[i];
if (i === 'inside') {
if (i === "inside") {
$(val).appendChild(element);
} else if (i === 'around') {
}
else if (i === "around") {
var ref = $(val);
ref.parentNode.insertBefore(element, ref);
element.appendChild(ref);
} else if (i === 'styles') {
if (typeof val === 'object') {
Object.keys(val).map((prop) => {
} else if (i === "styles") {
if(typeof val === "object") {
Object.keys(val).map(prop => {
element.style[prop] = val[prop];
});
}
} else {
if (i === 'className') {
i = 'class';
}
if (i === 'innerHTML') {
if(i === "className") { i = "class"; }
if(i === "innerHTML") {
element['textContent'] = val;
} else {
element.setAttribute(i, val);
@ -65,9 +60,9 @@ function renderVerticalGradient(svgDefElem, gradientId) {
function setGradientStop(gradElem, offset, color, opacity) {
return createSVG('stop', {
inside: gradElem,
style: `stop-color: ${color}`,
offset: offset,
'inside': gradElem,
'style': `stop-color: ${color}`,
'offset': offset,
'stop-opacity': opacity
});
}
@ -83,7 +78,7 @@ export function makeSVGContainer(parent, className, width, height) {
export function makeSVGDefs(svgContainer) {
return createSVG('defs', {
inside: svgContainer
inside: svgContainer,
});
}
@ -100,17 +95,11 @@ export function wrapInSVGGroup(elements, className = '') {
let g = createSVG('g', {
className: className
});
elements.forEach((e) => g.appendChild(e));
elements.forEach(e => g.appendChild(e));
return g;
}
export function makePath(
pathStr,
className = '',
stroke = 'none',
fill = 'none',
strokeWidth = 2
) {
export function makePath(pathStr, className='', stroke='none', fill='none', strokeWidth=2) {
return createSVG('path', {
className: className,
d: pathStr,
@ -122,14 +111,7 @@ export function makePath(
});
}
export function makeArcPathStr(
startPosition,
endPosition,
center,
radius,
clockWise = 1,
largeArc = 0
) {
export function makeArcPathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){
let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];
let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];
return `M${center.x} ${center.y}
@ -138,20 +120,9 @@ export function makeArcPathStr(
${arcEndX} ${arcEndY} z`;
}
export function makeCircleStr(
startPosition,
endPosition,
center,
radius,
clockWise = 1,
largeArc = 0
) {
export function makeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){
let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];
let [arcEndX, midArc, arcEndY] = [
center.x + endPosition.x,
center.y * 2,
center.y + endPosition.y
];
let [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, center.y * 2, center.y + endPosition.y];
return `M${center.x} ${center.y}
L${arcStartX} ${arcStartY}
A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}
@ -161,14 +132,7 @@ export function makeCircleStr(
${arcEndX} ${arcEndY} z`;
}
export function makeArcStrokePathStr(
startPosition,
endPosition,
center,
radius,
clockWise = 1,
largeArc = 0
) {
export function makeArcStrokePathStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){
let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];
let [arcEndX, arcEndY] = [center.x + endPosition.x, center.y + endPosition.y];
@ -177,20 +141,9 @@ export function makeArcStrokePathStr(
${arcEndX} ${arcEndY}`;
}
export function makeStrokeCircleStr(
startPosition,
endPosition,
center,
radius,
clockWise = 1,
largeArc = 0
) {
export function makeStrokeCircleStr(startPosition, endPosition, center, radius, clockWise=1, largeArc=0){
let [arcStartX, arcStartY] = [center.x + startPosition.x, center.y + startPosition.y];
let [arcEndX, midArc, arcEndY] = [
center.x + endPosition.x,
radius * 2 + arcStartY,
center.y + startPosition.y
];
let [arcEndX, midArc, arcEndY] = [center.x + endPosition.x, radius * 2 + arcStartY, center.y + startPosition.y];
return `M${arcStartX} ${arcStartY}
A ${radius} ${radius} 0 ${largeArc} ${clockWise ? 1 : 0}
@ -201,29 +154,23 @@ export function makeStrokeCircleStr(
}
export function makeGradient(svgDefElem, color, lighter = false) {
let gradientId =
'path-fill-gradient' + '-' + color + '-' + (lighter ? 'lighter' : 'default');
let gradientId ='path-fill-gradient' + '-' + color + '-' +(lighter ? 'lighter' : 'default');
let gradientDef = renderVerticalGradient(svgDefElem, gradientId);
let opacities = [1, 0.6, 0.2];
if(lighter) {
opacities = [0.4, 0.2, 0];
}
setGradientStop(gradientDef, '0%', color, opacities[0]);
setGradientStop(gradientDef, '50%', color, opacities[1]);
setGradientStop(gradientDef, '100%', color, opacities[2]);
setGradientStop(gradientDef, "0%", color, opacities[0]);
setGradientStop(gradientDef, "50%", color, opacities[1]);
setGradientStop(gradientDef, "100%", color, opacities[2]);
return gradientId;
}
export function percentageBar(
x,
y,
width,
height,
depth = PERCENTAGE_BAR_DEFAULT_DEPTH,
fill = 'none'
) {
export function percentageBar(x, y, width, height,
depth=PERCENTAGE_BAR_DEFAULT_DEPTH, fill='none') {
let args = {
className: 'percentage-bar',
x: x,
@ -232,15 +179,15 @@ export function percentageBar(
height: height,
fill: fill,
styles: {
stroke: lightenDarkenColor(fill, -25),
'stroke': lightenDarkenColor(fill, -25),
// Diabolically good: https://stackoverflow.com/a/9000859
// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray
'stroke-dasharray': `0, ${height + width}, ${width}, ${height}`,
'stroke-width': depth
}
},
};
return createSVG('rect', args);
return createSVG("rect", args);
}
export function heatSquare(className, x, y, size, radius, fill='none', data={}) {
@ -254,11 +201,11 @@ export function heatSquare(className, x, y, size, radius, fill = 'none', data =
fill: fill
};
Object.keys(data).map((key) => {
Object.keys(data).map(key => {
args[key] = data[key];
});
return createSVG('rect', args);
return createSVG("rect", args);
}
export function legendBar(x, y, size, fill='none', label, truncate=false) {
@ -276,8 +223,8 @@ export function legendBar(x, y, size, fill = 'none', label, truncate = false) {
className: 'legend-dataset-text',
x: 0,
y: 0,
dy: FONT_SIZE * 2 + 'px',
'font-size': FONT_SIZE * 1.2 + 'px',
dy: (FONT_SIZE * 2) + 'px',
'font-size': (FONT_SIZE * 1.2) + 'px',
'text-anchor': 'start',
fill: FONT_FILL,
innerHTML: label
@ -286,7 +233,7 @@ export function legendBar(x, y, size, fill = 'none', label, truncate = false) {
let group = createSVG('g', {
transform: `translate(${x}, ${y})`
});
group.appendChild(createSVG('rect', args));
group.appendChild(createSVG("rect", args));
group.appendChild(text);
return group;
@ -306,9 +253,9 @@ export function legendDot(x, y, size, fill = 'none', label, truncate = false) {
className: 'legend-dataset-text',
x: 0,
y: 0,
dx: FONT_SIZE + 'px',
dy: FONT_SIZE / 3 + 'px',
'font-size': FONT_SIZE * 1.2 + 'px',
dx: (FONT_SIZE) + 'px',
dy: (FONT_SIZE/3) + 'px',
'font-size': (FONT_SIZE * 1.2) + 'px',
'text-anchor': 'start',
fill: FONT_FILL,
innerHTML: label
@ -317,7 +264,7 @@ export function legendDot(x, y, size, fill = 'none', label, truncate = false) {
let group = createSVG('g', {
transform: `translate(${x}, ${y})`
});
group.appendChild(createSVG('circle', args));
group.appendChild(createSVG("circle", args));
group.appendChild(text);
return group;
@ -325,7 +272,7 @@ export function legendDot(x, y, size, fill = 'none', label, truncate = false) {
export function makeText(className, x, y, content, options = {}) {
let fontSize = options.fontSize || FONT_SIZE;
let dy = options.dy !== undefined ? options.dy : fontSize / 2;
let dy = options.dy !== undefined ? options.dy : (fontSize / 2);
let fill = options.fill || FONT_FILL;
let textAnchor = options.textAnchor || 'start';
return createSVG('text', {
@ -359,7 +306,7 @@ function makeVertLine(x, label, y1, y2, options = {}) {
dy: FONT_SIZE + 'px',
'font-size': FONT_SIZE + 'px',
'text-anchor': 'middle',
innerHTML: label + ''
innerHTML: label + ""
});
let line = createSVG('g', {
@ -375,13 +322,10 @@ function makeVertLine(x, label, y1, y2, options = {}) {
function makeHoriLine(y, label, x1, x2, options={}) {
if(!options.stroke) options.stroke = BASE_LINE_COLOR;
if(!options.lineType) options.lineType = '';
if (!options.alignment) options.alignment = 'left';
if (options.shortenNumbers) label = shortenLargeNumber(label);
let className =
'line-horizontal ' +
options.className +
(options.lineType === 'dashed' ? 'dashed' : '');
let className = 'line-horizontal ' + options.className +
(options.lineType === "dashed" ? "dashed": "");
let l = createSVG('line', {
className: className,
@ -395,12 +339,12 @@ function makeHoriLine(y, label, x1, x2, options = {}) {
});
let text = createSVG('text', {
x: options.alignment === 'left' ? x1 - LABEL_MARGIN : x2 + LABEL_MARGIN * 4,
x: x1 < x2 ? x1 - LABEL_MARGIN : x1 + LABEL_MARGIN,
y: 0,
dy: FONT_SIZE / 2 - 2 + 'px',
dy: (FONT_SIZE / 2 - 2) + 'px',
'font-size': FONT_SIZE + 'px',
'text-anchor': x1 < x2 ? 'end' : 'start',
innerHTML: label + ''
innerHTML: label+""
});
let line = createSVG('g', {
@ -409,7 +353,7 @@ function makeHoriLine(y, label, x1, x2, options = {}) {
});
if(text === 0 || text === '0') {
line.style.stroke = 'rgba(27, 31, 35, 0.6)';
line.style.stroke = "rgba(27, 31, 35, 0.6)";
}
line.appendChild(l);
@ -459,16 +403,15 @@ export function yLine(y, label, width, options = {}) {
x2 = width;
}
let offset = options.pos === 'left' ? -1 * options.offset : options.offset;
// let offset = options.pos === 'left' ? -1 * options.offset : options.offset;
x1 += offset;
x2 += offset;
x1 += options.offset;
x2 += options.offset;
return makeHoriLine(y, label, x1, x2, {
stroke: options.stroke,
className: options.className,
lineType: options.lineType,
alignment: options.pos,
shortenNumbers: options.shortenNumbers
});
}
@ -511,19 +454,17 @@ export function xLine(x, label, height, options = {}) {
export function yMarker(y, label, width, options={}) {
if(!options.labelPos) options.labelPos = 'right';
let x =
options.labelPos === 'left'
? LABEL_MARGIN
let x = options.labelPos === 'left' ? LABEL_MARGIN
: width - getStringWidth(label, 5) - LABEL_MARGIN;
let labelSvg = createSVG('text', {
className: 'chart-label',
x: x,
y: 0,
dy: FONT_SIZE / -2 + 'px',
dy: (FONT_SIZE / -2) + 'px',
'font-size': FONT_SIZE + 'px',
'text-anchor': 'start',
innerHTML: label + ''
innerHTML: label+""
});
let line = makeHoriLine(y, '', 0, width, {
@ -556,19 +497,17 @@ export function yRegion(y1, y2, width, label, options = {}) {
});
if(!options.labelPos) options.labelPos = 'right';
let x =
options.labelPos === 'left'
? LABEL_MARGIN
: width - getStringWidth(label + '', 4.5) - LABEL_MARGIN;
let x = options.labelPos === 'left' ? LABEL_MARGIN
: width - getStringWidth(label+"", 4.5) - LABEL_MARGIN;
let labelSvg = createSVG('text', {
className: 'chart-label',
x: x,
y: 0,
dy: FONT_SIZE / -2 + 'px',
dy: (FONT_SIZE / -2) + 'px',
'font-size': FONT_SIZE + 'px',
'text-anchor': 'start',
innerHTML: label + ''
innerHTML: label+""
});
let region = createSVG('g', {
@ -581,16 +520,7 @@ export function yRegion(y1, y2, width, label, options = {}) {
return region;
}
export function datasetBar(
x,
yTop,
width,
color,
label = '',
index = 0,
offset = 0,
meta = {}
) {
export function datasetBar(x, yTop, width, color, label='', index=0, offset=0, meta={}) {
let [height, y] = getBarHeightAndYAttr(yTop, meta.zeroLine);
y -= offset;
@ -615,7 +545,7 @@ export function datasetBar(
height: height
});
label += '';
label += "";
if(!label && !label.length) {
return rect;
@ -626,7 +556,7 @@ export function datasetBar(
className: 'data-point-value',
x: width/2,
y: 0,
dy: (FONT_SIZE / 2) * -1 + 'px',
dy: (FONT_SIZE / 2 * -1) + 'px',
'font-size': FONT_SIZE + 'px',
'text-anchor': 'middle',
innerHTML: label
@ -652,7 +582,7 @@ export function datasetDot(x, y, radius, color, label = '', index = 0) {
r: radius
});
label += '';
label += "";
if(!label && !label.length) {
return dot;
@ -664,7 +594,7 @@ export function datasetDot(x, y, radius, color, label = '', index = 0) {
className: 'data-point-value',
x: 0,
y: 0,
dy: (FONT_SIZE / 2) * -1 - radius + 'px',
dy: (FONT_SIZE / 2 * -1 - radius) + 'px',
'font-size': FONT_SIZE + 'px',
'text-anchor': 'middle',
innerHTML: label
@ -682,13 +612,14 @@ export function datasetDot(x, y, radius, color, label = '', index = 0) {
}
export function getPaths(xList, yList, color, options={}, meta={}) {
let pointsList = yList.map((y, i) => xList[i] + ',' + y);
let pointsStr = pointsList.join('L');
let pointsList = yList.map((y, i) => (xList[i] + ',' + y));
let pointsStr = pointsList.join("L");
// Spline
if (options.spline) pointsStr = getSplineCurvePointsStr(xList, yList);
if (options.spline)
pointsStr = getSplineCurvePointsStr(xList, yList);
let path = makePath('M' + pointsStr, 'line-graph-path', color);
let path = makePath("M"+pointsStr, 'line-graph-path', color);
// HeatLine
if(options.heatline) {
@ -704,11 +635,7 @@ export function getPaths(xList, yList, color, options = {}, meta = {}) {
if(options.regionFill) {
let gradient_id_region = makeGradient(meta.svgDefs, color, true);
let pathStr =
'M' +
`${xList[0]},${meta.zeroLine}L` +
pointsStr +
`L${xList.slice(-1)[0]},${meta.zeroLine}`;
let pathStr = "M" + `${xList[0]},${meta.zeroLine}L` + pointsStr + `L${xList.slice(-1)[0]},${meta.zeroLine}`;
paths.region = makePath(pathStr, `region-fill`, 'none', `url(#${gradient_id_region})`);
}
@ -716,7 +643,7 @@ export function getPaths(xList, yList, color, options = {}, meta = {}) {
}
export let makeOverlay = {
bar: (unit) => {
'bar': (unit) => {
let transformValue;
if(unit.nodeName !== 'rect') {
transformValue = unit.getAttribute('transform');
@ -732,7 +659,7 @@ export let makeOverlay = {
return overlay;
},
dot: (unit) => {
'dot': (unit) => {
let transformValue;
if(unit.nodeName !== 'circle') {
transformValue = unit.getAttribute('transform');
@ -751,7 +678,7 @@ export let makeOverlay = {
return overlay;
},
heat_square: (unit) => {
'heat_square': (unit) => {
let transformValue;
if(unit.nodeName !== 'circle') {
transformValue = unit.getAttribute('transform');
@ -772,7 +699,7 @@ export let makeOverlay = {
};
export let updateOverlay = {
bar: (unit, overlay) => {
'bar': (unit, overlay) => {
let transformValue;
if(unit.nodeName !== 'rect') {
transformValue = unit.getAttribute('transform');
@ -780,8 +707,8 @@ export let updateOverlay = {
}
let attributes = ['x', 'y', 'width', 'height'];
Object.values(unit.attributes)
.filter((attr) => attributes.includes(attr.name) && attr.specified)
.map((attr) => {
.filter(attr => attributes.includes(attr.name) && attr.specified)
.map(attr => {
overlay.setAttribute(attr.name, attr.nodeValue);
});
@ -790,7 +717,7 @@ export let updateOverlay = {
}
},
dot: (unit, overlay) => {
'dot': (unit, overlay) => {
let transformValue;
if(unit.nodeName !== 'circle') {
transformValue = unit.getAttribute('transform');
@ -798,8 +725,8 @@ export let updateOverlay = {
}
let attributes = ['cx', 'cy'];
Object.values(unit.attributes)
.filter((attr) => attributes.includes(attr.name) && attr.specified)
.map((attr) => {
.filter(attr => attributes.includes(attr.name) && attr.specified)
.map(attr => {
overlay.setAttribute(attr.name, attr.nodeValue);
});
@ -808,7 +735,7 @@ export let updateOverlay = {
}
},
heat_square: (unit, overlay) => {
'heat_square': (unit, overlay) => {
let transformValue;
if(unit.nodeName !== 'circle') {
transformValue = unit.getAttribute('transform');
@ -816,13 +743,13 @@ export let updateOverlay = {
}
let attributes = ['cx', 'cy'];
Object.values(unit.attributes)
.filter((attr) => attributes.includes(attr.name) && attr.specified)
.map((attr) => {
.filter(attr => attributes.includes(attr.name) && attr.specified)
.map(attr => {
overlay.setAttribute(attr.name, attr.nodeValue);
});
if(transformValue) {
overlay.setAttribute('transform', transformValue);
}
}
},
};