{"version":3,"sources":["../src/services/dependency/radar-0.8.js"],"sourcesContent":["//@ts-ignore\nimport * as d3 from \"d3v4\";\n\n// SOURCE: https://github.com/zalando/tech-radar\n\n// The MIT License (MIT)\n\n// Copyright (c) 2017-2024 Zalando SE\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n/**\n * \n * @param {import('../../validation/radar-configuration.schema').RadarConfigurationType} config \n * @returns void\n */\nexport function radar_visualization(config) {\n\n  // custom random number generator, to make random sequence reproducible\n  // source: https://stackoverflow.com/questions/521295\n  var seed = 42;\n  function random() {\n    var x = Math.sin(seed++) * 10000;\n    return x - Math.floor(x);\n  }\n\n  function random_between(min, max) {\n    return min + random() * (max - min);\n  }\n\n  function normal_between(min, max) {\n    return min + (random() + random()) * 0.5 * (max - min);\n  }\n\n  // radial_min / radial_max are multiples of PI\n  const quadrants = [\n    { radial_min: 0, radial_max: 0.5, factor_x: 1, factor_y: 1 },\n    { radial_min: 0.5, radial_max: 1, factor_x: -1, factor_y: 1 },\n    { radial_min: -1, radial_max: -0.5, factor_x: -1, factor_y: -1 },\n    { radial_min: -0.5, radial_max: 0, factor_x: 1, factor_y: -1 }\n  ];\n\n  const rings = [\n    { radius: 130 },\n    { radius: 220 },\n    { radius: 310 },\n    { radius: 400 }\n  ];\n\n  const title_offset =\n    { x: -675, y: -420 };\n\n  const footer_offset =\n    { x: -675, y: 420 };\n\n  const legend_offset = [\n    { x: 450, y: 90 },\n    { x: -675, y: 90 },\n    { x: -675, y: -310 },\n    { x: 450, y: -310 }\n  ];\n\n  function polar(cartesian) {\n    var x = cartesian.x;\n    var y = cartesian.y;\n    return {\n      t: Math.atan2(y, x),\n      r: Math.sqrt(x * x + y * y)\n    }\n  }\n\n  function cartesian(polar) {\n    return {\n      x: polar.r * Math.cos(polar.t),\n      y: polar.r * Math.sin(polar.t)\n    }\n  }\n\n  function bounded_interval(value, min, max) {\n    var low = Math.min(min, max);\n    var high = Math.max(min, max);\n    return Math.min(Math.max(value, low), high);\n  }\n\n  function bounded_ring(polar, r_min, r_max) {\n    return {\n      t: polar.t,\n      r: bounded_interval(polar.r, r_min, r_max)\n    }\n  }\n\n  function bounded_box(point, min, max) {\n    return {\n      x: bounded_interval(point.x, min.x, max.x),\n      y: bounded_interval(point.y, min.y, max.y)\n    }\n  }\n\n  function segment(quadrant, ring) {\n    var polar_min = {\n      t: quadrants[quadrant].radial_min * Math.PI,\n      r: ring === 0 ? 30 : rings[ring - 1].radius\n    };\n    var polar_max = {\n      t: quadrants[quadrant].radial_max * Math.PI,\n      r: rings[ring].radius\n    };\n    var cartesian_min = {\n      x: 15 * quadrants[quadrant].factor_x,\n      y: 15 * quadrants[quadrant].factor_y\n    };\n    var cartesian_max = {\n      x: rings[3].radius * quadrants[quadrant].factor_x,\n      y: rings[3].radius * quadrants[quadrant].factor_y\n    };\n    return {\n      clipx: function(d) {\n        var c = bounded_box(d, cartesian_min, cartesian_max);\n        var p = bounded_ring(polar(c), polar_min.r + 15, polar_max.r - 15);\n        d.x = cartesian(p).x; // adjust data too!\n        return d.x;\n      },\n      clipy: function(d) {\n        var c = bounded_box(d, cartesian_min, cartesian_max);\n        var p = bounded_ring(polar(c), polar_min.r + 15, polar_max.r - 15);\n        d.y = cartesian(p).y; // adjust data too!\n        return d.y;\n      },\n      random: function() {\n        return cartesian({\n          t: random_between(polar_min.t, polar_max.t),\n          r: normal_between(polar_min.r, polar_max.r)\n        });\n      }\n    }\n  }\n\n  // position each entry randomly in its segment\n  for (var i = 0; i < config.entries.length; i++) {\n    var entry = config.entries[i];\n    entry.segment = segment(entry.quadrant, entry.ring);\n    var point = entry.segment.random();\n    entry.x = point.x;\n    entry.y = point.y;\n    entry.color = entry.active || config.print_layout ?\n      config.rings[entry.ring].color : config.colors.inactive;\n  }\n\n  // partition entries according to segments\n  var segmented = new Array(4);\n  for (var quadrant = 0; quadrant < 4; quadrant++) {\n    segmented[quadrant] = new Array(4);\n    for (var ring = 0; ring < 4; ring++) {\n      segmented[quadrant][ring] = [];\n    }\n  }\n  for (var i=0; i<config.entries.length; i++) {\n    var entry = config.entries[i];\n    segmented[entry.quadrant][entry.ring].push(entry);\n  }\n\n  // assign unique sequential id to each entry\n  var id = 1;\n  for (var quadrant of [2,3,1,0]) {\n    for (var ring = 0; ring < 4; ring++) {\n      var entries = segmented[quadrant][ring];\n      entries.sort(function(a,b) { return a.label.localeCompare(b.label); })\n      for (var i=0; i<entries.length; i++) {\n        entries[i].id = \"\" + id++;\n      }\n    }\n  }\n\n  function translate(x, y) {\n    return \"translate(\" + x + \",\" + y + \")\";\n  }\n\n  function viewbox(quadrant) {\n    return [\n      Math.max(0, quadrants[quadrant].factor_x * 400) - 420,\n      Math.max(0, quadrants[quadrant].factor_y * 400) - 420,\n      440,\n      440\n    ].join(\" \");\n  }\n\n  // adjust with config.scale.\n  config.scale = config.scale || 1;\n  var scaled_width = config.width * config.scale;\n  var scaled_height = config.height * config.scale;\n\n  var svg = d3.select(\"svg#\" + config.svg_id)\n    .style(\"background-color\", config.colors.background)\n    .attr(\"width\", scaled_width)\n    .attr(\"height\", scaled_height);\n\n  var radar = svg.append(\"g\");\n  if (\"zoomed_quadrant\" in config) {\n    svg.attr(\"viewBox\", viewbox(config.zoomed_quadrant));\n  } else {\n    radar.attr(\"transform\", translate(scaled_width / 2, scaled_height / 2).concat(`scale(${config.scale})`));\n  }\n\n  var grid = radar.append(\"g\");\n\n  // draw grid lines\n  grid.append(\"line\")\n    .attr(\"x1\", 0).attr(\"y1\", -400)\n    .attr(\"x2\", 0).attr(\"y2\", 400)\n    .style(\"stroke\", config.colors.grid)\n    .style(\"stroke-width\", 1);\n  grid.append(\"line\")\n    .attr(\"x1\", -400).attr(\"y1\", 0)\n    .attr(\"x2\", 400).attr(\"y2\", 0)\n    .style(\"stroke\", config.colors.grid)\n    .style(\"stroke-width\", 1);\n\n  // background color. Usage `.attr(\"filter\", \"url(#solid)\")`\n  // SOURCE: https://stackoverflow.com/a/31013492/2609980\n  var defs = grid.append(\"defs\");\n  var filter = defs.append(\"filter\")\n    .attr(\"x\", 0)\n    .attr(\"y\", 0)\n    .attr(\"width\", 1)\n    .attr(\"height\", 1)\n    .attr(\"id\", \"solid\");\n  filter.append(\"feFlood\")\n    .attr(\"flood-color\", \"rgb(0, 0, 0, 0.8)\");\n  filter.append(\"feComposite\")\n    .attr(\"in\", \"SourceGraphic\");\n\n  // draw rings\n  for (var i = 0; i < rings.length; i++) {\n    grid.append(\"circle\")\n      .attr(\"cx\", 0)\n      .attr(\"cy\", 0)\n      .attr(\"r\", rings[i].radius)\n      .style(\"fill\", \"none\")\n      .style(\"stroke\", config.colors.grid)\n      .style(\"stroke-width\", 1);\n    if (config.print_layout) {\n      grid.append(\"text\")\n        .text(config.rings[i].name)\n        .attr(\"y\", -rings[i].radius + 62)\n        .attr(\"text-anchor\", \"middle\")\n        .style(\"fill\", config.rings[i].color)\n        .style(\"opacity\", 0.35)\n        .style(\"font-family\", \"Arial, Helvetica\")\n        .style(\"font-size\", \"42px\")\n        .style(\"font-weight\", \"bold\")\n        .style(\"pointer-events\", \"none\")\n        .style(\"user-select\", \"none\");\n    }\n  }\n\n  function legend_transform(quadrant, ring, index=null) {\n    var dx = ring < 2 ? 0 : 140;\n    var dy = (index == null ? -16 : index * 12);\n    if (ring % 2 === 1) {\n      dy = dy + 36 + segmented[quadrant][ring-1].length * 12;\n    }\n    return translate(\n      legend_offset[quadrant].x + dx,\n      legend_offset[quadrant].y + dy\n    );\n  }\n\n  // draw title and legend (only in print layout)\n  if (config.print_layout) {\n\n    // title\n    radar.append(\"text\")\n      .attr(\"transform\", translate(title_offset.x, title_offset.y))\n      .attr(\"class\", \"radar-title\")\n      .text(config.title)\n      .style(\"font-family\", \"Arial, Helvetica\")\n      .style(\"font-size\", \"30\")\n      .style(\"font-weight\", \"bold\")\n\n    // date\n    radar\n      .append(\"text\")\n      .attr(\"class\", \"radar-date\")\n      .attr(\"transform\", translate(title_offset.x, title_offset.y + 20))\n      .text(config.date || \"\")\n      .style(\"font-family\", \"Arial, Helvetica\")\n      .style(\"font-size\", \"14\")\n      .style(\"fill\", \"#999\")\n\n    // footer\n    radar.append(\"text\")\n      .attr(\"class\", \"radar-footer\")\n      .attr(\"transform\", translate(footer_offset.x, footer_offset.y))\n      .text(\"▲ moved up     ▼ moved down\")\n      .attr(\"xml:space\", \"preserve\")\n      .style(\"font-family\", \"Arial, Helvetica\")\n      .style(\"font-size\", \"10px\");\n\n    // legend\n    var legend = radar.append(\"g\");\n    for (var quadrant = 0; quadrant < 4; quadrant++) {\n      legend.append(\"text\")\n        .attr(\"class\", \"radar-quadrant-name\")\n        .attr(\"transform\", translate(\n          legend_offset[quadrant].x,\n          legend_offset[quadrant].y - 45\n        ))\n        .text(config.quadrants[quadrant].name)\n        .style(\"font-family\", \"Arial, Helvetica\")\n        .style(\"font-size\", \"18px\")\n        .style(\"font-weight\", \"bold\");\n      for (var ring = 0; ring < 4; ring++) {\n        legend.append(\"text\")\n          .attr(\"class\", \"radar-rings-name\")\n          .attr(\"transform\", legend_transform(quadrant, ring))\n          .text(config.rings[ring].name)\n          .style(\"font-family\", \"Arial, Helvetica\")\n          .style(\"font-size\", \"12px\")\n          .style(\"font-weight\", \"bold\")\n          .style(\"fill\", config.rings[ring].color);\n        legend.selectAll(\".legend\" + quadrant + ring)\n          .data(segmented[quadrant][ring])\n          .enter()\n            .append(\"a\")\n              .attr(\"href\", function (d, i) {\n                 return d.link ? d.link : \"#\"; // stay on same page if no link was provided\n              })\n              // Add a target if (and only if) there is a link and we want new tabs\n              .attr(\"target\", function (d, i) {\n                 return (d.link && config.links_in_new_tabs) ? \"_blank\" : null;\n              })\n            .append(\"text\")\n              .attr(\"transform\", function(d, i) { return legend_transform(quadrant, ring, i); })\n              .attr(\"class\", \"legend\" + quadrant + ring)\n              .attr(\"id\", function(d, i) { return \"legendItem\" + d.id; })\n              .text(function(d, i) { return d.id + \". \" + d.label; })\n              .style(\"font-family\", \"Arial, Helvetica\")\n              .style(\"font-size\", \"11px\")\n              .on(\"mouseover\", function(d) { showBubble(d); highlightLegendItem(d); })\n              .on(\"mouseout\", function(d) { hideBubble(d); unhighlightLegendItem(d); });\n      }\n    }\n  }\n\n  // layer for entries\n  var rink = radar.append(\"g\")\n    .attr(\"id\", \"rink\");\n\n  // rollover bubble (on top of everything else)\n  var bubble = radar.append(\"g\")\n    .attr(\"id\", \"bubble\")\n    .attr(\"x\", 0)\n    .attr(\"y\", 0)\n    .style(\"opacity\", 0)\n    .style(\"pointer-events\", \"none\")\n    .style(\"user-select\", \"none\");\n  bubble.append(\"rect\")\n    .attr(\"rx\", 4)\n    .attr(\"ry\", 4)\n    .style(\"fill\", \"#333\");\n  bubble.append(\"text\")\n    .style(\"font-family\", \"sans-serif\")\n    .style(\"font-size\", \"10px\")\n    .style(\"fill\", \"#fff\");\n  bubble.append(\"path\")\n    .attr(\"d\", \"M 0,0 10,0 5,8 z\")\n    .style(\"fill\", \"#333\");\n\n  function showBubble(d) {\n    if (d.active || config.print_layout) {\n      var tooltip = d3.select(\"#bubble text\")\n        .text(d.label);\n      var bbox = tooltip.node().getBBox();\n      d3.select(\"#bubble\")\n        .attr(\"transform\", translate(d.x - bbox.width / 2, d.y - 16))\n        .style(\"opacity\", 0.8);\n      d3.select(\"#bubble rect\")\n        .attr(\"x\", -5)\n        .attr(\"y\", -bbox.height)\n        .attr(\"width\", bbox.width + 10)\n        .attr(\"height\", bbox.height + 4);\n      d3.select(\"#bubble path\")\n        .attr(\"transform\", translate(bbox.width / 2 - 5, 3));\n    }\n  }\n\n  function hideBubble(d) {\n    var bubble = d3.select(\"#bubble\")\n      .attr(\"transform\", translate(0,0))\n      .style(\"opacity\", 0);\n  }\n\n  function highlightLegendItem(d) {\n    var legendItem = document.getElementById(\"legendItem\" + d.id);\n    legendItem.setAttribute(\"filter\", \"url(#solid)\");\n    legendItem.setAttribute(\"fill\", \"white\");\n  }\n\n  function unhighlightLegendItem(d) {\n    var legendItem = document.getElementById(\"legendItem\" + d.id);\n    legendItem.removeAttribute(\"filter\");\n    legendItem.removeAttribute(\"fill\");\n  }\n\n  // draw blips on radar\n  var blips = rink.selectAll(\".blip\")\n    .data(config.entries)\n    .enter()\n      .append(\"g\")\n        .attr(\"class\", \"blip\")\n        .attr(\"transform\", function(d, i) { return legend_transform(d.quadrant, d.ring, i); })\n        .on(\"mouseover\", function(d) { showBubble(d); highlightLegendItem(d); })\n        .on(\"mouseout\", function(d) { hideBubble(d); unhighlightLegendItem(d); });\n\n  // configure each blip\n  blips.each(function(d) {\n    var blip = d3.select(this);\n\n    // blip link\n    if (d.active && Object.prototype.hasOwnProperty.call(d, \"link\") && d.link) {\n      blip = blip.append(\"a\")\n        .attr(\"xlink:href\", d.link);\n\n      if (config.links_in_new_tabs) {\n        blip.attr(\"target\", \"_blank\");\n      }\n    }\n\n    // blip shape\n    if (d.moved > 0) {\n      blip.append(\"path\")\n        .attr(\"d\", \"M -11,5 11,5 0,-13 z\") // triangle pointing up\n        .style(\"fill\", d.color);\n    } else if (d.moved < 0) {\n      blip.append(\"path\")\n        .attr(\"d\", \"M -11,-5 11,-5 0,13 z\") // triangle pointing down\n        .style(\"fill\", d.color);\n    } else {\n      blip.append(\"circle\")\n        .attr(\"r\", 9)\n        .attr(\"fill\", d.color);\n    }\n\n    // blip text\n    if (d.active || config.print_layout) {\n      var blip_text = config.print_layout ? d.id : d.label.match(/[a-z]/i);\n      blip.append(\"text\")\n        .text(blip_text)\n        .attr(\"y\", 3)\n        .attr(\"text-anchor\", \"middle\")\n        .style(\"fill\", \"#fff\")\n        .style(\"font-family\", \"Arial, Helvetica\")\n        .style(\"font-size\", function(d) { return blip_text.length > 2 ? \"8px\" : \"9px\"; })\n        .style(\"pointer-events\", \"none\")\n        .style(\"user-select\", \"none\");\n    }\n  });\n\n  // make sure that blips stay inside their segment\n  function ticked() {\n    blips.attr(\"transform\", function(d) {\n      return translate(d.segment.clipx(d), d.segment.clipy(d));\n    })\n  }\n\n  // distribute blips, while avoiding collisions\n  d3.forceSimulation()\n    .nodes(config.entries)\n    .velocityDecay(0.19) // magic number (found by experimentation)\n    .force(\"collision\", d3.forceCollide().radius(12).strength(0.85))\n    .on(\"tick\", ticked);\n}\n"],"mappings":"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","names":["cartesian","polar","point","quadrant","ring","i","bubble","d"]}