From 300ef0a2ba9c9dccdd8f2dde9a8d6c73fe622456 Mon Sep 17 00:00:00 2001 From: Fabrizio Duroni Date: Fri, 22 Nov 2024 20:37:52 +0100 Subject: [PATCH 01/10] First raw implementation, but still need to move the legends sections. --- docs/radar.js | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/docs/radar.js b/docs/radar.js index 65f40a80..d9ada8c1 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -350,15 +350,58 @@ function radar_visualization(config) { .attr("transform", function(d, i) { return legend_transform(quadrant, ring, config.legend_column_width, i); }) .attr("class", "legend" + quadrant + ring) .attr("id", function(d, i) { return "legendItem" + d.id; }) - .text(function(d, i) { return d.id + ". " + d.label; }) + .text(function(d, i) { return d.id + ". " + d.label; }) // XXX .style("font-family", config.font_family) .style("font-size", "11px") .on("mouseover", function(d) { showBubble(d); highlightLegendItem(d); }) - .on("mouseout", function(d) { hideBubble(d); unhighlightLegendItem(d); }); + .on("mouseout", function(d) { hideBubble(d); unhighlightLegendItem(d); }) + .call(wrapText); } } } + // Define a function for wrapping text into multiple lines + function wrapText(text) { + var width = 120; // Set the width you want for wrapping + let previousElementHeight = 0; + let previousElementY = 0; + + text.each(function() { + var textElement = d3.select(this); + var words = textElement.text().split(" "); + var line = []; + + var lineY = parseFloat( + previousElementY + previousElementHeight // textElement.attr("y") + ); // Start from the initial Y position + + // Create an array of lines + textElement.text(null); // Remove the existing text + var tspan = textElement.append("tspan").attr("x", 0).attr("y", lineY).attr("dy", 0); + for (var i = 0; i < words.length; i++) { + line.push(words[i]); + tspan.text(line.join(" ")); + + // If the line is too wide, move to the next line + if (tspan.node().getComputedTextLength() > width) { + line.pop(); // Remove the word that caused the overflow + tspan.text(line.join(" ")); // Set the text for the previous line + line = [words[i]]; // Start a new line with the current word + + // Add a new tspan for the next line and increase the vertical offset + tspan = textElement.append("tspan") + .attr("x", 0) + .attr("dy", 10) // This ensures vertical space between lines + .text(words[i]); + } + } + + var bbox = textElement.node().getBBox(); + previousElementHeight = bbox.height; // Get the height of the current text element + previousElementY = bbox.y; + }); + } + // layer for entries var rink = radar.append("g") .attr("id", "rink"); From 33d3ca24a32b5dcb925be365eac939955cedc4ca Mon Sep 17 00:00:00 2001 From: Fabrizio Duroni Date: Fri, 22 Nov 2024 21:14:58 +0100 Subject: [PATCH 02/10] Added height calculation based on the previous legend item --- docs/radar.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/radar.js b/docs/radar.js index d9ada8c1..7bf8561c 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -272,12 +272,14 @@ function radar_visualization(config) { } } - function legend_transform(quadrant, ring, legendColumnWidth, index=null) { + function legend_transform(quadrant, ring, legendColumnWidth, index=null, previousHeight = null) { var dx = ring < 2 ? 0 : legendColumnWidth; var dy = (index == null ? -16 : index * 12); + if (ring % 2 === 1) { - dy = dy + 36 + segmented[quadrant][ring-1].length * 12; + dy = dy + 36 + previousHeight; } + return translate( config.legend_offset[quadrant].x + dx, config.legend_offset[quadrant].y + dy @@ -327,9 +329,13 @@ function radar_visualization(config) { .style("font-family", config.font_family) .style("font-size", "18px") .style("font-weight", "bold"); + let previosHeight = 0 for (var ring = 0; ring < 4; ring++) { + if (ring % 2 === 0) { + previosHeight = 0 + } legend.append("text") - .attr("transform", legend_transform(quadrant, ring, config.legend_column_width)) + .attr("transform", legend_transform(quadrant, ring, config.legend_column_width, null, previosHeight)) .text(config.rings[ring].name) .style("font-family", config.font_family) .style("font-size", "12px") @@ -347,7 +353,7 @@ function radar_visualization(config) { return (d.link && config.links_in_new_tabs) ? "_blank" : null; }) .append("text") - .attr("transform", function(d, i) { return legend_transform(quadrant, ring, config.legend_column_width, i); }) + .attr("transform", function(d, i) { return legend_transform(quadrant, ring, config.legend_column_width, i, previosHeight); }) .attr("class", "legend" + quadrant + ring) .attr("id", function(d, i) { return "legendItem" + d.id; }) .text(function(d, i) { return d.id + ". " + d.label; }) // XXX @@ -355,7 +361,13 @@ function radar_visualization(config) { .style("font-size", "11px") .on("mouseover", function(d) { showBubble(d); highlightLegendItem(d); }) .on("mouseout", function(d) { hideBubble(d); unhighlightLegendItem(d); }) - .call(wrapText); + .call(wrapText) + .each(function(d, i) { + var textElement = d3.select(this); + var bbox = textElement.node().getBBox(); // Get the bounding box for the text element + previosHeight += bbox.height; // Add to total height + console.log("Total height of legend item " + d.id + ": " + bbox.height); + }); } } } From f77936937d53d0c0de8433b9458dc49d5b74a838 Mon Sep 17 00:00:00 2001 From: Fabrizio Duroni Date: Fri, 22 Nov 2024 21:21:16 +0100 Subject: [PATCH 03/10] Fixed line height and configurable column width --- docs/radar.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/radar.js b/docs/radar.js index 7bf8561c..85781e8e 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -274,7 +274,7 @@ function radar_visualization(config) { function legend_transform(quadrant, ring, legendColumnWidth, index=null, previousHeight = null) { var dx = ring < 2 ? 0 : legendColumnWidth; - var dy = (index == null ? -16 : index * 12); + var dy = (index == null ? -16 : index * 10); /// LINE HEIGTH - now shared with wrapText function XXXX if (ring % 2 === 1) { dy = dy + 36 + previousHeight; @@ -374,7 +374,7 @@ function radar_visualization(config) { // Define a function for wrapping text into multiple lines function wrapText(text) { - var width = 120; // Set the width you want for wrapping + var width = config.legend_column_width; // Set the width you want for wrapping let previousElementHeight = 0; let previousElementY = 0; @@ -403,7 +403,7 @@ function radar_visualization(config) { // Add a new tspan for the next line and increase the vertical offset tspan = textElement.append("tspan") .attr("x", 0) - .attr("dy", 10) // This ensures vertical space between lines + .attr("dy", 10) /// LINE HEIGTH - now shared with wrapText function XXXX .text(words[i]); } } From 99967cbea3a37bea4f88603aed0a916f6a3c34ee Mon Sep 17 00:00:00 2001 From: chicio Date: Sat, 23 Nov 2024 18:48:01 +0100 Subject: [PATCH 04/10] Now legend item multiple rows are aligned at the same x (determined by the width of '. ' string part). --- docs/radar.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/docs/radar.js b/docs/radar.js index 85781e8e..6f2b82e3 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -274,7 +274,7 @@ function radar_visualization(config) { function legend_transform(quadrant, ring, legendColumnWidth, index=null, previousHeight = null) { var dx = ring < 2 ? 0 : legendColumnWidth; - var dy = (index == null ? -16 : index * 10); /// LINE HEIGTH - now shared with wrapText function XXXX + var dy = (index == null ? -16 : index * 10); /// LINE HEIGHT - now shared with wrapText function XXXX if (ring % 2 === 1) { dy = dy + 36 + previousHeight; @@ -372,20 +372,21 @@ function radar_visualization(config) { } } - // Define a function for wrapping text into multiple lines function wrapText(text) { - var width = config.legend_column_width; // Set the width you want for wrapping let previousElementHeight = 0; let previousElementY = 0; text.each(function() { - var textElement = d3.select(this); - var words = textElement.text().split(" "); - var line = []; + const textElement = d3.select(this); + const words = textElement.text().split(" "); + let line = []; - var lineY = parseFloat( - previousElementY + previousElementHeight // textElement.attr("y") - ); // Start from the initial Y position + const lineY = previousElementY + previousElementHeight; + + var number = `${textElement.text().split(".")[0]}. |`; + var legendNumberText = textElement.append("tspan").text(number) + var legendBar = textElement.append("tspan").text('|') + var numberWidth = legendNumberText.node().getComputedTextLength() - legendBar.node().getComputedTextLength(); // Create an array of lines textElement.text(null); // Remove the existing text @@ -395,20 +396,20 @@ function radar_visualization(config) { tspan.text(line.join(" ")); // If the line is too wide, move to the next line - if (tspan.node().getComputedTextLength() > width) { + if (tspan.node().getComputedTextLength() > config.legend_column_width) { line.pop(); // Remove the word that caused the overflow tspan.text(line.join(" ")); // Set the text for the previous line line = [words[i]]; // Start a new line with the current word // Add a new tspan for the next line and increase the vertical offset tspan = textElement.append("tspan") - .attr("x", 0) + .attr("x", numberWidth) .attr("dy", 10) /// LINE HEIGTH - now shared with wrapText function XXXX .text(words[i]); } } - var bbox = textElement.node().getBBox(); + const bbox = textElement.node().getBBox(); previousElementHeight = bbox.height; // Get the height of the current text element previousElementY = bbox.y; }); From 1124270bf63effa9772ae6d36dff26bb549c1712 Mon Sep 17 00:00:00 2001 From: chicio Date: Sat, 23 Nov 2024 19:07:50 +0100 Subject: [PATCH 05/10] Clean up: set right let/const/var for variables --- docs/radar.js | 66 +++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/radar.js b/docs/radar.js index 6f2b82e3..5b357490 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -23,6 +23,7 @@ function radar_visualization(config) { + let quadrant; config.svg_id = config.svg || "radar"; config.width = config.width || 1450; config.height = config.height || 1000; @@ -164,7 +165,7 @@ function radar_visualization(config) { // partition entries according to segments var segmented = new Array(4); - for (var quadrant = 0; quadrant < 4; quadrant++) { + for (quadrant = 0; quadrant < 4; quadrant++) { segmented[quadrant] = new Array(4); for (var ring = 0; ring < 4; ring++) { segmented[quadrant][ring] = []; @@ -177,7 +178,7 @@ function radar_visualization(config) { // assign unique sequential id to each entry var id = 1; - for (var quadrant of [2,3,1,0]) { + for (quadrant of [2,3,1,0]) { for (var ring = 0; ring < 4; ring++) { var entries = segmented[quadrant][ring]; entries.sort(function(a,b) { return a.label.localeCompare(b.label); }) @@ -272,9 +273,9 @@ function radar_visualization(config) { } } - function legend_transform(quadrant, ring, legendColumnWidth, index=null, previousHeight = null) { - var dx = ring < 2 ? 0 : legendColumnWidth; - var dy = (index == null ? -16 : index * 10); /// LINE HEIGHT - now shared with wrapText function XXXX + function legendTransform(quadrant, ring, legendColumnWidth, index=null, previousHeight = null) { + const dx = ring < 2 ? 0 : legendColumnWidth; + let dy = (index == null ? -16 : index * 10); /// LINE HEIGHT - now shared with wrapText function XXXX if (ring % 2 === 1) { dy = dy + 36 + previousHeight; @@ -288,7 +289,6 @@ function radar_visualization(config) { // draw title and legend (only in print layout) if (config.print_layout) { - // title radar.append("a") .attr("href", config.repo_url) @@ -318,8 +318,8 @@ function radar_visualization(config) { .style("font-size", "12px"); // legend - var legend = radar.append("g"); - for (var quadrant = 0; quadrant < 4; quadrant++) { + const legend = radar.append("g"); + for (let quadrant = 0; quadrant < 4; quadrant++) { legend.append("text") .attr("transform", translate( config.legend_offset[quadrant].x, @@ -329,13 +329,13 @@ function radar_visualization(config) { .style("font-family", config.font_family) .style("font-size", "18px") .style("font-weight", "bold"); - let previosHeight = 0 - for (var ring = 0; ring < 4; ring++) { + let previousLegendHeight = 0 + for (let ring = 0; ring < 4; ring++) { if (ring % 2 === 0) { - previosHeight = 0 + previousLegendHeight = 0 } legend.append("text") - .attr("transform", legend_transform(quadrant, ring, config.legend_column_width, null, previosHeight)) + .attr("transform", legendTransform(quadrant, ring, config.legend_column_width, null, previousLegendHeight)) .text(config.rings[ring].name) .style("font-family", config.font_family) .style("font-size", "12px") @@ -353,7 +353,7 @@ function radar_visualization(config) { return (d.link && config.links_in_new_tabs) ? "_blank" : null; }) .append("text") - .attr("transform", function(d, i) { return legend_transform(quadrant, ring, config.legend_column_width, i, previosHeight); }) + .attr("transform", function(d, i) { return legendTransform(quadrant, ring, config.legend_column_width, i, previousLegendHeight); }) .attr("class", "legend" + quadrant + ring) .attr("id", function(d, i) { return "legendItem" + d.id; }) .text(function(d, i) { return d.id + ". " + d.label; }) // XXX @@ -362,11 +362,8 @@ function radar_visualization(config) { .on("mouseover", function(d) { showBubble(d); highlightLegendItem(d); }) .on("mouseout", function(d) { hideBubble(d); unhighlightLegendItem(d); }) .call(wrapText) - .each(function(d, i) { - var textElement = d3.select(this); - var bbox = textElement.node().getBBox(); // Get the bounding box for the text element - previosHeight += bbox.height; // Add to total height - console.log("Total height of legend item " + d.id + ": " + bbox.height); + .each(function() { + previousLegendHeight += d3.select(this).node().getBBox().height; }); } } @@ -383,25 +380,28 @@ function radar_visualization(config) { const lineY = previousElementY + previousElementHeight; - var number = `${textElement.text().split(".")[0]}. |`; - var legendNumberText = textElement.append("tspan").text(number) - var legendBar = textElement.append("tspan").text('|') - var numberWidth = legendNumberText.node().getComputedTextLength() - legendBar.node().getComputedTextLength(); + const number = `${textElement.text().split(".")[0]}. |`; + const legendNumberText = textElement.append("tspan").text(number); + const legendBar = textElement.append("tspan").text('|'); + const numberWidth = legendNumberText.node().getComputedTextLength() - legendBar.node().getComputedTextLength(); + + textElement.text(null); + + let tspan = textElement + .append("tspan") + .attr("x", 0) + .attr("y", lineY) + .attr("dy", 0); - // Create an array of lines - textElement.text(null); // Remove the existing text - var tspan = textElement.append("tspan").attr("x", 0).attr("y", lineY).attr("dy", 0); - for (var i = 0; i < words.length; i++) { + for (let i = 0; i < words.length; i++) { line.push(words[i]); tspan.text(line.join(" ")); - // If the line is too wide, move to the next line if (tspan.node().getComputedTextLength() > config.legend_column_width) { - line.pop(); // Remove the word that caused the overflow - tspan.text(line.join(" ")); // Set the text for the previous line - line = [words[i]]; // Start a new line with the current word + line.pop(); + tspan.text(line.join(" ")); + line = [words[i]]; - // Add a new tspan for the next line and increase the vertical offset tspan = textElement.append("tspan") .attr("x", numberWidth) .attr("dy", 10) /// LINE HEIGTH - now shared with wrapText function XXXX @@ -410,7 +410,7 @@ function radar_visualization(config) { } const bbox = textElement.node().getBBox(); - previousElementHeight = bbox.height; // Get the height of the current text element + previousElementHeight = bbox.height; previousElementY = bbox.y; }); } @@ -481,7 +481,7 @@ function radar_visualization(config) { .enter() .append("g") .attr("class", "blip") - .attr("transform", function(d, i) { return legend_transform(d.quadrant, d.ring, config.legend_column_width, i); }) + .attr("transform", function(d, i) { return legendTransform(d.quadrant, d.ring, config.legend_column_width, i); }) .on("mouseover", function(d) { showBubble(d); highlightLegendItem(d); }) .on("mouseout", function(d) { hideBubble(d); unhighlightLegendItem(d); }); From 63786068cb45a709b69a5a3d526bb67ee7ea660b Mon Sep 17 00:00:00 2001 From: chicio Date: Sat, 23 Nov 2024 19:53:24 +0100 Subject: [PATCH 06/10] Clean up: renaming and rewording --- docs/config.json | 916 ++++++++++++++++++++++++++++++++++------------- docs/radar.js | 16 +- 2 files changed, 677 insertions(+), 255 deletions(-) diff --git a/docs/config.json b/docs/config.json index 465ab99d..c4d870c2 100644 --- a/docs/config.json +++ b/docs/config.json @@ -3,561 +3,987 @@ "entries": [ { "quadrant": 3, - "ring": 1, - "label": "AWS Athena", + "ring": 0, + "label": "Appian", "active": true, - "moved": 1 + "moved": 0, + "link": "https://appian.com/" }, { - "quadrant": 3, + "quadrant": 0, "ring": 0, - "label": "AWS EMR", + "label": "Dash", "active": true, - "moved": 0 + "moved": 0, + "link": "https://dash.plotly.com/" }, { - "quadrant": 3, + "quadrant": 0, "ring": 2, - "label": "AWS Glue", + "label": "Deepchecks", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.deepchecks.com/" }, { - "quadrant": 3, + "quadrant": 1, + "ring": 0, + "label": "Docker", + "active": true, + "moved": 0, + "link": "https://www.docker.com/" + }, + { + "quadrant": 0, "ring": 2, - "label": "AWS Lake Formation", + "label": "Evidently", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.evidentlyai.com/" }, { - "quadrant": 3, + "quadrant": 0, + "ring": 1, + "label": "FastAPI", + "active": true, + "moved": 0, + "link": "https://fastapi.tiangolo.com/" + }, + { + "quadrant": 0, "ring": 0, - "label": "Airflow", + "label": "Flask", "active": true, - "moved": 0 + "moved": 0, + "link": "https://flask.palletsprojects.com/" }, { - "quadrant": 3, + "quadrant": 0, "ring": 0, - "label": "Databricks", + "label": "Gunicorn", "active": true, - "moved": 0 + "moved": 0, + "link": "https://gunicorn.org/" }, { - "quadrant": 3, + "quadrant": 0, + "ring": 0, + "label": "Java", + "active": true, + "moved": 0, + "link": "https://www.java.com/" + }, + { + "quadrant": 0, + "ring": 0, + "label": "Keras", + "active": true, + "moved": 0, + "link": "https://keras.io/" + }, + { + "quadrant": 0, "ring": 1, - "label": "Flink", - "link": "https://engineering.zalando.com/tags/apache-flink.html", + "label": "OpenAI / ChatGPT", "active": true, - "moved": 0 + "moved": 0, + "link": "https://chatgpt.com/" }, { - "quadrant": 3, + "quadrant": 0, + "ring": 0, + "label": "Python", + "active": true, + "moved": 0, + "link": "https://www.python.org/" + }, + { + "quadrant": 0, "ring": 1, - "label": "Google BigQuery", + "label": "Pytorch", + "active": true, + "moved": 0, + "link": "https://pytorch.org/" + }, + { + "quadrant": 0, + "ring": 0, + "label": "Scikit-learn", + "active": true, + "moved": 0, + "link": "https://scikit-learn.org/" + }, + { + "quadrant": 0, + "ring": 0, + "label": "Tensorflow", + "active": true, + "moved": 0, + "link": "https://www.tensorflow.org/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "AWS ECR", + "active": true, + "moved": 0, + "link": "https://aws.amazon.com/ecr/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Cloudflare", + "active": false, + "moved": 0, + "link": "https://www.cloudflare.com/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Cyberark", + "active": false, + "moved": 0, + "link": "https://www.cyberark.com/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Google composer", "active": true, - "moved": 0 + "moved": 0, + "link": "https://cloud.google.com/composer" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Google Container Registry", + "active": true, + "moved": 0, + "link": "https://console.cloud.google.com/marketplace/product/google-cloud-platform/container-registry/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Google Dataproc", + "active": true, + "moved": 0, + "link": "https://cloud.google.com/dataproc" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Google PubSub", + "active": true, + "moved": 0, + "link": "https://cloud.google.com/pubsub" }, { "quadrant": 3, - "ring": 1, - "label": "Presto", + "ring": 0, + "label": "Docker Desktop", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.docker.com/products/docker-desktop/" }, { "quadrant": 3, "ring": 0, - "label": "Spark", - "link": "https://engineering.zalando.com/tags/apache-spark.html", + "label": "Firebase Analytics", "active": true, - "moved": 0 + "moved": 0, + "link": "https://firebase.google.com/products/analytics" }, { "quadrant": 3, - "ring": 2, - "label": "Streamlit", + "ring": 0, + "label": "Sonar", + "active": true, + "moved": 0, + "link": "https://www.sonarsource.com/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Auth0", "active": true, - "moved": 0 + "moved": 0, + "link": "https://auth0.com/" }, { "quadrant": 3, - "ring": 1, - "label": "dbt", + "ring": 0, + "label": "CodePush", "active": true, - "moved": 0 + "moved": 0, + "link": "https://microsoft.github.io/code-push/" + }, + { + "quadrant": 3, + "ring": 3, + "label": "Graylog", + "active": true, + "moved": 0, + "link": "https://graylog.org/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Jamf", + "active": true, + "moved": 0, + "link": "https://www.jamf.com/" }, { "quadrant": 2, "ring": 0, - "label": "AWS DynamoDB", + "label": "Kafka", + "active": true, + "moved": 0, + "link": "https://kafka.apache.org/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Kubernetes", + "active": true, + "moved": 0, + "link": "https://kubernetes.io/" + }, + { + "quadrant": 1, + "ring": 1, + "label": "Prefect", + "active": true, + "moved": 0, + "link": "https://www.prefect.io/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "PRTG", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.paessler.com/prtg" + }, + { + "quadrant": 1, + "ring": 0, + "label": "WorkspaceOne", + "active": true, + "moved": 0, + "link": "https://docs.vmware.com/en/VMware-Workspace-ONE/index.html" + }, + { + "quadrant": 3, + "ring": 0, + "label": "Zoho", + "active": true, + "moved": 0, + "link": "https://www.zoho.com/" }, { "quadrant": 2, "ring": 0, "label": "AWS S3", "active": true, - "moved": 0 + "moved": 0, + "link": "https://aws.amazon.com/s3/" }, { "quadrant": 2, "ring": 0, - "label": "Amazon ElastiCache", - "link": "https://engineering.zalando.com/tags/redis.html", + "label": "MongoDB", "active": true, - "moved": 1 + "moved": 0, + "link": "https://www.mongodb.com/" }, { "quadrant": 2, - "ring": 2, - "label": "Amazon MemoryDB", + "ring": 0, + "label": "AWS RDS", "active": true, - "moved": 0 + "moved": 0, + "link": "https://aws.amazon.com/rds/" }, { "quadrant": 2, - "ring": 1, - "label": "Amazon Redshift", + "ring": 3, + "label": "Memcached", "active": true, - "moved": 0 + "moved": 0, + "link": "https://memcached.org/" }, { "quadrant": 2, - "ring": 1, - "label": "Amazon Feature Store", + "ring": 3, + "label": "Hazelcast", "active": true, - "moved": 0 + "moved": 0, + "link": "https://hazelcast.com/" }, { "quadrant": 2, + "ring": 1, + "label": "AppsFlyer", + "active": true, + "moved": 0, + "link": "https://www.appsflyer.com/" + }, + { + "quadrant": 1, + "ring": 2, + "label": "Service Mesh", + "active": true, + "moved": 0, + "link": "https://kuma.io/" + }, + { + "quadrant": 1, + "ring": 1, + "label": "ArgoCD", + "active": false, + "moved": 0, + "link": "https://argoproj.github.io/cd/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "KrakenD", + "active": true, + "moved": 0, + "link": "https://www.krakend.io/" + }, + { + "quadrant": 3, + "ring": 0, + "label": "Miro", + "active": true, + "moved": 0, + "link": "https://miro.com/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Harbor", + "active": true, + "moved": 0, + "link": "https://goharbor.io/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "HashiCorp Vault", + "active": true, + "moved": 0, + "link": "https://www.hashicorp.com/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Helm", + "active": true, + "moved": 0, + "link": "https://helm.sh/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "Terraform", + "active": true, + "moved": 0, + "link": "https://www.terraform.io/" + }, + { + "quadrant": 1, + "ring": 0, + "label": "KEDA", + "active": true, + "moved": 0, + "link": "https://keda.sh/" + }, + { + "quadrant": 1, "ring": 3, - "label": "Apache Cassandra", - "link": "https://engineering.zalando.com/tags/cassandra.html", + "label": "Ansible", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.ansible.com/" }, { - "quadrant": 2, + "quadrant": 1, + "ring": 3, + "label": "AWS ApiGateway", + "active": true, + "moved": 0, + "link": "https://aws.amazon.com/api-gateway/" + }, + { + "quadrant": 1, "ring": 3, - "label": "Consul", + "label": "Kong", "active": true, - "moved": 0 + "moved": 0, + "link": "https://konghq.com/products/kong-gateway" + }, + { + "quadrant": 1, + "ring": 3, + "label": "Hewlett Packard Enterprise", + "active": false, + "moved": 0, + "link": "https://www.hpe.com/" + }, + { + "quadrant": 1, + "ring": 3, + "label": "Spinnaker", + "active": true, + "moved": 0, + "link": "https://spinnaker.io/" + }, + { + "quadrant": 1, + "ring": 3, + "label": "VMware", + "active": false, + "moved": 0, + "link": "https://www.vmware.com/" + }, + { + "quadrant": 1, + "ring": 3, + "label": "Pure Storage", + "active": false, + "moved": 0, + "link": "https://www.purestorage.com/" }, { "quadrant": 2, "ring": 1, - "label": "Druid", + "label": "Apache Iceberg", "active": true, - "moved": 0 + "moved": 0, + "link": "https://iceberg.apache.org/" + }, + { + "quadrant": 1, + "ring": 2, + "label": "AWS Lambda", + "active": true, + "moved": 0, + "link": "https://aws.amazon.com/lambda/" }, { "quadrant": 2, - "ring": 0, + "ring": 1, + "label": "Clickhouse", + "active": true, + "moved": 0, + "link": "https://clickhouse.com/" + }, + { + "quadrant": 2, + "ring": 1, "label": "Elasticsearch", - "link": "https://engineering.zalando.com/tags/elasticsearch.html", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.elastic.co/elasticsearch" + }, + { + "quadrant": 2, + "ring": 1, + "label": "OpenSearch", + "active": true, + "moved": 0, + "link": "https://opensearch.org/" }, { "quadrant": 2, "ring": 0, - "label": "Exasol", + "label": "SQLite", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.sqlite.org/" }, { "quadrant": 2, - "ring": 3, - "label": "HBase", + "ring": 2, + "label": "AWS Aurora", "active": true, - "moved": 0 + "moved": 0, + "link": "https://aws.amazon.com/rds/aurora/" }, { "quadrant": 2, - "ring": 1, - "label": "HDFS", + "ring": 2, + "label": "AWS DynamoDB", "active": true, - "moved": 0 + "moved": 0, + "link": "https://aws.amazon.com/dynamodb/" }, { "quadrant": 2, - "ring": 3, - "label": "Hazelcast", + "ring": 0, + "label": "RabbitMQ", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.rabbitmq.com/" }, { "quadrant": 2, - "ring": 3, - "label": "Memcached", + "ring": 0, + "label": "Google BigQuery", "active": true, - "moved": 0 + "moved": 0, + "link": "https://cloud.google.com/bigquery" }, { "quadrant": 2, - "ring": 3, - "label": "MongoDB", + "ring": 0, + "label": "Bigtable", "active": true, - "moved": 0 + "moved": 0, + "link": "https://cloud.google.com/bigtable" }, { "quadrant": 2, "ring": 3, - "label": "MySQL", + "label": "DocumentDB", "active": true, - "moved": 0 + "moved": 0, + "link": "https://aws.amazon.com/documentdb/" }, { "quadrant": 2, - "ring": 3, - "label": "Oracle DB", + "ring": 0, + "label": "Exavault", + "active": true, + "moved": 0, + "link": "https://www.exavault.com/" + }, + { + "quadrant": 3, + "ring": 0, + "label": "Gitlab", "active": true, - "moved": 0 + "moved": 0, + "link": "https://about.gitlab.com/" }, { "quadrant": 2, "ring": 0, - "label": "PostgreSQL", - "link": "https://engineering.zalando.com/tags/postgresql.html", + "label": "Google Cloud Storage", "active": true, - "moved": 0 + "moved": 0, + "link": "https://cloud.google.com/storage/" + }, + { + "quadrant": 3, + "ring": 0, + "label": "Grafana", + "active": true, + "moved": 0, + "link": "https://grafana.com/" }, { "quadrant": 2, - "ring": 3, - "label": "Redis", - "link": "https://engineering.zalando.com/tags/redis.html", + "ring": 0, + "label": "Polar", "active": true, - "moved": -1 + "moved": 0, + "link": "https://realpython.com/polars-python/" }, { "quadrant": 2, - "ring": 2, - "label": "RocksDB", + "ring": 0, + "label": "Postgres", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.postgresql.org/" }, { "quadrant": 2, - "ring": 3, - "label": "Solr", + "ring": 0, + "label": "Redis", "active": true, - "moved": 0 + "moved": 0, + "link": "https://redis.io/" }, { "quadrant": 2, - "ring": 2, - "label": "Valkey", - "link": "https://engineering.zalando.com/tags/redis.html", + "ring": 0, + "label": "Spark", "active": true, - "moved": 2 + "moved": 0, + "link": "https://spark.apache.org/" }, { "quadrant": 2, - "ring": 3, - "label": "ZooKeeper", + "ring": 0, + "label": "Spotfire", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.spotfire.com//" }, { - "quadrant": 1, + "quadrant": 2, "ring": 0, - "label": "AWS CloudFormation", + "label": "Talend", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.talend.com/" }, { - "quadrant": 1, + "quadrant": 2, "ring": 0, - "label": "AWS CloudFront", + "label": "Vertica", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.vertica.com/" }, { - "quadrant": 1, - "ring": 1, - "label": "AWS Elemental MediaConvert", + "quadrant": 3, + "ring": 0, + "label": "Abstract Studio Design", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.abstract.com/" }, { - "quadrant": 1, - "ring": 1, - "label": "AWS Lambda", + "quadrant": 3, + "ring": 0, + "label": "Adobe Systems Software", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.adobe.com/" }, { - "quadrant": 1, - "ring": 2, - "label": "AWS Service Catalog", + "quadrant": 3, + "ring": 0, + "label": "Autocad", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.autodesk.com/products/autocad/overview" }, { - "quadrant": 1, - "ring": 1, - "label": "AWS Step Functions", + "quadrant": 3, + "ring": 0, + "label": "Cloudinary", "active": true, - "moved": 0 + "moved": 0, + "link": "https://cloudinary.com/" }, { - "quadrant": 1, - "ring": 2, - "label": "Amazon Bedrock", + "quadrant": 3, + "ring": 0, + "label": "Dynamics Business Central", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.microsoft.com/en-us/dynamics-365/products/business-central/" }, { - "quadrant": 1, - "ring": 2, - "label": "Amazon Pinpoint", + "quadrant": 3, + "ring": 0, + "label": "Figma Software", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.figma.com/" }, { - "quadrant": 1, + "quadrant": 3, "ring": 0, - "label": "Amazon SageMaker", + "label": "Google Tag Manager (GTM)", + "active": false, + "moved": 0, + "link": "https://tagmanager.google.com/" + }, + { + "quadrant": 3, + "ring": 0, + "label": "Hotjar", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.hotjar.com/" }, { - "quadrant": 1, + "quadrant": 3, + "ring": 3, + "label": "Maven", + "active": true, + "moved": 0, + "link": "https://maven.apache.org/" + }, + { + "quadrant": 3, "ring": 0, - "label": "Docker", - "link": "https://engineering.zalando.com/tags/docker.html", + "label": "Prometheus", "active": true, - "moved": 0 + "moved": 0, + "link": "https://prometheus.io/" }, { - "quadrant": 1, + "quadrant": 3, + "ring": 1, + "label": "OpenTelemetry", + "active": true, + "moved": 0, + "link": "https://opentelemetry.io/" + }, + { + "quadrant": 3, + "ring": 1, + "label": "Rancher Desktop", + "active": true, + "moved": 0, + "link": "https://rancherdesktop.io/" + }, + { + "quadrant": 3, + "ring": 1, + "label": "Stackdriver", + "active": false, + "moved": 0, + "link": "https://cloud.google.com/products/operations" + }, + { + "quadrant": 3, "ring": 2, - "label": "GraalVM", + "label": "Copilot", "active": true, - "moved": 0 + "moved": 0, + "link": "https://copilot.microsoft.com/" }, { - "quadrant": 1, + "quadrant": 3, "ring": 2, - "label": "Kotlin Multiplatform", + "label": "Cursor", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.cursor.com/" }, { - "quadrant": 1, - "ring": 0, - "label": "Kubernetes", - "link": "https://engineering.zalando.com/tags/kubernetes.html", + "quadrant": 3, + "ring": 2, + "label": "Sentry", "active": true, - "moved": 0 + "moved": 0, + "link": "https://sentry.io/" }, { - "quadrant": 1, - "ring": 1, - "label": "Open Policy Agent", + "quadrant": 3, + "ring": 2, + "label": "Lighthouse", "active": true, - "moved": 0 + "moved": 0, + "link": "https://github.com/GoogleChrome/lighthouse" }, { - "quadrant": 1, + "quadrant": 3, "ring": 0, - "label": "OpenTelemetry", + "label": "Rapidi", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.rapidionline.com/resources/tag/salesforce-integration" }, { - "quadrant": 1, + "quadrant": 3, "ring": 0, - "label": "Skipper", + "label": "Think Cell", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.think-cell.com/" }, { "quadrant": 1, - "ring": 2, - "label": "Slurm", + "ring": 0, + "label": "VMware Fusion", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.vmware.com/info/fusion/faq" }, { - "quadrant": 1, - "ring": 1, - "label": "WebAssembly", + "quadrant": 3, + "ring": 0, + "label": "VTENext", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.vtenext.com/" }, { - "quadrant": 1, - "ring": 0, - "label": "ZMON", + "quadrant": 0, + "ring": 3, + "label": "Backbone.js", "active": true, - "moved": 0 + "moved": 0, + "link": "https://backbonejs.org/" }, { "quadrant": 0, "ring": 3, - "label": "Clojure", - "link": "https://engineering.zalando.com/tags/clojure.html", + "label": "C++", "active": true, - "moved": 0 + "moved": 0, + "link": "https://isocpp.org/" }, { "quadrant": 0, - "ring": 1, - "label": "Dart", + "ring": 3, + "label": "Struts", "active": true, - "moved": 0 + "moved": 0, + "link": "https://struts.apache.org/" }, { "quadrant": 0, - "ring": 0, - "label": "Go", - "link": "https://engineering.zalando.com/tags/golang.html", + "ring": 2, + "label": "Vaadin", "active": true, - "moved": 0 + "moved": 0, + "link": "https://vaadin.com/" }, { "quadrant": 0, - "ring": 0, - "label": "GraphQL", - "link": "https://engineering.zalando.com/tags/graphql.html", + "ring": 1, + "label": "PHP", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.php.net/" }, { "quadrant": 0, - "ring": 3, - "label": "Haskell", - "link": "https://engineering.zalando.com/tags/haskell.html", + "ring": 1, + "label": "Axon Framework", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.axoniq.io/products/axon-framework" }, { "quadrant": 0, - "ring": 0, - "label": "Java", - "link": "https://engineering.zalando.com/tags/java.html", + "ring": 1, + "label": "Module Federation (Micro FE)", "active": true, - "moved": 0 + "moved": 0, + "link": "https://webpack.js.org/concepts/module-federation/" }, { "quadrant": 0, "ring": 0, - "label": "JavaScript", - "link": "https://engineering.zalando.com/tags/javascript.html", + "label": ".NET", "active": true, - "moved": 0 + "moved": 0, + "link": "https://dotnet.microsoft.com/" }, { "quadrant": 0, "ring": 0, - "label": "Kotlin", - "link": "https://engineering.zalando.com/tags/kotlin.html", + "label": "C#", "active": true, - "moved": 0 + "moved": 0, + "link": "https://learn.microsoft.com/en-gb/dotnet/csharp/" }, { "quadrant": 0, "ring": 0, - "label": "OpenAPI (Swagger)", - "link": "https://engineering.zalando.com/tags/openapi.html", + "label": "Go", "active": true, - "moved": 0 + "moved": 0, + "link": "https://go.dev/" }, { "quadrant": 0, "ring": 0, - "label": "Python", - "link": "https://engineering.zalando.com/tags/python.html", + "label": "GraphQL", "active": true, - "moved": 0 + "moved": 0, + "link": "https://graphql.org/" }, { "quadrant": 0, - "ring": 2, - "label": "R", + "ring": 0, + "label": "Kotlin", "active": true, - "moved": 0 + "moved": 0, + "link": "https://kotlinlang.org/" }, { "quadrant": 0, - "ring": 3, - "label": "Rust", - "link": "https://engineering.zalando.com/tags/rust.html", + "ring": 0, + "label": "Next.js", "active": true, - "moved": 0 + "moved": 0, + "link": "https://nextjs.org/" }, { "quadrant": 0, "ring": 0, - "label": "Scala", - "link": "https://engineering.zalando.com/tags/scala.html", + "label": "Node.js", "active": true, - "moved": 0 + "moved": 0, + "link": "https://nodejs.org/" }, { "quadrant": 0, "ring": 0, - "label": "Swift", - "link": "https://engineering.zalando.com/tags/swift.html", + "label": "PrimeFaces", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.primefaces.org/" }, { "quadrant": 0, "ring": 0, - "label": "TypeScript", - "link": "https://engineering.zalando.com/tags/typescript.html", + "label": "React JS", "active": true, - "moved": 0 + "moved": 0, + "link": "https://react.dev/" }, { - "quadrant": 3, + "quadrant": 0, "ring": 0, - "label": "AWS Kinesis", + "label": "React Native", "active": true, - "moved": 0 + "moved": 0, + "link": "https://reactnative.dev/" }, { - "quadrant": 3, + "quadrant": 0, "ring": 0, - "label": "AWS SNS", + "label": "Scala", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.scala-lang.org/" }, { - "quadrant": 3, + "quadrant": 0, "ring": 0, - "label": "AWS SQS", + "label": "SpringBoot", "active": true, - "moved": 0 + "moved": 0, + "link": "https://spring.io/projects/spring-boot" }, { - "quadrant": 3, + "quadrant": 0, "ring": 0, - "label": "Kafka", - "link": "https://engineering.zalando.com/tags/apache-kafka.html", + "label": "SwiftUI", "active": true, - "moved": 0 + "moved": 0, + "link": "https://developer.apple.com/xcode/swiftui/" }, { - "quadrant": 3, + "quadrant": 0, "ring": 0, - "label": "Nakadi", - "link": "https://nakadi.io", + "label": "TypeScript", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.typescriptlang.org/" }, { "quadrant": 3, - "ring": 1, - "label": "RabbitMQ", - "link": "https://engineering.zalando.com/tags/rabbitmq.html", + "ring": 0, + "label": "Zuora", "active": true, - "moved": 0 + "moved": 0, + "link": "https://www.zuora.com/" } ] } diff --git a/docs/radar.js b/docs/radar.js index 5b357490..5ef61e7b 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -356,7 +356,7 @@ function radar_visualization(config) { .attr("transform", function(d, i) { return legendTransform(quadrant, ring, config.legend_column_width, i, previousLegendHeight); }) .attr("class", "legend" + quadrant + ring) .attr("id", function(d, i) { return "legendItem" + d.id; }) - .text(function(d, i) { return d.id + ". " + d.label; }) // XXX + .text(function(d) { return d.id + ". " + d.label; }) .style("font-family", config.font_family) .style("font-size", "11px") .on("mouseover", function(d) { showBubble(d); highlightLegendItem(d); }) @@ -370,16 +370,13 @@ function radar_visualization(config) { } function wrapText(text) { - let previousElementHeight = 0; - let previousElementY = 0; + let heightForNextElement = 0; text.each(function() { const textElement = d3.select(this); const words = textElement.text().split(" "); let line = []; - const lineY = previousElementY + previousElementHeight; - const number = `${textElement.text().split(".")[0]}. |`; const legendNumberText = textElement.append("tspan").text(number); const legendBar = textElement.append("tspan").text('|'); @@ -390,7 +387,7 @@ function radar_visualization(config) { let tspan = textElement .append("tspan") .attr("x", 0) - .attr("y", lineY) + .attr("y", heightForNextElement) .attr("dy", 0); for (let i = 0; i < words.length; i++) { @@ -404,14 +401,13 @@ function radar_visualization(config) { tspan = textElement.append("tspan") .attr("x", numberWidth) - .attr("dy", 10) /// LINE HEIGTH - now shared with wrapText function XXXX + .attr("dy", 10) .text(words[i]); } } - const bbox = textElement.node().getBBox(); - previousElementHeight = bbox.height; - previousElementY = bbox.y; + const textBoundingBox = textElement.node().getBBox(); + heightForNextElement = textBoundingBox.y + textBoundingBox.height; }); } From 23de3a9a434c14dd957e27d7c9b86cd069331a57 Mon Sep 17 00:00:00 2001 From: chicio Date: Sat, 23 Nov 2024 20:19:00 +0100 Subject: [PATCH 07/10] Extracted new line height parameter --- docs/radar.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/radar.js b/docs/radar.js index 5ef61e7b..2935ebf6 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -45,6 +45,7 @@ function radar_visualization(config) { config.title_offset = config.title_offset || { x: -675, y: -420 }; config.footer_offset = config.footer_offset || { x: -155, y: 450 }; config.legend_column_width = config.legend_column_width || 140 + config.line_height = config.line_height || 10 // custom random number generator, to make random sequence reproducible // source: https://stackoverflow.com/questions/521295 @@ -275,7 +276,7 @@ function radar_visualization(config) { function legendTransform(quadrant, ring, legendColumnWidth, index=null, previousHeight = null) { const dx = ring < 2 ? 0 : legendColumnWidth; - let dy = (index == null ? -16 : index * 10); /// LINE HEIGHT - now shared with wrapText function XXXX + let dy = (index == null ? -16 : index * config.line_height); if (ring % 2 === 1) { dy = dy + 36 + previousHeight; @@ -401,7 +402,7 @@ function radar_visualization(config) { tspan = textElement.append("tspan") .attr("x", numberWidth) - .attr("dy", 10) + .attr("dy", config.line_height) .text(words[i]); } } From 508af53197d0e8f358703cb95e055201acee87e1 Mon Sep 17 00:00:00 2001 From: chicio Date: Sat, 23 Nov 2024 20:19:41 +0100 Subject: [PATCH 08/10] Restored zalando radar config --- docs/config.json | 916 +++++++++++++---------------------------------- 1 file changed, 245 insertions(+), 671 deletions(-) diff --git a/docs/config.json b/docs/config.json index c4d870c2..465ab99d 100644 --- a/docs/config.json +++ b/docs/config.json @@ -3,987 +3,561 @@ "entries": [ { "quadrant": 3, - "ring": 0, - "label": "Appian", + "ring": 1, + "label": "AWS Athena", "active": true, - "moved": 0, - "link": "https://appian.com/" + "moved": 1 }, { - "quadrant": 0, + "quadrant": 3, "ring": 0, - "label": "Dash", + "label": "AWS EMR", "active": true, - "moved": 0, - "link": "https://dash.plotly.com/" + "moved": 0 }, { - "quadrant": 0, + "quadrant": 3, "ring": 2, - "label": "Deepchecks", + "label": "AWS Glue", "active": true, - "moved": 0, - "link": "https://www.deepchecks.com/" + "moved": 0 }, { - "quadrant": 1, - "ring": 0, - "label": "Docker", - "active": true, - "moved": 0, - "link": "https://www.docker.com/" - }, - { - "quadrant": 0, + "quadrant": 3, "ring": 2, - "label": "Evidently", - "active": true, - "moved": 0, - "link": "https://www.evidentlyai.com/" - }, - { - "quadrant": 0, - "ring": 1, - "label": "FastAPI", - "active": true, - "moved": 0, - "link": "https://fastapi.tiangolo.com/" - }, - { - "quadrant": 0, - "ring": 0, - "label": "Flask", - "active": true, - "moved": 0, - "link": "https://flask.palletsprojects.com/" - }, - { - "quadrant": 0, - "ring": 0, - "label": "Gunicorn", - "active": true, - "moved": 0, - "link": "https://gunicorn.org/" - }, - { - "quadrant": 0, - "ring": 0, - "label": "Java", - "active": true, - "moved": 0, - "link": "https://www.java.com/" - }, - { - "quadrant": 0, - "ring": 0, - "label": "Keras", - "active": true, - "moved": 0, - "link": "https://keras.io/" - }, - { - "quadrant": 0, - "ring": 1, - "label": "OpenAI / ChatGPT", - "active": true, - "moved": 0, - "link": "https://chatgpt.com/" - }, - { - "quadrant": 0, - "ring": 0, - "label": "Python", + "label": "AWS Lake Formation", "active": true, - "moved": 0, - "link": "https://www.python.org/" - }, - { - "quadrant": 0, - "ring": 1, - "label": "Pytorch", - "active": true, - "moved": 0, - "link": "https://pytorch.org/" - }, - { - "quadrant": 0, - "ring": 0, - "label": "Scikit-learn", - "active": true, - "moved": 0, - "link": "https://scikit-learn.org/" - }, - { - "quadrant": 0, - "ring": 0, - "label": "Tensorflow", - "active": true, - "moved": 0, - "link": "https://www.tensorflow.org/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "AWS ECR", - "active": true, - "moved": 0, - "link": "https://aws.amazon.com/ecr/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Cloudflare", - "active": false, - "moved": 0, - "link": "https://www.cloudflare.com/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Cyberark", - "active": false, - "moved": 0, - "link": "https://www.cyberark.com/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Google composer", - "active": true, - "moved": 0, - "link": "https://cloud.google.com/composer" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Google Container Registry", - "active": true, - "moved": 0, - "link": "https://console.cloud.google.com/marketplace/product/google-cloud-platform/container-registry/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Google Dataproc", - "active": true, - "moved": 0, - "link": "https://cloud.google.com/dataproc" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Google PubSub", - "active": true, - "moved": 0, - "link": "https://cloud.google.com/pubsub" + "moved": 0 }, { "quadrant": 3, "ring": 0, - "label": "Docker Desktop", + "label": "Airflow", "active": true, - "moved": 0, - "link": "https://www.docker.com/products/docker-desktop/" + "moved": 0 }, { "quadrant": 3, "ring": 0, - "label": "Firebase Analytics", + "label": "Databricks", "active": true, - "moved": 0, - "link": "https://firebase.google.com/products/analytics" + "moved": 0 }, { "quadrant": 3, - "ring": 0, - "label": "Sonar", - "active": true, - "moved": 0, - "link": "https://www.sonarsource.com/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Auth0", + "ring": 1, + "label": "Flink", + "link": "https://engineering.zalando.com/tags/apache-flink.html", "active": true, - "moved": 0, - "link": "https://auth0.com/" + "moved": 0 }, { "quadrant": 3, - "ring": 0, - "label": "CodePush", + "ring": 1, + "label": "Google BigQuery", "active": true, - "moved": 0, - "link": "https://microsoft.github.io/code-push/" + "moved": 0 }, { "quadrant": 3, - "ring": 3, - "label": "Graylog", - "active": true, - "moved": 0, - "link": "https://graylog.org/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Jamf", - "active": true, - "moved": 0, - "link": "https://www.jamf.com/" - }, - { - "quadrant": 2, - "ring": 0, - "label": "Kafka", - "active": true, - "moved": 0, - "link": "https://kafka.apache.org/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Kubernetes", - "active": true, - "moved": 0, - "link": "https://kubernetes.io/" - }, - { - "quadrant": 1, "ring": 1, - "label": "Prefect", + "label": "Presto", "active": true, - "moved": 0, - "link": "https://www.prefect.io/" + "moved": 0 }, { - "quadrant": 1, + "quadrant": 3, "ring": 0, - "label": "PRTG", + "label": "Spark", + "link": "https://engineering.zalando.com/tags/apache-spark.html", "active": true, - "moved": 0, - "link": "https://www.paessler.com/prtg" + "moved": 0 }, { - "quadrant": 1, - "ring": 0, - "label": "WorkspaceOne", + "quadrant": 3, + "ring": 2, + "label": "Streamlit", "active": true, - "moved": 0, - "link": "https://docs.vmware.com/en/VMware-Workspace-ONE/index.html" + "moved": 0 }, { "quadrant": 3, - "ring": 0, - "label": "Zoho", + "ring": 1, + "label": "dbt", "active": true, - "moved": 0, - "link": "https://www.zoho.com/" + "moved": 0 }, { "quadrant": 2, "ring": 0, - "label": "AWS S3", + "label": "AWS DynamoDB", "active": true, - "moved": 0, - "link": "https://aws.amazon.com/s3/" + "moved": 0 }, { "quadrant": 2, "ring": 0, - "label": "MongoDB", + "label": "AWS S3", "active": true, - "moved": 0, - "link": "https://www.mongodb.com/" + "moved": 0 }, { "quadrant": 2, "ring": 0, - "label": "AWS RDS", - "active": true, - "moved": 0, - "link": "https://aws.amazon.com/rds/" - }, - { - "quadrant": 2, - "ring": 3, - "label": "Memcached", + "label": "Amazon ElastiCache", + "link": "https://engineering.zalando.com/tags/redis.html", "active": true, - "moved": 0, - "link": "https://memcached.org/" + "moved": 1 }, { "quadrant": 2, - "ring": 3, - "label": "Hazelcast", - "active": true, - "moved": 0, - "link": "https://hazelcast.com/" - }, - { - "quadrant": 2, - "ring": 1, - "label": "AppsFlyer", - "active": true, - "moved": 0, - "link": "https://www.appsflyer.com/" - }, - { - "quadrant": 1, "ring": 2, - "label": "Service Mesh", + "label": "Amazon MemoryDB", "active": true, - "moved": 0, - "link": "https://kuma.io/" + "moved": 0 }, { - "quadrant": 1, + "quadrant": 2, "ring": 1, - "label": "ArgoCD", - "active": false, - "moved": 0, - "link": "https://argoproj.github.io/cd/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "KrakenD", - "active": true, - "moved": 0, - "link": "https://www.krakend.io/" - }, - { - "quadrant": 3, - "ring": 0, - "label": "Miro", - "active": true, - "moved": 0, - "link": "https://miro.com/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Harbor", - "active": true, - "moved": 0, - "link": "https://goharbor.io/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "HashiCorp Vault", + "label": "Amazon Redshift", "active": true, - "moved": 0, - "link": "https://www.hashicorp.com/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Helm", - "active": true, - "moved": 0, - "link": "https://helm.sh/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "Terraform", - "active": true, - "moved": 0, - "link": "https://www.terraform.io/" - }, - { - "quadrant": 1, - "ring": 0, - "label": "KEDA", - "active": true, - "moved": 0, - "link": "https://keda.sh/" - }, - { - "quadrant": 1, - "ring": 3, - "label": "Ansible", - "active": true, - "moved": 0, - "link": "https://www.ansible.com/" - }, - { - "quadrant": 1, - "ring": 3, - "label": "AWS ApiGateway", - "active": true, - "moved": 0, - "link": "https://aws.amazon.com/api-gateway/" - }, - { - "quadrant": 1, - "ring": 3, - "label": "Kong", - "active": true, - "moved": 0, - "link": "https://konghq.com/products/kong-gateway" - }, - { - "quadrant": 1, - "ring": 3, - "label": "Hewlett Packard Enterprise", - "active": false, - "moved": 0, - "link": "https://www.hpe.com/" - }, - { - "quadrant": 1, - "ring": 3, - "label": "Spinnaker", - "active": true, - "moved": 0, - "link": "https://spinnaker.io/" - }, - { - "quadrant": 1, - "ring": 3, - "label": "VMware", - "active": false, - "moved": 0, - "link": "https://www.vmware.com/" - }, - { - "quadrant": 1, - "ring": 3, - "label": "Pure Storage", - "active": false, - "moved": 0, - "link": "https://www.purestorage.com/" + "moved": 0 }, { "quadrant": 2, "ring": 1, - "label": "Apache Iceberg", + "label": "Amazon Feature Store", "active": true, - "moved": 0, - "link": "https://iceberg.apache.org/" - }, - { - "quadrant": 1, - "ring": 2, - "label": "AWS Lambda", - "active": true, - "moved": 0, - "link": "https://aws.amazon.com/lambda/" + "moved": 0 }, { "quadrant": 2, - "ring": 1, - "label": "Clickhouse", + "ring": 3, + "label": "Apache Cassandra", + "link": "https://engineering.zalando.com/tags/cassandra.html", "active": true, - "moved": 0, - "link": "https://clickhouse.com/" + "moved": 0 }, { "quadrant": 2, - "ring": 1, - "label": "Elasticsearch", + "ring": 3, + "label": "Consul", "active": true, - "moved": 0, - "link": "https://www.elastic.co/elasticsearch" + "moved": 0 }, { "quadrant": 2, "ring": 1, - "label": "OpenSearch", + "label": "Druid", "active": true, - "moved": 0, - "link": "https://opensearch.org/" + "moved": 0 }, { "quadrant": 2, "ring": 0, - "label": "SQLite", - "active": true, - "moved": 0, - "link": "https://www.sqlite.org/" - }, - { - "quadrant": 2, - "ring": 2, - "label": "AWS Aurora", - "active": true, - "moved": 0, - "link": "https://aws.amazon.com/rds/aurora/" - }, - { - "quadrant": 2, - "ring": 2, - "label": "AWS DynamoDB", + "label": "Elasticsearch", + "link": "https://engineering.zalando.com/tags/elasticsearch.html", "active": true, - "moved": 0, - "link": "https://aws.amazon.com/dynamodb/" + "moved": 0 }, { "quadrant": 2, "ring": 0, - "label": "RabbitMQ", + "label": "Exasol", "active": true, - "moved": 0, - "link": "https://www.rabbitmq.com/" + "moved": 0 }, { "quadrant": 2, - "ring": 0, - "label": "Google BigQuery", + "ring": 3, + "label": "HBase", "active": true, - "moved": 0, - "link": "https://cloud.google.com/bigquery" + "moved": 0 }, { "quadrant": 2, - "ring": 0, - "label": "Bigtable", + "ring": 1, + "label": "HDFS", "active": true, - "moved": 0, - "link": "https://cloud.google.com/bigtable" + "moved": 0 }, { "quadrant": 2, "ring": 3, - "label": "DocumentDB", + "label": "Hazelcast", "active": true, - "moved": 0, - "link": "https://aws.amazon.com/documentdb/" + "moved": 0 }, { "quadrant": 2, - "ring": 0, - "label": "Exavault", - "active": true, - "moved": 0, - "link": "https://www.exavault.com/" - }, - { - "quadrant": 3, - "ring": 0, - "label": "Gitlab", + "ring": 3, + "label": "Memcached", "active": true, - "moved": 0, - "link": "https://about.gitlab.com/" + "moved": 0 }, { "quadrant": 2, - "ring": 0, - "label": "Google Cloud Storage", + "ring": 3, + "label": "MongoDB", "active": true, - "moved": 0, - "link": "https://cloud.google.com/storage/" + "moved": 0 }, { - "quadrant": 3, - "ring": 0, - "label": "Grafana", + "quadrant": 2, + "ring": 3, + "label": "MySQL", "active": true, - "moved": 0, - "link": "https://grafana.com/" + "moved": 0 }, { "quadrant": 2, - "ring": 0, - "label": "Polar", + "ring": 3, + "label": "Oracle DB", "active": true, - "moved": 0, - "link": "https://realpython.com/polars-python/" + "moved": 0 }, { "quadrant": 2, "ring": 0, - "label": "Postgres", + "label": "PostgreSQL", + "link": "https://engineering.zalando.com/tags/postgresql.html", "active": true, - "moved": 0, - "link": "https://www.postgresql.org/" + "moved": 0 }, { "quadrant": 2, - "ring": 0, + "ring": 3, "label": "Redis", + "link": "https://engineering.zalando.com/tags/redis.html", "active": true, - "moved": 0, - "link": "https://redis.io/" + "moved": -1 }, { "quadrant": 2, - "ring": 0, - "label": "Spark", + "ring": 2, + "label": "RocksDB", "active": true, - "moved": 0, - "link": "https://spark.apache.org/" + "moved": 0 }, { "quadrant": 2, - "ring": 0, - "label": "Spotfire", + "ring": 3, + "label": "Solr", "active": true, - "moved": 0, - "link": "https://www.spotfire.com//" + "moved": 0 }, { "quadrant": 2, - "ring": 0, - "label": "Talend", + "ring": 2, + "label": "Valkey", + "link": "https://engineering.zalando.com/tags/redis.html", "active": true, - "moved": 0, - "link": "https://www.talend.com/" + "moved": 2 }, { "quadrant": 2, - "ring": 0, - "label": "Vertica", + "ring": 3, + "label": "ZooKeeper", "active": true, - "moved": 0, - "link": "https://www.vertica.com/" + "moved": 0 }, { - "quadrant": 3, + "quadrant": 1, "ring": 0, - "label": "Abstract Studio Design", + "label": "AWS CloudFormation", "active": true, - "moved": 0, - "link": "https://www.abstract.com/" + "moved": 0 }, { - "quadrant": 3, + "quadrant": 1, "ring": 0, - "label": "Adobe Systems Software", + "label": "AWS CloudFront", "active": true, - "moved": 0, - "link": "https://www.adobe.com/" + "moved": 0 }, { - "quadrant": 3, - "ring": 0, - "label": "Autocad", + "quadrant": 1, + "ring": 1, + "label": "AWS Elemental MediaConvert", "active": true, - "moved": 0, - "link": "https://www.autodesk.com/products/autocad/overview" + "moved": 0 }, { - "quadrant": 3, - "ring": 0, - "label": "Cloudinary", + "quadrant": 1, + "ring": 1, + "label": "AWS Lambda", "active": true, - "moved": 0, - "link": "https://cloudinary.com/" + "moved": 0 }, { - "quadrant": 3, - "ring": 0, - "label": "Dynamics Business Central", + "quadrant": 1, + "ring": 2, + "label": "AWS Service Catalog", "active": true, - "moved": 0, - "link": "https://www.microsoft.com/en-us/dynamics-365/products/business-central/" + "moved": 0 }, { - "quadrant": 3, - "ring": 0, - "label": "Figma Software", + "quadrant": 1, + "ring": 1, + "label": "AWS Step Functions", "active": true, - "moved": 0, - "link": "https://www.figma.com/" + "moved": 0 }, { - "quadrant": 3, - "ring": 0, - "label": "Google Tag Manager (GTM)", - "active": false, - "moved": 0, - "link": "https://tagmanager.google.com/" - }, - { - "quadrant": 3, - "ring": 0, - "label": "Hotjar", + "quadrant": 1, + "ring": 2, + "label": "Amazon Bedrock", "active": true, - "moved": 0, - "link": "https://www.hotjar.com/" + "moved": 0 }, { - "quadrant": 3, - "ring": 3, - "label": "Maven", + "quadrant": 1, + "ring": 2, + "label": "Amazon Pinpoint", "active": true, - "moved": 0, - "link": "https://maven.apache.org/" + "moved": 0 }, { - "quadrant": 3, + "quadrant": 1, "ring": 0, - "label": "Prometheus", + "label": "Amazon SageMaker", "active": true, - "moved": 0, - "link": "https://prometheus.io/" + "moved": 0 }, { - "quadrant": 3, - "ring": 1, - "label": "OpenTelemetry", - "active": true, - "moved": 0, - "link": "https://opentelemetry.io/" - }, - { - "quadrant": 3, - "ring": 1, - "label": "Rancher Desktop", + "quadrant": 1, + "ring": 0, + "label": "Docker", + "link": "https://engineering.zalando.com/tags/docker.html", "active": true, - "moved": 0, - "link": "https://rancherdesktop.io/" - }, - { - "quadrant": 3, - "ring": 1, - "label": "Stackdriver", - "active": false, - "moved": 0, - "link": "https://cloud.google.com/products/operations" + "moved": 0 }, { - "quadrant": 3, + "quadrant": 1, "ring": 2, - "label": "Copilot", + "label": "GraalVM", "active": true, - "moved": 0, - "link": "https://copilot.microsoft.com/" + "moved": 0 }, { - "quadrant": 3, + "quadrant": 1, "ring": 2, - "label": "Cursor", + "label": "Kotlin Multiplatform", "active": true, - "moved": 0, - "link": "https://www.cursor.com/" + "moved": 0 }, { - "quadrant": 3, - "ring": 2, - "label": "Sentry", + "quadrant": 1, + "ring": 0, + "label": "Kubernetes", + "link": "https://engineering.zalando.com/tags/kubernetes.html", "active": true, - "moved": 0, - "link": "https://sentry.io/" + "moved": 0 }, { - "quadrant": 3, - "ring": 2, - "label": "Lighthouse", + "quadrant": 1, + "ring": 1, + "label": "Open Policy Agent", "active": true, - "moved": 0, - "link": "https://github.com/GoogleChrome/lighthouse" + "moved": 0 }, { - "quadrant": 3, + "quadrant": 1, "ring": 0, - "label": "Rapidi", + "label": "OpenTelemetry", "active": true, - "moved": 0, - "link": "https://www.rapidionline.com/resources/tag/salesforce-integration" + "moved": 0 }, { - "quadrant": 3, + "quadrant": 1, "ring": 0, - "label": "Think Cell", + "label": "Skipper", "active": true, - "moved": 0, - "link": "https://www.think-cell.com/" + "moved": 0 }, { "quadrant": 1, - "ring": 0, - "label": "VMware Fusion", + "ring": 2, + "label": "Slurm", "active": true, - "moved": 0, - "link": "https://www.vmware.com/info/fusion/faq" + "moved": 0 }, { - "quadrant": 3, - "ring": 0, - "label": "VTENext", + "quadrant": 1, + "ring": 1, + "label": "WebAssembly", "active": true, - "moved": 0, - "link": "https://www.vtenext.com/" + "moved": 0 }, { - "quadrant": 0, - "ring": 3, - "label": "Backbone.js", + "quadrant": 1, + "ring": 0, + "label": "ZMON", "active": true, - "moved": 0, - "link": "https://backbonejs.org/" + "moved": 0 }, { "quadrant": 0, "ring": 3, - "label": "C++", + "label": "Clojure", + "link": "https://engineering.zalando.com/tags/clojure.html", "active": true, - "moved": 0, - "link": "https://isocpp.org/" + "moved": 0 }, { "quadrant": 0, - "ring": 3, - "label": "Struts", + "ring": 1, + "label": "Dart", "active": true, - "moved": 0, - "link": "https://struts.apache.org/" + "moved": 0 }, { "quadrant": 0, - "ring": 2, - "label": "Vaadin", + "ring": 0, + "label": "Go", + "link": "https://engineering.zalando.com/tags/golang.html", "active": true, - "moved": 0, - "link": "https://vaadin.com/" + "moved": 0 }, { "quadrant": 0, - "ring": 1, - "label": "PHP", + "ring": 0, + "label": "GraphQL", + "link": "https://engineering.zalando.com/tags/graphql.html", "active": true, - "moved": 0, - "link": "https://www.php.net/" + "moved": 0 }, { "quadrant": 0, - "ring": 1, - "label": "Axon Framework", + "ring": 3, + "label": "Haskell", + "link": "https://engineering.zalando.com/tags/haskell.html", "active": true, - "moved": 0, - "link": "https://www.axoniq.io/products/axon-framework" + "moved": 0 }, { "quadrant": 0, - "ring": 1, - "label": "Module Federation (Micro FE)", + "ring": 0, + "label": "Java", + "link": "https://engineering.zalando.com/tags/java.html", "active": true, - "moved": 0, - "link": "https://webpack.js.org/concepts/module-federation/" + "moved": 0 }, { "quadrant": 0, "ring": 0, - "label": ".NET", + "label": "JavaScript", + "link": "https://engineering.zalando.com/tags/javascript.html", "active": true, - "moved": 0, - "link": "https://dotnet.microsoft.com/" + "moved": 0 }, { "quadrant": 0, "ring": 0, - "label": "C#", + "label": "Kotlin", + "link": "https://engineering.zalando.com/tags/kotlin.html", "active": true, - "moved": 0, - "link": "https://learn.microsoft.com/en-gb/dotnet/csharp/" + "moved": 0 }, { "quadrant": 0, "ring": 0, - "label": "Go", + "label": "OpenAPI (Swagger)", + "link": "https://engineering.zalando.com/tags/openapi.html", "active": true, - "moved": 0, - "link": "https://go.dev/" + "moved": 0 }, { "quadrant": 0, "ring": 0, - "label": "GraphQL", + "label": "Python", + "link": "https://engineering.zalando.com/tags/python.html", "active": true, - "moved": 0, - "link": "https://graphql.org/" + "moved": 0 }, { "quadrant": 0, - "ring": 0, - "label": "Kotlin", + "ring": 2, + "label": "R", "active": true, - "moved": 0, - "link": "https://kotlinlang.org/" + "moved": 0 }, { "quadrant": 0, - "ring": 0, - "label": "Next.js", + "ring": 3, + "label": "Rust", + "link": "https://engineering.zalando.com/tags/rust.html", "active": true, - "moved": 0, - "link": "https://nextjs.org/" + "moved": 0 }, { "quadrant": 0, "ring": 0, - "label": "Node.js", + "label": "Scala", + "link": "https://engineering.zalando.com/tags/scala.html", "active": true, - "moved": 0, - "link": "https://nodejs.org/" + "moved": 0 }, { "quadrant": 0, "ring": 0, - "label": "PrimeFaces", + "label": "Swift", + "link": "https://engineering.zalando.com/tags/swift.html", "active": true, - "moved": 0, - "link": "https://www.primefaces.org/" + "moved": 0 }, { "quadrant": 0, "ring": 0, - "label": "React JS", + "label": "TypeScript", + "link": "https://engineering.zalando.com/tags/typescript.html", "active": true, - "moved": 0, - "link": "https://react.dev/" + "moved": 0 }, { - "quadrant": 0, + "quadrant": 3, "ring": 0, - "label": "React Native", + "label": "AWS Kinesis", "active": true, - "moved": 0, - "link": "https://reactnative.dev/" + "moved": 0 }, { - "quadrant": 0, + "quadrant": 3, "ring": 0, - "label": "Scala", + "label": "AWS SNS", "active": true, - "moved": 0, - "link": "https://www.scala-lang.org/" + "moved": 0 }, { - "quadrant": 0, + "quadrant": 3, "ring": 0, - "label": "SpringBoot", + "label": "AWS SQS", "active": true, - "moved": 0, - "link": "https://spring.io/projects/spring-boot" + "moved": 0 }, { - "quadrant": 0, + "quadrant": 3, "ring": 0, - "label": "SwiftUI", + "label": "Kafka", + "link": "https://engineering.zalando.com/tags/apache-kafka.html", "active": true, - "moved": 0, - "link": "https://developer.apple.com/xcode/swiftui/" + "moved": 0 }, { - "quadrant": 0, + "quadrant": 3, "ring": 0, - "label": "TypeScript", + "label": "Nakadi", + "link": "https://nakadi.io", "active": true, - "moved": 0, - "link": "https://www.typescriptlang.org/" + "moved": 0 }, { "quadrant": 3, - "ring": 0, - "label": "Zuora", + "ring": 1, + "label": "RabbitMQ", + "link": "https://engineering.zalando.com/tags/rabbitmq.html", "active": true, - "moved": 0, - "link": "https://www.zuora.com/" + "moved": 0 } ] } From c9cc5d6fd287c65e5789677a9f65c4433f07faa2 Mon Sep 17 00:00:00 2001 From: chicio Date: Sat, 23 Nov 2024 21:09:47 +0100 Subject: [PATCH 09/10] Clean up config + added comment to explain multiline text calculation --- docs/radar.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/radar.js b/docs/radar.js index 2935ebf6..e5506e32 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -45,7 +45,7 @@ function radar_visualization(config) { config.title_offset = config.title_offset || { x: -675, y: -420 }; config.footer_offset = config.footer_offset || { x: -155, y: 450 }; config.legend_column_width = config.legend_column_width || 140 - config.line_height = config.line_height || 10 + config.line_height = 10 // custom random number generator, to make random sequence reproducible // source: https://stackoverflow.com/questions/521295 @@ -378,6 +378,7 @@ function radar_visualization(config) { const words = textElement.text().split(" "); let line = []; + // Use '|' at the end of the string so that spaces are not trimmed during rendering. const number = `${textElement.text().split(".")[0]}. |`; const legendNumberText = textElement.append("tspan").text(number); const legendBar = textElement.append("tspan").text('|'); From 22464882419ae2cf469cfc55051c85911784a893 Mon Sep 17 00:00:00 2001 From: chicio Date: Sat, 23 Nov 2024 21:28:58 +0100 Subject: [PATCH 10/10] Minor variable cleanup --- docs/radar.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/radar.js b/docs/radar.js index e5506e32..09fabf00 100644 --- a/docs/radar.js +++ b/docs/radar.js @@ -23,7 +23,6 @@ function radar_visualization(config) { - let quadrant; config.svg_id = config.svg || "radar"; config.width = config.width || 1450; config.height = config.height || 1000; @@ -166,7 +165,7 @@ function radar_visualization(config) { // partition entries according to segments var segmented = new Array(4); - for (quadrant = 0; quadrant < 4; quadrant++) { + for (let quadrant = 0; quadrant < 4; quadrant++) { segmented[quadrant] = new Array(4); for (var ring = 0; ring < 4; ring++) { segmented[quadrant][ring] = [];