@carbon/charts 0.30.24 → 0.30.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +330 -1052
- package/README.md +3 -0
- package/axis-chart.js +8 -14
- package/axis-chart.js.map +1 -1
- package/build/demo/{data/create-codesandbox.d.ts → create-codesandbox.d.ts} +16 -13
- package/build/demo/data/bar.d.ts +1 -1
- package/build/demo/data/line.d.ts +1 -1
- package/build/src/interfaces/axis-scales.d.ts +11 -11
- package/build/src/interfaces/charts.d.ts +1 -0
- package/bundle.js +1 -1
- package/chart.js +15 -24
- package/chart.js.map +1 -1
- package/charts/bar-grouped.js +3 -1
- package/charts/bar-grouped.js.map +1 -1
- package/charts/bar-simple.js +3 -1
- package/charts/bar-simple.js.map +1 -1
- package/charts/bar-stacked.js +3 -1
- package/charts/bar-stacked.js.map +1 -1
- package/charts/bubble.js +3 -1
- package/charts/bubble.js.map +1 -1
- package/charts/donut.js +3 -1
- package/charts/donut.js.map +1 -1
- package/charts/line.js +3 -1
- package/charts/line.js.map +1 -1
- package/charts/pie.js +3 -1
- package/charts/pie.js.map +1 -1
- package/charts/radar.js +1 -3
- package/charts/radar.js.map +1 -1
- package/charts/scatter.js +3 -1
- package/charts/scatter.js.map +1 -1
- package/components/axes/axis.js +72 -33
- package/components/axes/axis.js.map +1 -1
- package/components/axes/grid.js +23 -18
- package/components/axes/grid.js.map +1 -1
- package/components/axes/ruler.js +7 -5
- package/components/axes/ruler.js.map +1 -1
- package/components/axes/two-dimensional-axes.js +5 -2
- package/components/axes/two-dimensional-axes.js.map +1 -1
- package/components/axes/zero-line.js +2 -1
- package/components/axes/zero-line.js.map +1 -1
- package/components/component.js +2 -4
- package/components/component.js.map +1 -1
- package/components/essentials/legend.js +46 -23
- package/components/essentials/legend.js.map +1 -1
- package/components/essentials/threshold.js +11 -5
- package/components/essentials/threshold.js.map +1 -1
- package/components/essentials/title.js +6 -4
- package/components/essentials/title.js.map +1 -1
- package/components/essentials/tooltip-bar.js +39 -20
- package/components/essentials/tooltip-bar.js.map +1 -1
- package/components/essentials/tooltip-pie.js +4 -3
- package/components/essentials/tooltip-pie.js.map +1 -1
- package/components/essentials/tooltip-radar.js +6 -3
- package/components/essentials/tooltip-radar.js.map +1 -1
- package/components/essentials/tooltip-scatter.js +3 -1
- package/components/essentials/tooltip-scatter.js.map +1 -1
- package/components/essentials/tooltip.js +35 -15
- package/components/essentials/tooltip.js.map +1 -1
- package/components/graphs/bar-grouped.js +46 -20
- package/components/graphs/bar-grouped.js.map +1 -1
- package/components/graphs/bar-simple.js +39 -19
- package/components/graphs/bar-simple.js.map +1 -1
- package/components/graphs/bar-stacked.js +50 -28
- package/components/graphs/bar-stacked.js.map +1 -1
- package/components/graphs/bar.js.map +1 -1
- package/components/graphs/bubble.js +22 -8
- package/components/graphs/bubble.js.map +1 -1
- package/components/graphs/donut.js +12 -4
- package/components/graphs/donut.js.map +1 -1
- package/components/graphs/line.js +14 -7
- package/components/graphs/line.js.map +1 -1
- package/components/graphs/pie.js +80 -44
- package/components/graphs/pie.js.map +1 -1
- package/components/graphs/radar.js +271 -140
- package/components/graphs/radar.js.map +1 -1
- package/components/graphs/scatter.js +54 -21
- package/components/graphs/scatter.js.map +1 -1
- package/components/graphs/skeleton.js +29 -14
- package/components/graphs/skeleton.js.map +1 -1
- package/components/layout/layout.js +38 -26
- package/components/layout/layout.js.map +1 -1
- package/components/layout/spacer.js +2 -1
- package/components/layout/spacer.js.map +1 -1
- package/configuration.js +15 -13
- package/configuration.js.map +1 -1
- package/demo/{data/create-codesandbox.d.ts → create-codesandbox.d.ts} +16 -13
- package/demo/{data/create-codesandbox.js → create-codesandbox.js} +24 -21
- package/demo/create-codesandbox.js.map +1 -0
- package/demo/data/bar.d.ts +1 -1
- package/demo/data/bar.js +1 -1
- package/demo/data/bar.js.map +1 -1
- package/demo/data/bubble.js +5 -3
- package/demo/data/bubble.js.map +1 -1
- package/demo/data/bundle.js +1 -1
- package/demo/data/index.js +12 -7
- package/demo/data/index.js.map +1 -1
- package/demo/data/line.d.ts +1 -1
- package/demo/data/line.js +2 -4
- package/demo/data/line.js.map +1 -1
- package/demo/data/radar.js.map +1 -1
- package/demo/data/time-series-axis.js +1 -3
- package/demo/data/time-series-axis.js.map +1 -1
- package/demo/styles.css +50 -18
- package/demo/styles.css.map +1 -1
- package/demo/styles.min.css +1 -1
- package/demo/styles.min.css.map +1 -1
- package/demo/tsconfig.tsbuildinfo +68 -68
- package/index.js.map +1 -1
- package/interfaces/axis-scales.d.ts +11 -11
- package/interfaces/axis-scales.js.map +1 -1
- package/interfaces/charts.d.ts +1 -0
- package/interfaces/charts.js.map +1 -1
- package/interfaces/components.js.map +1 -1
- package/interfaces/enums.js.map +1 -1
- package/model.js +27 -16
- package/model.js.map +1 -1
- package/package.json +4 -2
- package/polyfills.js +7 -2
- package/polyfills.js.map +1 -1
- package/services/angle-utils.js +34 -9
- package/services/angle-utils.js.map +1 -1
- package/services/colors.js.map +1 -1
- package/services/curves.js +4 -2
- package/services/curves.js.map +1 -1
- package/services/essentials/dom-utils.js +4 -3
- package/services/essentials/dom-utils.js.map +1 -1
- package/services/essentials/transitions.js +3 -4
- package/services/essentials/transitions.js.map +1 -1
- package/services/scales-cartesian.js +63 -23
- package/services/scales-cartesian.js.map +1 -1
- package/services/time-series.js +28 -12
- package/services/time-series.js.map +1 -1
- package/styles/components/_axis.scss +4 -0
- package/styles/components/_layout.scss +0 -1
- package/styles/components/_ruler.scss +5 -2
- package/styles/components/_skeleton.scss +2 -3
- package/styles/components/_threshold.scss +2 -2
- package/styles/components/_tooltip.scss +6 -5
- package/styles/graphs/_bubble.scss +1 -1
- package/styles/graphs/_radar.scss +4 -2
- package/styles/graphs/_scatter.scss +1 -1
- package/styles/mixins.scss +2 -2
- package/styles-g10.css +11 -4
- package/styles-g10.css.map +1 -1
- package/styles-g10.min.css +1 -1
- package/styles-g10.min.css.map +1 -1
- package/styles-g100.css +11 -4
- package/styles-g100.css.map +1 -1
- package/styles-g100.min.css +1 -1
- package/styles-g100.min.css.map +1 -1
- package/styles-g90.css +11 -4
- package/styles-g90.css.map +1 -1
- package/styles-g90.min.css +1 -1
- package/styles-g90.min.css.map +1 -1
- package/styles.css +11 -4
- package/styles.css.map +1 -1
- package/styles.min.css +1 -1
- package/styles.min.css.map +1 -1
- package/tools.js +19 -7
- package/tools.js.map +1 -1
- package/tsconfig.tsbuildinfo +56 -56
- package/demo/data/create-codesandbox.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radar.js","sourceRoot":"","sources":["radar.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\nimport { DOMUtils } from \"../../services\";\nimport { Events, TooltipTypes, Roles } from \"../../interfaces\";\nimport { Tools } from \"../../tools\";\nimport {\n\tPoint,\n\tAngle,\n\tradialLabelPlacement,\n\tradToDeg,\n\tpolarToCartesianCoords,\n\tdistanceBetweenPointOnCircAndVerticalDiameter\n} from \"../../services/angle-utils\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { scaleBand, scaleLinear, ScaleLinear } from \"d3-scale\";\nimport { max, extent } from \"d3-array\";\nimport { lineRadial, curveLinearClosed } from \"d3-shape\";\n\n// used to make transitions\nlet oldYScale: ScaleLinear<number, number>;\n\nexport class Radar extends Component {\n\ttype = \"radar\";\n\tsvg: SVGElement;\n\tgroupMapsTo: string;\n\tuniqueKeys: string[];\n\tuniqueGroups: string[];\n\tdisplayDataNormalized: any;\n\tgroupedDataNormalized: any;\n\n\tinit() {\n\t\tconst { events } = this.services;\n\t\t// Highlight correct line legend item hovers\n\t\tevents.addEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\t// Un-highlight lines on legend item mouseouts\n\t\tevents.addEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n\n\trender(animate = true) {\n\t\tthis.svg = this.getContainerSVG();\n\t\tconst { width, height } = DOMUtils.getSVGElementSize(this.parent, { useAttrs: true });\n\n\t\tconst data = this.model.getData();\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst groupedData = this.model.getGroupedData();\n\t\tconst options = this.model.getOptions();\n\t\tconst { angle, value } = Tools.getProperty(options, \"radar\", \"axes\");\n\t\tconst groupMapsTo = Tools.getProperty(options, \"data\", \"groupMapsTo\");\n\t\tconst { xLabelPadding, yLabelPadding, yTicksNumber, minRange, xAxisRectHeight, opacity } = Tools.getProperty(options, \"radar\");\n\n\t\tthis.uniqueKeys = Array.from(new Set(data.map(d => d[angle])));\n\t\tthis.uniqueGroups = Array.from(new Set(data.map(d => d[groupMapsTo])));\n\t\tthis.displayDataNormalized = this.normalizeFlatData(displayData);\n\t\tthis.groupedDataNormalized = this.normalizeGroupedData(groupedData);\n\n\t\tconst labelHeight = this.getLabelDimensions(this.uniqueKeys[0]).height;\n\t\tconst margin = 2 * (labelHeight + yLabelPadding);\n\t\tconst size = Math.min(width, height);\n\t\tconst diameter = size - margin;\n\t\tconst radius = diameter / 2;\n\n\t\tif (radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// given a key, return the corresponding angle in radiants\n\t\t// rotated by -PI/2 because we want angle 0° at -y (12 o’clock)\n\t\tconst xScale = scaleBand<string>()\n\t\t\t.domain(this.displayDataNormalized.map(d => d[angle]))\n\t\t\t.range([0, 2 * Math.PI].map(a => a - Math.PI / 2) as [Angle, Angle]);\n\n\t\tconst yScale = scaleLinear()\n\t\t\t.domain([0, max(this.displayDataNormalized.map(d => d[value]) as number[])])\n\t\t\t.range([minRange, radius])\n\t\t\t.nice(yTicksNumber);\n\t\tconst yTicks = yScale.ticks(yTicksNumber);\n\n\t\tconst colorScale = (group: string): string => this.model.getFillColor(group);\n\n\t\t// constructs a new radial line generator\n\t\t// the angle accessor returns the angle in radians with 0° at -y (12 o’clock)\n\t\t// so map back the angle\n\t\tconst radialLineGenerator = lineRadial<any>()\n\t\t\t.angle(d => xScale(d[angle]) + Math.PI / 2)\n\t\t\t.radius(d => yScale(d[value]))\n\t\t\t.curve(curveLinearClosed);\n\n\t\t// this line generator is necessary in order to make a transition of a value from the\n\t\t// position it occupies using the old scale to the position it occupies using the new scale\n\t\tconst oldRadialLineGenerator = lineRadial<any>()\n\t\t\t.angle(radialLineGenerator.angle())\n\t\t\t.radius(d => oldYScale ? oldYScale(d[value]) : minRange)\n\t\t\t.curve(radialLineGenerator.curve());\n\n\t\t// compute the space that each x label needs\n\t\tconst horizSpaceNeededByEachXLabel = this.uniqueKeys.map(key => {\n\t\t\tconst tickWidth = this.getLabelDimensions(key).width;\n\t\t\t// compute the distance between the point that the label rapresents and the vertical diameter\n\t\t\tconst distanceFromDiameter = distanceBetweenPointOnCircAndVerticalDiameter(xScale(key), radius);\n\t\t\t// the space each label occupies is the sum of these two values\n\t\t\treturn tickWidth + distanceFromDiameter;\n\t\t});\n\t\tconst leftPadding = max(horizSpaceNeededByEachXLabel);\n\n\t\t// center coordinates\n\t\tconst c: Point = {\n\t\t\tx: leftPadding + xLabelPadding,\n\t\t\ty: height / 2\n\t\t};\n\n\t\t/////////////////////////////\n\t\t// Drawing the radar\n\t\t/////////////////////////////\n\n\t\t// y axes\n\t\tconst yAxes = DOMUtils.appendOrSelect(this.svg, \"g.y-axes\").attr(\"role\", Roles.GROUP);\n\t\tconst yAxisUpdate = yAxes.selectAll(\"path\").data(yTicks, tick => tick);\n\t\t// for each tick, create array of data corresponding to the points composing the shape\n\t\tconst shapeData = (tick: number) => this.uniqueKeys.map(key => ({ [angle]: key, [value]: tick }));\n\t\tyAxisUpdate.join(\n\t\t\tenter => enter\n\t\t\t\t.append(\"path\")\n\t\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t.attr(\"fill\", \"none\")\n\t\t\t\t.attr(\"d\", tick => oldRadialLineGenerator(shapeData(tick)))\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_y_axes_enter\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"d\", tick => radialLineGenerator(shapeData(tick)))\n\t\t\t\t),\n\t\t\tupdate => update\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_y_axes_update\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t\t.attr(\"d\", tick => radialLineGenerator(shapeData(tick)))\n\t\t\t\t),\n\t\t\texit => exit\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_y_axes_exit\", animate))\n\t\t\t\t\t.attr(\"d\", tick => radialLineGenerator(shapeData(tick)))\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// y labels (show only the min and the max labels)\n\t\tconst yLabels = DOMUtils.appendOrSelect(this.svg, \"g.y-labels\").attr(\"role\", Roles.GROUP);\n\t\tconst yLabelUpdate = yLabels.selectAll(\"text\").data(extent(yTicks));\n\t\tyLabelUpdate.join(\n\t\t\tenter => enter\n\t\t\t\t.append(\"text\")\n\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t.text(tick => tick)\n\t\t\t\t.attr(\"x\", tick => polarToCartesianCoords(- Math.PI / 2, yScale(tick), c).x + yLabelPadding)\n\t\t\t\t.attr(\"y\", tick => polarToCartesianCoords(- Math.PI / 2, yScale(tick), c).y)\n\t\t\t\t.style(\"text-anchor\", \"start\")\n\t\t\t\t.style(\"dominant-baseline\", \"middle\")\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_y_labels_enter\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t),\n\t\t\tupdate => update\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_y_labels_update\", animate))\n\t\t\t\t\t.text(tick => tick)\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"x\", tick => polarToCartesianCoords(- Math.PI / 2, yScale(tick), c).x + yLabelPadding)\n\t\t\t\t\t.attr(\"y\", tick => polarToCartesianCoords(- Math.PI / 2, yScale(tick), c).y)\n\t\t\t\t),\n\t\t\texit => exit\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_y_labels_exit\", animate))\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// x axes\n\t\tconst xAxes = DOMUtils.appendOrSelect(this.svg, \"g.x-axes\").attr(\"role\", Roles.GROUP);\n\t\tconst xAxisUpdate = xAxes.selectAll(\"line\").data(this.uniqueKeys, key => key);\n\t\txAxisUpdate.join(\n\t\t\tenter => enter\n\t\t\t\t.append(\"line\")\n\t\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t.attr(\"class\", key => `x-axis-${Tools.kebabCase(key)}`) // replace spaces with -\n\t\t\t\t.attr(\"stroke-dasharray\", \"0\")\n\t\t\t\t.attr(\"x1\", key => polarToCartesianCoords(xScale(key), 0, c).x)\n\t\t\t\t.attr(\"y1\", key => polarToCartesianCoords(xScale(key), 0, c).y)\n\t\t\t\t.attr(\"x2\", key => polarToCartesianCoords(xScale(key), 0, c).x)\n\t\t\t\t.attr(\"y2\", key => polarToCartesianCoords(xScale(key), 0, c).y)\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_x_axes_enter\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"x1\", key => polarToCartesianCoords(xScale(key), yScale.range()[0], c).x)\n\t\t\t\t\t.attr(\"y1\", key => polarToCartesianCoords(xScale(key), yScale.range()[0], c).y)\n\t\t\t\t\t.attr(\"x2\", key => polarToCartesianCoords(xScale(key), yScale.range()[1], c).x)\n\t\t\t\t\t.attr(\"y2\", key => polarToCartesianCoords(xScale(key), yScale.range()[1], c).y)\n\t\t\t\t),\n\t\t\tupdate => update\n\t\t\t.call(selection => selection\n\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_x_axes_update\", animate))\n\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t.attr(\"x1\", key => polarToCartesianCoords(xScale(key), yScale.range()[0], c).x)\n\t\t\t\t.attr(\"y1\", key => polarToCartesianCoords(xScale(key), yScale.range()[0], c).y)\n\t\t\t\t.attr(\"x2\", key => polarToCartesianCoords(xScale(key), yScale.range()[1], c).x)\n\t\t\t\t.attr(\"y2\", key => polarToCartesianCoords(xScale(key), yScale.range()[1], c).y)\n\t\t\t\t),\n\t\t\texit => exit\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_x_axes_exit\", animate))\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// x labels\n\t\tconst xLabels = DOMUtils.appendOrSelect(this.svg, \"g.x-labels\").attr(\"role\", Roles.GROUP);\n\t\tconst xLabelUpdate = xLabels.selectAll(\"text\").data(this.uniqueKeys);\n\t\txLabelUpdate.join(\n\t\t\tenter => enter\n\t\t\t\t.append(\"text\")\n\t\t\t\t.text(key => key)\n\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t.attr(\"x\", key => polarToCartesianCoords(xScale(key), yScale.range()[1] + xLabelPadding, c).x)\n\t\t\t\t.attr(\"y\", key => polarToCartesianCoords(xScale(key), yScale.range()[1] + xLabelPadding, c).y)\n\t\t\t\t.style(\"text-anchor\", key => radialLabelPlacement(xScale(key)).textAnchor)\n\t\t\t\t.style(\"dominant-baseline\", key => radialLabelPlacement(xScale(key)).dominantBaseline)\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_x_labels_enter\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t),\n\t\t\tupdate => update\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_x_labels_update\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"x\", key => polarToCartesianCoords(xScale(key), yScale.range()[1] + xLabelPadding, c).x)\n\t\t\t\t\t.attr(\"y\", key => polarToCartesianCoords(xScale(key), yScale.range()[1] + xLabelPadding, c).y)\n\t\t\t\t),\n\t\t\texit => exit\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_x_labels_exit\", animate))\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// blobs\n\t\tconst blobs = DOMUtils.appendOrSelect(this.svg, \"g.blobs\").attr(\"role\", Roles.GROUP);\n\t\tconst blobUpdate = blobs.selectAll(\"path\").data(this.groupedDataNormalized, group => group.name);\n\t\tblobUpdate.join(\n\t\t\tenter => enter\n\t\t\t\t.append(\"path\")\n\t\t\t\t.attr(\"class\", \"blob\")\n\t\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t.attr(\"fill\", group => colorScale(group.name))\n\t\t\t\t.style(\"fill-opacity\", opacity.selected)\n\t\t\t\t.attr(\"stroke\", group => colorScale(group.name))\n\t\t\t\t.attr(\"d\", group => oldRadialLineGenerator(group.data))\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_blobs_enter\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"d\", group => radialLineGenerator(group.data))\n\t\t\t\t),\n\t\t\tupdate => update\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_blobs_update\", animate))\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t\t.attr(\"d\", group => radialLineGenerator(group.data))\n\t\t\t\t),\n\t\t\texit => exit\n\t\t\t\t.call(selection => selection\n\t\t\t\t\t.transition(this.services.transitions.getTransition(\"radar_blobs_exit\", animate))\n\t\t\t\t\t.attr(\"d\", group => radialLineGenerator(group.data))\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// data dots\n\t\tconst dots = DOMUtils.appendOrSelect(this.svg, \"g.dots\").attr(\"role\", Roles.GROUP);\n\t\tconst dotsUpdate = dots.selectAll(\"circle\").data(this.displayDataNormalized);\n\t\tdotsUpdate.join(\n\t\t\tenter => enter.append(\"circle\").attr(\"role\", Roles.GRAPHICS_SYMBOL),\n\t\t\tupdate => update,\n\t\t\texit => exit.remove()\n\t\t)\n\t\t.attr(\"class\", d => Tools.kebabCase(d[angle]))\n\t\t.attr(\"cx\", d => polarToCartesianCoords(xScale(d[angle]), yScale(d[value]), c).x)\n\t\t.attr(\"cy\", d => polarToCartesianCoords(xScale(d[angle]), yScale(d[value]), c).y)\n\t\t.attr(\"r\", 0)\n\t\t.attr(\"opacity\", 0)\n\t\t.attr(\"fill\", d => colorScale(d[groupMapsTo]));\n\n\t\t// rectangles\n\t\tconst xAxesRect = DOMUtils.appendOrSelect(this.svg, \"g.x-axes-rect\").attr(\"role\", Roles.GROUP);\n\t\tconst xAxisRectUpdate = xAxesRect.selectAll(\"rect\").data(this.uniqueKeys);\n\t\txAxisRectUpdate.join(\n\t\t\tenter => enter.append(\"rect\").attr(\"role\", Roles.GRAPHICS_SYMBOL),\n\t\t\tupdate => update,\n\t\t\texit => exit.remove()\n\t\t)\n\t\t.attr(\"x\", c.x)\n\t\t.attr(\"y\", c.y - xAxisRectHeight / 2)\n\t\t.attr(\"width\", yScale.range()[1])\n\t\t.attr(\"height\", xAxisRectHeight)\n\t\t.attr(\"fill\", \"red\")\n\t\t.style(\"fill-opacity\", 0)\n\t\t.attr(\"transform\", key => `rotate(${radToDeg(xScale(key))}, ${c.x}, ${c.y})`);\n\n\t\t// Add event listeners\n\t\tthis.addEventListeners();\n\n\t\toldYScale = yScale; // save the current scale as the old one\n\t}\n\n\t// append temporarily the label to get the exact space that it occupies\n\tgetLabelDimensions = (label: string) => {\n\t\tconst tmpTick = DOMUtils.appendOrSelect(this.svg, `g.tmp-tick`);\n\t\tconst tmpTickText = DOMUtils.appendOrSelect(tmpTick, `text`).text(label);\n\t\tconst { width, height } = DOMUtils.getSVGElementSize(tmpTickText.node(), { useBBox: true });\n\t\ttmpTick.remove();\n\t\treturn { width, height };\n\t}\n\n\t// Given a flat array of objects, if there are missing data on key,\n\t// creates corresponding data with value = null\n\tnormalizeFlatData = (dataset: any) => {\n\t\tconst options = this.model.getOptions();\n\t\tconst { angle, value } = Tools.getProperty(options, \"radar\", \"axes\");\n\t\tconst groupMapsTo = Tools.getProperty(options, \"data\", \"groupMapsTo\");\n\t\tconst completeBlankData = Tools.flatMapDeep(this.uniqueKeys.map(key => {\n\t\t\treturn this.uniqueGroups.map(group => ({ [angle]: key, [groupMapsTo]: group, [value]: null }));\n\t\t}));\n\t\treturn Tools.merge(completeBlankData, dataset);\n\t}\n\n\t// Given a a grouped array of objects, if there are missing data on key,\n\t// creates corresponding data with value = null\n\tnormalizeGroupedData = (dataset: any) => {\n\t\tconst options = this.model.getOptions();\n\t\tconst { angle, value } = Tools.getProperty(options, \"radar\", \"axes\");\n\t\tconst groupMapsTo = Tools.getProperty(options, \"data\", \"groupMapsTo\");\n\t\treturn dataset.map(({ name, data }) => {\n\t\t\tconst completeBlankData = this.uniqueKeys.map(k => ({ [groupMapsTo]: name, [angle]: k, [value]: null }));\n\t\t\treturn { name, data: Tools.merge(completeBlankData, data) };\n\t\t});\n\t}\n\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\t\tconst opacity = Tools.getProperty(this.model.getOptions(), \"radar\", \"opacity\");\n\t\tthis.parent.selectAll(\"g.blobs path\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-hover-blob\"))\n\t\t\t.style(\"fill-opacity\", group => {\n\t\t\t\tif (group.name !== hoveredElement.datum().name) {\n\t\t\t\t\treturn Tools.getProperty(opacity, \"unselected\");\n\t\t\t\t}\n\t\t\t\treturn Tools.getProperty(opacity, \"selected\");\n\t\t\t});\n\t}\n\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tconst opacity = Tools.getProperty(this.model.getOptions(), \"radar\", \"opacity\");\n\t\tthis.parent.selectAll(\"g.blobs path\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-mouseout-blob\"))\n\t\t\t.style(\"fill-opacity\", Tools.getProperty(opacity, \"selected\"));\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent.selectAll(\".x-axes-rect > rect\")\n\t\t\t.on(\"mouseover\", null)\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\teventsFragment.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n\n\taddEventListeners() {\n\t\tconst self = this;\n\t\tconst { axes: { angle }, dotsRadius } = Tools.getProperty(this.model.getOptions(), \"radar\");\n\n\t\t// events on x axes rects\n\t\tthis.parent.selectAll(\".x-axes-rect > rect\")\n\t\t\t.on(\"mouseover\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Radar.X_AXIS_MOUSEOVER, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mousemove\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\tconst axisLine = self.parent.select(`.x-axes .x-axis-${Tools.kebabCase(datum)}`);\n\t\t\t\tconst dots = self.parent.selectAll(`.dots circle.${Tools.kebabCase(datum)}`);\n\n\t\t\t\t// Change style\n\t\t\t\taxisLine.classed(\"hovered\", true)\n\t\t\t\t\t.attr(\"stroke-dasharray\", \"4 4\");\n\t\t\t\tdots.classed(\"hovered\", true)\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"r\", dotsRadius);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Radar.X_AXIS_MOUSEMOVE, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// get the items that should be highlighted\n\t\t\t\tconst itemsToHighlight = self.displayDataNormalized.filter(d => d[angle] === datum);\n\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\thoveredElement,\n\t\t\t\t\tmultidata: itemsToHighlight,\n\t\t\t\t\ttype: TooltipTypes.GRIDLINE\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Radar.X_AXIS_CLICK, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\tconst axisLine = self.parent.select(`.x-axes .x-axis-${Tools.kebabCase(datum)}`);\n\t\t\t\tconst dots = self.parent.selectAll(`.dots circle.${Tools.kebabCase(datum)}`);\n\n\t\t\t\t// Change style\n\t\t\t\taxisLine.classed(\"hovered\", false)\n\t\t\t\t\t.attr(\"stroke-dasharray\", \"0\");\n\t\t\t\tdots.classed(\"hovered\", false)\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.attr(\"r\", 0);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Radar.X_AXIS_MOUSEOUT, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(\"hide-tooltip\", { hoveredElement });\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, { hoveredElement });\n\t\t\t});\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"radar.js","sourceRoot":"","sources":["radar.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\nimport { DOMUtils } from \"../../services\";\nimport { Events, TooltipTypes, Roles } from \"../../interfaces\";\nimport { Tools } from \"../../tools\";\nimport {\n\tPoint,\n\tAngle,\n\tradialLabelPlacement,\n\tradToDeg,\n\tpolarToCartesianCoords,\n\tdistanceBetweenPointOnCircAndVerticalDiameter\n} from \"../../services/angle-utils\";\n\n// D3 Imports\nimport { select } from \"d3-selection\";\nimport { scaleBand, scaleLinear, ScaleLinear } from \"d3-scale\";\nimport { max, extent } from \"d3-array\";\nimport { lineRadial, curveLinearClosed } from \"d3-shape\";\n\n// used to make transitions\nlet oldYScale: ScaleLinear<number, number>;\n\nexport class Radar extends Component {\n\ttype = \"radar\";\n\tsvg: SVGElement;\n\tgroupMapsTo: string;\n\tuniqueKeys: string[];\n\tuniqueGroups: string[];\n\tdisplayDataNormalized: any;\n\tgroupedDataNormalized: any;\n\n\tinit() {\n\t\tconst { events } = this.services;\n\t\t// Highlight correct line legend item hovers\n\t\tevents.addEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\t\t// Un-highlight lines on legend item mouseouts\n\t\tevents.addEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n\n\trender(animate = true) {\n\t\tthis.svg = this.getContainerSVG();\n\t\tconst { width, height } = DOMUtils.getSVGElementSize(this.parent, {\n\t\t\tuseAttrs: true\n\t\t});\n\n\t\tconst data = this.model.getData();\n\t\tconst displayData = this.model.getDisplayData();\n\t\tconst groupedData = this.model.getGroupedData();\n\t\tconst options = this.model.getOptions();\n\t\tconst { angle, value } = Tools.getProperty(options, \"radar\", \"axes\");\n\t\tconst groupMapsTo = Tools.getProperty(options, \"data\", \"groupMapsTo\");\n\t\tconst {\n\t\t\txLabelPadding,\n\t\t\tyLabelPadding,\n\t\t\tyTicksNumber,\n\t\t\tminRange,\n\t\t\txAxisRectHeight,\n\t\t\topacity\n\t\t} = Tools.getProperty(options, \"radar\");\n\n\t\tthis.uniqueKeys = Array.from(new Set(data.map(d => d[angle])));\n\t\tthis.uniqueGroups = Array.from(new Set(data.map(d => d[groupMapsTo])));\n\t\tthis.displayDataNormalized = this.normalizeFlatData(displayData);\n\t\tthis.groupedDataNormalized = this.normalizeGroupedData(groupedData);\n\n\t\tconst labelHeight = this.getLabelDimensions(this.uniqueKeys[0]).height;\n\t\tconst margin = 2 * (labelHeight + yLabelPadding);\n\t\tconst size = Math.min(width, height);\n\t\tconst diameter = size - margin;\n\t\tconst radius = diameter / 2;\n\n\t\tif (radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// given a key, return the corresponding angle in radiants\n\t\t// rotated by -PI/2 because we want angle 0° at -y (12 o’clock)\n\t\tconst xScale = scaleBand<string>()\n\t\t\t.domain(this.displayDataNormalized.map(d => d[angle]))\n\t\t\t.range(\n\t\t\t\t[0, 2 * Math.PI].map(a => a - Math.PI / 2) as [Angle, Angle]\n\t\t\t);\n\n\t\tconst yScale = scaleLinear()\n\t\t\t.domain([\n\t\t\t\t0,\n\t\t\t\tmax(this.displayDataNormalized.map(d => d[value]) as number[])\n\t\t\t])\n\t\t\t.range([minRange, radius])\n\t\t\t.nice(yTicksNumber);\n\t\tconst yTicks = yScale.ticks(yTicksNumber);\n\n\t\tconst colorScale = (group: string): string =>\n\t\t\tthis.model.getFillColor(group);\n\n\t\t// constructs a new radial line generator\n\t\t// the angle accessor returns the angle in radians with 0° at -y (12 o’clock)\n\t\t// so map back the angle\n\t\tconst radialLineGenerator = lineRadial<any>()\n\t\t\t.angle(d => xScale(d[angle]) + Math.PI / 2)\n\t\t\t.radius(d => yScale(d[value]))\n\t\t\t.curve(curveLinearClosed);\n\n\t\t// this line generator is necessary in order to make a transition of a value from the\n\t\t// position it occupies using the old scale to the position it occupies using the new scale\n\t\tconst oldRadialLineGenerator = lineRadial<any>()\n\t\t\t.angle(radialLineGenerator.angle())\n\t\t\t.radius(d => (oldYScale ? oldYScale(d[value]) : minRange))\n\t\t\t.curve(radialLineGenerator.curve());\n\n\t\t// compute the space that each x label needs\n\t\tconst horizSpaceNeededByEachXLabel = this.uniqueKeys.map(key => {\n\t\t\tconst tickWidth = this.getLabelDimensions(key).width;\n\t\t\t// compute the distance between the point that the label rapresents and the vertical diameter\n\t\t\tconst distanceFromDiameter = distanceBetweenPointOnCircAndVerticalDiameter(\n\t\t\t\txScale(key),\n\t\t\t\tradius\n\t\t\t);\n\t\t\t// the space each label occupies is the sum of these two values\n\t\t\treturn tickWidth + distanceFromDiameter;\n\t\t});\n\t\tconst leftPadding = max(horizSpaceNeededByEachXLabel);\n\n\t\t// center coordinates\n\t\tconst c: Point = {\n\t\t\tx: leftPadding + xLabelPadding,\n\t\t\ty: height / 2\n\t\t};\n\n\t\t/////////////////////////////\n\t\t// Drawing the radar\n\t\t/////////////////////////////\n\n\t\t// y axes\n\t\tconst yAxes = DOMUtils.appendOrSelect(this.svg, \"g.y-axes\").attr(\n\t\t\t\"role\",\n\t\t\tRoles.GROUP\n\t\t);\n\t\tconst yAxisUpdate = yAxes.selectAll(\"path\").data(yTicks, tick => tick);\n\t\t// for each tick, create array of data corresponding to the points composing the shape\n\t\tconst shapeData = (tick: number) =>\n\t\t\tthis.uniqueKeys.map(key => ({ [angle]: key, [value]: tick }));\n\t\tyAxisUpdate.join(\n\t\t\tenter =>\n\t\t\t\tenter\n\t\t\t\t\t.append(\"path\")\n\t\t\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t\t.attr(\"fill\", \"none\")\n\t\t\t\t\t.attr(\"d\", tick => oldRadialLineGenerator(shapeData(tick)))\n\t\t\t\t\t.call(selection =>\n\t\t\t\t\t\tselection\n\t\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\t\"radar_y_axes_enter\",\n\t\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t\t.attr(\"d\", tick =>\n\t\t\t\t\t\t\t\tradialLineGenerator(shapeData(tick))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\tupdate =>\n\t\t\t\tupdate.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_y_axes_update\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t\t\t.attr(\"d\", tick => radialLineGenerator(shapeData(tick)))\n\t\t\t\t),\n\t\t\texit =>\n\t\t\t\texit.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_y_axes_exit\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"d\", tick => radialLineGenerator(shapeData(tick)))\n\t\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// y labels (show only the min and the max labels)\n\t\tconst yLabels = DOMUtils.appendOrSelect(this.svg, \"g.y-labels\").attr(\n\t\t\t\"role\",\n\t\t\tRoles.GROUP\n\t\t);\n\t\tconst yLabelUpdate = yLabels.selectAll(\"text\").data(extent(yTicks));\n\t\tyLabelUpdate.join(\n\t\t\tenter =>\n\t\t\t\tenter\n\t\t\t\t\t.append(\"text\")\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.text(tick => tick)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"x\",\n\t\t\t\t\t\ttick =>\n\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t-Math.PI / 2,\n\t\t\t\t\t\t\t\tyScale(tick),\n\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t).x + yLabelPadding\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"y\",\n\t\t\t\t\t\ttick =>\n\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t-Math.PI / 2,\n\t\t\t\t\t\t\t\tyScale(tick),\n\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t).y\n\t\t\t\t\t)\n\t\t\t\t\t.style(\"text-anchor\", \"start\")\n\t\t\t\t\t.style(\"dominant-baseline\", \"middle\")\n\t\t\t\t\t.call(selection =>\n\t\t\t\t\t\tselection\n\t\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\t\"radar_y_labels_enter\",\n\t\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t),\n\t\t\tupdate =>\n\t\t\t\tupdate.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_y_labels_update\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.text(tick => tick)\n\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"x\",\n\t\t\t\t\t\t\ttick =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\t-Math.PI / 2,\n\t\t\t\t\t\t\t\t\tyScale(tick),\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).x + yLabelPadding\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"y\",\n\t\t\t\t\t\t\ttick =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\t-Math.PI / 2,\n\t\t\t\t\t\t\t\t\tyScale(tick),\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).y\n\t\t\t\t\t\t)\n\t\t\t\t),\n\t\t\texit =>\n\t\t\t\texit.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_y_labels_exit\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// x axes\n\t\tconst xAxes = DOMUtils.appendOrSelect(this.svg, \"g.x-axes\").attr(\n\t\t\t\"role\",\n\t\t\tRoles.GROUP\n\t\t);\n\t\tconst xAxisUpdate = xAxes\n\t\t\t.selectAll(\"line\")\n\t\t\t.data(this.uniqueKeys, key => key);\n\t\txAxisUpdate.join(\n\t\t\tenter =>\n\t\t\t\tenter\n\t\t\t\t\t.append(\"line\")\n\t\t\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.attr(\"class\", key => `x-axis-${Tools.kebabCase(key)}`) // replace spaces with -\n\t\t\t\t\t.attr(\"stroke-dasharray\", \"0\")\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"x1\",\n\t\t\t\t\t\tkey => polarToCartesianCoords(xScale(key), 0, c).x\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"y1\",\n\t\t\t\t\t\tkey => polarToCartesianCoords(xScale(key), 0, c).y\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"x2\",\n\t\t\t\t\t\tkey => polarToCartesianCoords(xScale(key), 0, c).x\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"y2\",\n\t\t\t\t\t\tkey => polarToCartesianCoords(xScale(key), 0, c).y\n\t\t\t\t\t)\n\t\t\t\t\t.call(selection =>\n\t\t\t\t\t\tselection\n\t\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\t\"radar_x_axes_enter\",\n\t\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\t\"x1\",\n\t\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\t\tyScale.range()[0],\n\t\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t\t).x\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\t\"y1\",\n\t\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\t\tyScale.range()[0],\n\t\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t\t).y\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\t\"x2\",\n\t\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\t\tyScale.range()[1],\n\t\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t\t).x\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\t\"y2\",\n\t\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\t\tyScale.range()[1],\n\t\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t\t).y\n\t\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\tupdate =>\n\t\t\t\tupdate.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_x_axes_update\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"x1\",\n\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\tyScale.range()[0],\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).x\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"y1\",\n\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\tyScale.range()[0],\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).y\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"x2\",\n\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\tyScale.range()[1],\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).x\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"y2\",\n\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\tyScale.range()[1],\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).y\n\t\t\t\t\t\t)\n\t\t\t\t),\n\t\t\texit =>\n\t\t\t\texit.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_x_axes_exit\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// x labels\n\t\tconst xLabels = DOMUtils.appendOrSelect(this.svg, \"g.x-labels\").attr(\n\t\t\t\"role\",\n\t\t\tRoles.GROUP\n\t\t);\n\t\tconst xLabelUpdate = xLabels.selectAll(\"text\").data(this.uniqueKeys);\n\t\txLabelUpdate.join(\n\t\t\tenter =>\n\t\t\t\tenter\n\t\t\t\t\t.append(\"text\")\n\t\t\t\t\t.text(key => key)\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"x\",\n\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\tyScale.range()[1] + xLabelPadding,\n\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t).x\n\t\t\t\t\t)\n\t\t\t\t\t.attr(\n\t\t\t\t\t\t\"y\",\n\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\tyScale.range()[1] + xLabelPadding,\n\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t).y\n\t\t\t\t\t)\n\t\t\t\t\t.style(\n\t\t\t\t\t\t\"text-anchor\",\n\t\t\t\t\t\tkey => radialLabelPlacement(xScale(key)).textAnchor\n\t\t\t\t\t)\n\t\t\t\t\t.style(\n\t\t\t\t\t\t\"dominant-baseline\",\n\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\tradialLabelPlacement(xScale(key)).dominantBaseline\n\t\t\t\t\t)\n\t\t\t\t\t.call(selection =>\n\t\t\t\t\t\tselection\n\t\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\t\"radar_x_labels_enter\",\n\t\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t),\n\t\t\tupdate =>\n\t\t\t\tupdate.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_x_labels_update\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"x\",\n\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\tyScale.range()[1] + xLabelPadding,\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).x\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t\"y\",\n\t\t\t\t\t\t\tkey =>\n\t\t\t\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\t\t\t\txScale(key),\n\t\t\t\t\t\t\t\t\tyScale.range()[1] + xLabelPadding,\n\t\t\t\t\t\t\t\t\tc\n\t\t\t\t\t\t\t\t).y\n\t\t\t\t\t\t)\n\t\t\t\t),\n\t\t\texit =>\n\t\t\t\texit.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_x_labels_exit\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// blobs\n\t\tconst blobs = DOMUtils.appendOrSelect(this.svg, \"g.blobs\").attr(\n\t\t\t\"role\",\n\t\t\tRoles.GROUP\n\t\t);\n\t\tconst blobUpdate = blobs\n\t\t\t.selectAll(\"path\")\n\t\t\t.data(this.groupedDataNormalized, group => group.name);\n\t\tblobUpdate.join(\n\t\t\tenter =>\n\t\t\t\tenter\n\t\t\t\t\t.append(\"path\")\n\t\t\t\t\t.attr(\"class\", \"blob\")\n\t\t\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t\t.attr(\"fill\", group => colorScale(group.name))\n\t\t\t\t\t.style(\"fill-opacity\", opacity.selected)\n\t\t\t\t\t.attr(\"stroke\", group => colorScale(group.name))\n\t\t\t\t\t.attr(\"d\", group => oldRadialLineGenerator(group.data))\n\t\t\t\t\t.call(selection =>\n\t\t\t\t\t\tselection\n\t\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\t\"radar_blobs_enter\",\n\t\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t\t.attr(\"d\", group => radialLineGenerator(group.data))\n\t\t\t\t\t),\n\t\t\tupdate =>\n\t\t\t\tupdate.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_blobs_update\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t\t.attr(\"transform\", `translate(${c.x}, ${c.y})`)\n\t\t\t\t\t\t.attr(\"d\", group => radialLineGenerator(group.data))\n\t\t\t\t),\n\t\t\texit =>\n\t\t\t\texit.call(selection =>\n\t\t\t\t\tselection\n\t\t\t\t\t\t.transition(\n\t\t\t\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\t\t\t\"radar_blobs_exit\",\n\t\t\t\t\t\t\t\tanimate\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.attr(\"d\", group => radialLineGenerator(group.data))\n\t\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t\t.remove()\n\t\t\t\t)\n\t\t);\n\n\t\t// data dots\n\t\tconst dots = DOMUtils.appendOrSelect(this.svg, \"g.dots\").attr(\n\t\t\t\"role\",\n\t\t\tRoles.GROUP\n\t\t);\n\t\tconst dotsUpdate = dots\n\t\t\t.selectAll(\"circle\")\n\t\t\t.data(this.displayDataNormalized);\n\t\tdotsUpdate\n\t\t\t.join(\n\t\t\t\tenter =>\n\t\t\t\t\tenter.append(\"circle\").attr(\"role\", Roles.GRAPHICS_SYMBOL),\n\t\t\t\tupdate => update,\n\t\t\t\texit => exit.remove()\n\t\t\t)\n\t\t\t.attr(\"class\", d => Tools.kebabCase(d[angle]))\n\t\t\t.attr(\n\t\t\t\t\"cx\",\n\t\t\t\td =>\n\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\txScale(d[angle]),\n\t\t\t\t\t\tyScale(d[value]),\n\t\t\t\t\t\tc\n\t\t\t\t\t).x\n\t\t\t)\n\t\t\t.attr(\n\t\t\t\t\"cy\",\n\t\t\t\td =>\n\t\t\t\t\tpolarToCartesianCoords(\n\t\t\t\t\t\txScale(d[angle]),\n\t\t\t\t\t\tyScale(d[value]),\n\t\t\t\t\t\tc\n\t\t\t\t\t).y\n\t\t\t)\n\t\t\t.attr(\"r\", 0)\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.attr(\"fill\", d => colorScale(d[groupMapsTo]));\n\n\t\t// rectangles\n\t\tconst xAxesRect = DOMUtils.appendOrSelect(\n\t\t\tthis.svg,\n\t\t\t\"g.x-axes-rect\"\n\t\t).attr(\"role\", Roles.GROUP);\n\t\tconst xAxisRectUpdate = xAxesRect\n\t\t\t.selectAll(\"rect\")\n\t\t\t.data(this.uniqueKeys);\n\t\txAxisRectUpdate\n\t\t\t.join(\n\t\t\t\tenter =>\n\t\t\t\t\tenter.append(\"rect\").attr(\"role\", Roles.GRAPHICS_SYMBOL),\n\t\t\t\tupdate => update,\n\t\t\t\texit => exit.remove()\n\t\t\t)\n\t\t\t.attr(\"x\", c.x)\n\t\t\t.attr(\"y\", c.y - xAxisRectHeight / 2)\n\t\t\t.attr(\"width\", yScale.range()[1])\n\t\t\t.attr(\"height\", xAxisRectHeight)\n\t\t\t.attr(\"fill\", \"red\")\n\t\t\t.style(\"fill-opacity\", 0)\n\t\t\t.attr(\n\t\t\t\t\"transform\",\n\t\t\t\tkey => `rotate(${radToDeg(xScale(key))}, ${c.x}, ${c.y})`\n\t\t\t);\n\n\t\t// Add event listeners\n\t\tthis.addEventListeners();\n\n\t\toldYScale = yScale; // save the current scale as the old one\n\t}\n\n\t// append temporarily the label to get the exact space that it occupies\n\tgetLabelDimensions = (label: string) => {\n\t\tconst tmpTick = DOMUtils.appendOrSelect(this.svg, `g.tmp-tick`);\n\t\tconst tmpTickText = DOMUtils.appendOrSelect(tmpTick, `text`).text(\n\t\t\tlabel\n\t\t);\n\t\tconst { width, height } = DOMUtils.getSVGElementSize(\n\t\t\ttmpTickText.node(),\n\t\t\t{ useBBox: true }\n\t\t);\n\t\ttmpTick.remove();\n\t\treturn { width, height };\n\t};\n\n\t// Given a flat array of objects, if there are missing data on key,\n\t// creates corresponding data with value = null\n\tnormalizeFlatData = (dataset: any) => {\n\t\tconst options = this.model.getOptions();\n\t\tconst { angle, value } = Tools.getProperty(options, \"radar\", \"axes\");\n\t\tconst groupMapsTo = Tools.getProperty(options, \"data\", \"groupMapsTo\");\n\t\tconst completeBlankData = Tools.flatMapDeep(\n\t\t\tthis.uniqueKeys.map(key => {\n\t\t\t\treturn this.uniqueGroups.map(group => ({\n\t\t\t\t\t[angle]: key,\n\t\t\t\t\t[groupMapsTo]: group,\n\t\t\t\t\t[value]: null\n\t\t\t\t}));\n\t\t\t})\n\t\t);\n\t\treturn Tools.merge(completeBlankData, dataset);\n\t};\n\n\t// Given a a grouped array of objects, if there are missing data on key,\n\t// creates corresponding data with value = null\n\tnormalizeGroupedData = (dataset: any) => {\n\t\tconst options = this.model.getOptions();\n\t\tconst { angle, value } = Tools.getProperty(options, \"radar\", \"axes\");\n\t\tconst groupMapsTo = Tools.getProperty(options, \"data\", \"groupMapsTo\");\n\t\treturn dataset.map(({ name, data }) => {\n\t\t\tconst completeBlankData = this.uniqueKeys.map(k => ({\n\t\t\t\t[groupMapsTo]: name,\n\t\t\t\t[angle]: k,\n\t\t\t\t[value]: null\n\t\t\t}));\n\t\t\treturn { name, data: Tools.merge(completeBlankData, data) };\n\t\t});\n\t};\n\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\t\tconst opacity = Tools.getProperty(\n\t\t\tthis.model.getOptions(),\n\t\t\t\"radar\",\n\t\t\t\"opacity\"\n\t\t);\n\t\tthis.parent\n\t\t\t.selectAll(\"g.blobs path\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\"legend-hover-blob\")\n\t\t\t)\n\t\t\t.style(\"fill-opacity\", group => {\n\t\t\t\tif (group.name !== hoveredElement.datum().name) {\n\t\t\t\t\treturn Tools.getProperty(opacity, \"unselected\");\n\t\t\t\t}\n\t\t\t\treturn Tools.getProperty(opacity, \"selected\");\n\t\t\t});\n\t};\n\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tconst opacity = Tools.getProperty(\n\t\t\tthis.model.getOptions(),\n\t\t\t\"radar\",\n\t\t\t\"opacity\"\n\t\t);\n\t\tthis.parent\n\t\t\t.selectAll(\"g.blobs path\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\"legend-mouseout-blob\")\n\t\t\t)\n\t\t\t.style(\"fill-opacity\", Tools.getProperty(opacity, \"selected\"));\n\t};\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent\n\t\t\t.selectAll(\".x-axes-rect > rect\")\n\t\t\t.on(\"mouseover\", null)\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n\n\taddEventListeners() {\n\t\tconst self = this;\n\t\tconst {\n\t\t\taxes: { angle },\n\t\t\tdotsRadius\n\t\t} = Tools.getProperty(this.model.getOptions(), \"radar\");\n\n\t\t// events on x axes rects\n\t\tthis.parent\n\t\t\t.selectAll(\".x-axes-rect > rect\")\n\t\t\t.on(\"mouseover\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Radar.X_AXIS_MOUSEOVER,\n\t\t\t\t\t{\n\t\t\t\t\t\telement: select(this),\n\t\t\t\t\t\tdatum\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t})\n\t\t\t.on(\"mousemove\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\tconst axisLine = self.parent.select(\n\t\t\t\t\t`.x-axes .x-axis-${Tools.kebabCase(datum)}`\n\t\t\t\t);\n\t\t\t\tconst dots = self.parent.selectAll(\n\t\t\t\t\t`.dots circle.${Tools.kebabCase(datum)}`\n\t\t\t\t);\n\n\t\t\t\t// Change style\n\t\t\t\taxisLine\n\t\t\t\t\t.classed(\"hovered\", true)\n\t\t\t\t\t.attr(\"stroke-dasharray\", \"4 4\");\n\t\t\t\tdots.classed(\"hovered\", true)\n\t\t\t\t\t.attr(\"opacity\", 1)\n\t\t\t\t\t.attr(\"r\", dotsRadius);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Radar.X_AXIS_MOUSEMOVE,\n\t\t\t\t\t{\n\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\tdatum\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// get the items that should be highlighted\n\t\t\t\tconst itemsToHighlight = self.displayDataNormalized.filter(\n\t\t\t\t\td => d[angle] === datum\n\t\t\t\t);\n\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\thoveredElement,\n\t\t\t\t\tmultidata: itemsToHighlight,\n\t\t\t\t\ttype: TooltipTypes.GRIDLINE\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Radar.X_AXIS_CLICK, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\tconst axisLine = self.parent.select(\n\t\t\t\t\t`.x-axes .x-axis-${Tools.kebabCase(datum)}`\n\t\t\t\t);\n\t\t\t\tconst dots = self.parent.selectAll(\n\t\t\t\t\t`.dots circle.${Tools.kebabCase(datum)}`\n\t\t\t\t);\n\n\t\t\t\t// Change style\n\t\t\t\taxisLine\n\t\t\t\t\t.classed(\"hovered\", false)\n\t\t\t\t\t.attr(\"stroke-dasharray\", \"0\");\n\t\t\t\tdots.classed(\"hovered\", false)\n\t\t\t\t\t.attr(\"opacity\", 0)\n\t\t\t\t\t.attr(\"r\", 0);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Radar.X_AXIS_MOUSEOUT,\n\t\t\t\t\t{\n\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\tdatum\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(\"hide-tooltip\", {\n\t\t\t\t\thoveredElement\n\t\t\t\t});\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, {\n\t\t\t\t\thoveredElement\n\t\t\t\t});\n\t\t\t});\n\t}\n}\n"]}
|
|
@@ -25,12 +25,16 @@ var Scatter = /** @class */ (function (_super) {
|
|
|
25
25
|
_this.handleLegendOnHover = function (event) {
|
|
26
26
|
var hoveredElement = event.detail.hoveredElement;
|
|
27
27
|
var groupMapsTo = _this.model.getOptions().data.groupMapsTo;
|
|
28
|
-
_this.parent
|
|
28
|
+
_this.parent
|
|
29
|
+
.selectAll("circle.dot")
|
|
29
30
|
.transition(_this.services.transitions.getTransition("legend-hover-scatter"))
|
|
30
|
-
.attr("opacity", function (d) {
|
|
31
|
+
.attr("opacity", function (d) {
|
|
32
|
+
return d[groupMapsTo] !== hoveredElement.datum()["name"] ? 0.3 : 1;
|
|
33
|
+
});
|
|
31
34
|
};
|
|
32
35
|
_this.handleLegendMouseOut = function (event) {
|
|
33
|
-
_this.parent
|
|
36
|
+
_this.parent
|
|
37
|
+
.selectAll("circle.dot")
|
|
34
38
|
.transition(_this.services.transitions.getTransition("legend-mouseout-scatter"))
|
|
35
39
|
.attr("opacity", 1);
|
|
36
40
|
};
|
|
@@ -48,24 +52,34 @@ var Scatter = /** @class */ (function (_super) {
|
|
|
48
52
|
var svg = this.getContainerSVG();
|
|
49
53
|
var groupedData = this.model.getGroupedData();
|
|
50
54
|
// Update data on dot groups
|
|
51
|
-
var dotGroups = svg
|
|
55
|
+
var dotGroups = svg
|
|
56
|
+
.selectAll("g.dots")
|
|
52
57
|
.data(groupedData, function (group) { return group.name; });
|
|
53
58
|
// Remove dot groups that need to be removed
|
|
54
|
-
dotGroups
|
|
59
|
+
dotGroups
|
|
60
|
+
.exit()
|
|
55
61
|
.attr("opacity", 0)
|
|
56
62
|
.remove();
|
|
57
63
|
// Add the dot groups that need to be introduced
|
|
58
|
-
var dotGroupsEnter = dotGroups
|
|
64
|
+
var dotGroupsEnter = dotGroups
|
|
65
|
+
.enter()
|
|
59
66
|
.append("g")
|
|
60
67
|
.classed("dots", true)
|
|
61
68
|
.attr("role", Roles.GROUP);
|
|
62
69
|
var rangeIdentifier = this.services.cartesianScales.getRangeIdentifier();
|
|
63
70
|
// Update data on all circles
|
|
64
|
-
var dots = dotGroupsEnter
|
|
71
|
+
var dots = dotGroupsEnter
|
|
72
|
+
.merge(dotGroups)
|
|
65
73
|
.selectAll("circle.dot")
|
|
66
|
-
.data(function (group) {
|
|
74
|
+
.data(function (group) {
|
|
75
|
+
return group.data.filter(function (datum) {
|
|
76
|
+
return datum[rangeIdentifier] !== null &&
|
|
77
|
+
datum[rangeIdentifier] !== undefined;
|
|
78
|
+
});
|
|
79
|
+
});
|
|
67
80
|
// Add the circles that need to be introduced
|
|
68
|
-
var dotsEnter = dots
|
|
81
|
+
var dotsEnter = dots
|
|
82
|
+
.enter()
|
|
69
83
|
.append("circle")
|
|
70
84
|
.attr("opacity", 0);
|
|
71
85
|
// Apply styling & position
|
|
@@ -91,7 +105,8 @@ var Scatter = /** @class */ (function (_super) {
|
|
|
91
105
|
// To be an anomaly, the value has to be higher or equal than the threshold value
|
|
92
106
|
// (if are present, both range and domain threshold values)
|
|
93
107
|
if (yThreshold && xThreshold) {
|
|
94
|
-
return yValue <= yThreshold.scaleValue &&
|
|
108
|
+
return (yValue <= yThreshold.scaleValue &&
|
|
109
|
+
xValue >= xThreshold.scaleValue);
|
|
95
110
|
}
|
|
96
111
|
if (yThreshold) {
|
|
97
112
|
return yValue <= yThreshold.scaleValue;
|
|
@@ -112,12 +127,19 @@ var Scatter = /** @class */ (function (_super) {
|
|
|
112
127
|
var getDomainValue = function (d, i) { return cartesianScales.getDomainValue(d, i); };
|
|
113
128
|
var getRangeValue = function (d, i) { return cartesianScales.getRangeValue(d, i); };
|
|
114
129
|
var _b = Tools.flipDomainAndRangeBasedOnOrientation(getDomainValue, getRangeValue, cartesianScales.getOrientation()), getXValue = _b[0], getYValue = _b[1];
|
|
115
|
-
selection
|
|
130
|
+
selection
|
|
131
|
+
.raise()
|
|
116
132
|
.classed("dot", true)
|
|
117
133
|
// Set class to highlight the dots that are above all the thresholds, in both directions (vertical and horizontal)
|
|
118
|
-
.classed("threshold-anomaly", function (d, i) {
|
|
119
|
-
|
|
120
|
-
|
|
134
|
+
.classed("threshold-anomaly", function (d, i) {
|
|
135
|
+
return _this.isDatapointThresholdAnomaly(d, i);
|
|
136
|
+
})
|
|
137
|
+
.classed("filled", function (d) {
|
|
138
|
+
return _this.model.getIsFilled(d[groupMapsTo], d[domainIdentifier], d, filled);
|
|
139
|
+
})
|
|
140
|
+
.classed("unfilled", function (d) {
|
|
141
|
+
return !_this.model.getIsFilled(d[groupMapsTo], d[domainIdentifier], d, filled);
|
|
142
|
+
})
|
|
121
143
|
.attr("cx", getXValue)
|
|
122
144
|
.transition(transitions.getTransition("scatter-update-enter", animate))
|
|
123
145
|
.attr("cy", getYValue)
|
|
@@ -128,7 +150,9 @@ var Scatter = /** @class */ (function (_super) {
|
|
|
128
150
|
}
|
|
129
151
|
})
|
|
130
152
|
.attr("fill-opacity", filled ? 0.2 : 1)
|
|
131
|
-
.attr("stroke", function (d) {
|
|
153
|
+
.attr("stroke", function (d) {
|
|
154
|
+
return _this.model.getStrokeColor(d[groupMapsTo], d[domainIdentifier], d);
|
|
155
|
+
})
|
|
132
156
|
.attr("opacity", 1)
|
|
133
157
|
// a11y
|
|
134
158
|
.attr("role", Roles.GRAPHICS_SYMBOL)
|
|
@@ -141,12 +165,18 @@ var Scatter = /** @class */ (function (_super) {
|
|
|
141
165
|
var self = this;
|
|
142
166
|
var groupMapsTo = this.model.getOptions().data.groupMapsTo;
|
|
143
167
|
var domainIdentifier = this.services.cartesianScales.getDomainIdentifier();
|
|
144
|
-
this.parent
|
|
168
|
+
this.parent
|
|
169
|
+
.selectAll("circle")
|
|
145
170
|
.on("mouseover mousemove", function (datum) {
|
|
146
171
|
var hoveredElement = select(this);
|
|
147
|
-
hoveredElement
|
|
148
|
-
.
|
|
149
|
-
|
|
172
|
+
hoveredElement
|
|
173
|
+
.classed("hovered", true)
|
|
174
|
+
.style("fill", function (d) {
|
|
175
|
+
return self.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d);
|
|
176
|
+
});
|
|
177
|
+
var eventNameToDispatch = d3Event.type === "mouseover"
|
|
178
|
+
? Events.Scatter.SCATTER_MOUSEOVER
|
|
179
|
+
: Events.Scatter.SCATTER_MOUSEMOVE;
|
|
150
180
|
// Dispatch mouse event
|
|
151
181
|
self.services.events.dispatchEvent(eventNameToDispatch, {
|
|
152
182
|
element: hoveredElement,
|
|
@@ -177,12 +207,15 @@ var Scatter = /** @class */ (function (_super) {
|
|
|
177
207
|
datum: datum
|
|
178
208
|
});
|
|
179
209
|
// Hide tooltip
|
|
180
|
-
self.services.events.dispatchEvent(Events.Tooltip.HIDE, {
|
|
210
|
+
self.services.events.dispatchEvent(Events.Tooltip.HIDE, {
|
|
211
|
+
hoveredElement: hoveredElement
|
|
212
|
+
});
|
|
181
213
|
});
|
|
182
214
|
};
|
|
183
215
|
Scatter.prototype.destroy = function () {
|
|
184
216
|
// Remove event listeners
|
|
185
|
-
this.parent
|
|
217
|
+
this.parent
|
|
218
|
+
.selectAll("circle")
|
|
186
219
|
.on("mousemove", null)
|
|
187
220
|
.on("mouseout", null);
|
|
188
221
|
// Remove legend listeners
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scatter.js","sourceRoot":"","sources":["scatter.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\nimport { TooltipTypes, Roles, Events } from \"../../interfaces\";\nimport { Tools } from \"../../tools\";\n\n// D3 Imports\nimport { select, Selection, event as d3Event } from \"d3-selection\";\n\nexport class Scatter extends Component {\n\ttype = \"scatter\";\n\n\tinit() {\n\t\tconst { events } = this.services;\n\t\t// Highlight correct circle on legend item hovers\n\t\tevents.addEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\t// Un-highlight circles on legend item mouseouts\n\t\tevents.addEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n\n\trender(animate: boolean) {\n\t\t// Grab container SVG\n\t\tconst svg = this.getContainerSVG();\n\n\t\tconst groupedData = this.model.getGroupedData();\n\n\t\t// Update data on dot groups\n\t\tconst dotGroups = svg.selectAll(\"g.dots\")\n\t\t\t.data(groupedData, group => group.name);\n\n\t\t// Remove dot groups that need to be removed\n\t\tdotGroups.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add the dot groups that need to be introduced\n\t\tconst dotGroupsEnter = dotGroups.enter()\n\t\t\t.append(\"g\")\n\t\t\t\t.classed(\"dots\", true)\n\t\t\t\t.attr(\"role\", Roles.GROUP);\n\n\t\tconst rangeIdentifier = this.services.cartesianScales.getRangeIdentifier();\n\t\t// Update data on all circles\n\t\tconst dots = dotGroupsEnter.merge(dotGroups)\n\t\t\t.selectAll(\"circle.dot\")\n\t\t\t.data(group => group.data.filter(datum => datum[rangeIdentifier] !== null && datum[rangeIdentifier] !== undefined));\n\n\t\t// Add the circles that need to be introduced\n\t\tconst dotsEnter = dots.enter()\n\t\t\t.append(\"circle\")\n\t\t\t.attr(\"opacity\", 0);\n\n\t\t// Apply styling & position\n\t\tconst circlesToStyle = dotsEnter.merge(dots);\n\t\tthis.styleCircles(circlesToStyle, animate);\n\n\t\t// Add event listeners to elements drawn\n\t\tthis.addEventListeners();\n\t}\n\n\t// A value is an anomaly if is above all defined domain and range thresholds\n\tisDatapointThresholdAnomaly(datum: any, index: number) {\n\t\tconst { handleThresholds } = this.configs;\n\t\tif (!handleThresholds) { return false; }\n\n\t\tconst { cartesianScales } = this.services;\n\t\tconst orientation = cartesianScales.getOrientation();\n\n\t\t// Get highest domain and range thresholds\n\t\tconst [xThreshold, yThreshold] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\tthis.services.cartesianScales.getHighestDomainThreshold(),\n\t\t\tthis.services.cartesianScales.getHighestRangeThreshold(),\n\t\t\torientation\n\t\t);\n\n\t\tconst [getXValue, getYValue] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\t(d, i) => cartesianScales.getDomainValue(d, i),\n\t\t\t(d, i) => cartesianScales.getRangeValue(d, i),\n\t\t\torientation\n\t\t);\n\n\t\t// Get datum x and y values\n\t\tconst xValue = getXValue(datum, index);\n\t\tconst yValue = getYValue(datum, index);\n\n\t\t// To be an anomaly, the value has to be higher or equal than the threshold value\n\t\t// (if are present, both range and domain threshold values)\n\t\tif (yThreshold && xThreshold) {\n\t\t\treturn yValue <= yThreshold.scaleValue && xValue >= xThreshold.scaleValue;\n\t\t}\n\n\t\tif (yThreshold) {\n\t\t\treturn yValue <= yThreshold.scaleValue;\n\t\t}\n\n\t\tif (xThreshold) {\n\t\t\treturn xValue >= xThreshold.scaleValue;\n\t\t}\n\t}\n\n\tstyleCircles(selection: Selection<any, any, any, any>, animate: boolean) {\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.model.getOptions();\n\t\tconst { filled } = options.points;\n\t\tconst { cartesianScales, transitions } = this.services;\n\n\t\tconst { groupMapsTo } = options.data;\n\t\tconst domainIdentifier = cartesianScales.getDomainIdentifier();\n\t\tconst rangeIdentifier = cartesianScales.getRangeIdentifier();\n\n\t\tconst getDomainValue = (d, i) => cartesianScales.getDomainValue(d, i);\n\t\tconst getRangeValue = (d, i) => cartesianScales.getRangeValue(d, i);\n\t\tconst [getXValue, getYValue] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\tgetDomainValue,\n\t\t\tgetRangeValue,\n\t\t\tcartesianScales.getOrientation()\n\t\t);\n\n\t\tselection.raise()\n\t\t\t.classed(\"dot\", true)\n\t\t\t// Set class to highlight the dots that are above all the thresholds, in both directions (vertical and horizontal)\n\t\t\t.classed(\"threshold-anomaly\", (d, i) => this.isDatapointThresholdAnomaly(d, i))\n\t\t\t.classed(\"filled\", d => this.model.getIsFilled(d[groupMapsTo], d[domainIdentifier], d, filled))\n\t\t\t.classed(\"unfilled\", d => !this.model.getIsFilled(d[groupMapsTo], d[domainIdentifier], d, filled))\n\t\t\t.attr(\"cx\", getXValue)\n\t\t\t.transition(transitions.getTransition(\"scatter-update-enter\", animate))\n\t\t\t.attr(\"cy\", getYValue)\n\t\t\t.attr(\"r\", options.points.radius)\n\t\t\t.attr(\"fill\", d => {\n\t\t\t\tif (this.model.getIsFilled(d[groupMapsTo], d[domainIdentifier], d, filled)) {\n\t\t\t\t\treturn this.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.attr(\"fill-opacity\", filled ? 0.2 : 1)\n\t\t\t.attr(\"stroke\", d => this.model.getStrokeColor(d[groupMapsTo], d[domainIdentifier], d))\n\t\t\t.attr(\"opacity\", 1)\n\t\t\t// a11y\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"aria-roledescription\", \"point\")\n\t\t\t.attr(\"aria-label\", d => d[rangeIdentifier]);\n\n\t\t// Add event listeners to elements drawn\n\t\tthis.addEventListeners();\n\t}\n\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tconst { groupMapsTo } = this.model.getOptions().data;\n\n\t\tthis.parent.selectAll(\"circle.dot\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-hover-scatter\"))\n\t\t\t.attr(\"opacity\", d => (d[groupMapsTo] !== hoveredElement.datum()[\"name\"]) ? 0.3 : 1);\n\t}\n\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent.selectAll(\"circle.dot\")\n\t\t\t.transition(this.services.transitions.getTransition(\"legend-mouseout-scatter\"))\n\t\t\t.attr(\"opacity\", 1);\n\t}\n\n\taddEventListeners() {\n\t\tconst self = this;\n\t\tconst { groupMapsTo } = this.model.getOptions().data;\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\tthis.parent.selectAll(\"circle\")\n\t\t\t.on(\"mouseover mousemove\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\thoveredElement.classed(\"hovered\", true)\n\t\t\t\t\t.style(\"fill\", (d: any) => self.model.getFillColor(d[groupMapsTo], d[domainIdentifier], d));\n\n\t\t\t\tconst eventNameToDispatch = d3Event.type === \"mouseover\" ? Events.Scatter.SCATTER_MOUSEOVER : Events.Scatter.SCATTER_MOUSEMOVE;\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(eventNameToDispatch, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\thoveredElement,\n\t\t\t\t\ttype: TooltipTypes.DATAPOINT\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Scatter.SCATTER_CLICK, {\n\t\t\t\t\telement: select(this),\n\t\t\t\t\tdatum\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed(\"hovered\", false);\n\n\t\t\t\tif (!self.configs.filled) {\n\t\t\t\t\thoveredElement.style(\"fill\", null);\n\t\t\t\t}\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Scatter.SCATTER_MOUSEOUT, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, { hoveredElement });\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent.selectAll(\"circle\")\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst { events } = this.services;\n\t\tevents.removeEventListener(Events.Legend.ITEM_HOVER, this.handleLegendOnHover);\n\t\tevents.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleLegendMouseOut);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"scatter.js","sourceRoot":"","sources":["scatter.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from \"../component\";\nimport { TooltipTypes, Roles, Events } from \"../../interfaces\";\nimport { Tools } from \"../../tools\";\n\n// D3 Imports\nimport { select, Selection, event as d3Event } from \"d3-selection\";\n\nexport class Scatter extends Component {\n\ttype = \"scatter\";\n\n\tinit() {\n\t\tconst { events } = this.services;\n\t\t// Highlight correct circle on legend item hovers\n\t\tevents.addEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\t\t// Un-highlight circles on legend item mouseouts\n\t\tevents.addEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n\n\trender(animate: boolean) {\n\t\t// Grab container SVG\n\t\tconst svg = this.getContainerSVG();\n\n\t\tconst groupedData = this.model.getGroupedData();\n\n\t\t// Update data on dot groups\n\t\tconst dotGroups = svg\n\t\t\t.selectAll(\"g.dots\")\n\t\t\t.data(groupedData, group => group.name);\n\n\t\t// Remove dot groups that need to be removed\n\t\tdotGroups\n\t\t\t.exit()\n\t\t\t.attr(\"opacity\", 0)\n\t\t\t.remove();\n\n\t\t// Add the dot groups that need to be introduced\n\t\tconst dotGroupsEnter = dotGroups\n\t\t\t.enter()\n\t\t\t.append(\"g\")\n\t\t\t.classed(\"dots\", true)\n\t\t\t.attr(\"role\", Roles.GROUP);\n\n\t\tconst rangeIdentifier = this.services.cartesianScales.getRangeIdentifier();\n\t\t// Update data on all circles\n\t\tconst dots = dotGroupsEnter\n\t\t\t.merge(dotGroups)\n\t\t\t.selectAll(\"circle.dot\")\n\t\t\t.data(group =>\n\t\t\t\tgroup.data.filter(\n\t\t\t\t\tdatum =>\n\t\t\t\t\t\tdatum[rangeIdentifier] !== null &&\n\t\t\t\t\t\tdatum[rangeIdentifier] !== undefined\n\t\t\t\t)\n\t\t\t);\n\n\t\t// Add the circles that need to be introduced\n\t\tconst dotsEnter = dots\n\t\t\t.enter()\n\t\t\t.append(\"circle\")\n\t\t\t.attr(\"opacity\", 0);\n\n\t\t// Apply styling & position\n\t\tconst circlesToStyle = dotsEnter.merge(dots);\n\t\tthis.styleCircles(circlesToStyle, animate);\n\n\t\t// Add event listeners to elements drawn\n\t\tthis.addEventListeners();\n\t}\n\n\t// A value is an anomaly if is above all defined domain and range thresholds\n\tisDatapointThresholdAnomaly(datum: any, index: number) {\n\t\tconst { handleThresholds } = this.configs;\n\t\tif (!handleThresholds) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst { cartesianScales } = this.services;\n\t\tconst orientation = cartesianScales.getOrientation();\n\n\t\t// Get highest domain and range thresholds\n\t\tconst [\n\t\t\txThreshold,\n\t\t\tyThreshold\n\t\t] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\tthis.services.cartesianScales.getHighestDomainThreshold(),\n\t\t\tthis.services.cartesianScales.getHighestRangeThreshold(),\n\t\t\torientation\n\t\t);\n\n\t\tconst [\n\t\t\tgetXValue,\n\t\t\tgetYValue\n\t\t] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\t(d, i) => cartesianScales.getDomainValue(d, i),\n\t\t\t(d, i) => cartesianScales.getRangeValue(d, i),\n\t\t\torientation\n\t\t);\n\n\t\t// Get datum x and y values\n\t\tconst xValue = getXValue(datum, index);\n\t\tconst yValue = getYValue(datum, index);\n\n\t\t// To be an anomaly, the value has to be higher or equal than the threshold value\n\t\t// (if are present, both range and domain threshold values)\n\t\tif (yThreshold && xThreshold) {\n\t\t\treturn (\n\t\t\t\tyValue <= yThreshold.scaleValue &&\n\t\t\t\txValue >= xThreshold.scaleValue\n\t\t\t);\n\t\t}\n\n\t\tif (yThreshold) {\n\t\t\treturn yValue <= yThreshold.scaleValue;\n\t\t}\n\n\t\tif (xThreshold) {\n\t\t\treturn xValue >= xThreshold.scaleValue;\n\t\t}\n\t}\n\n\tstyleCircles(selection: Selection<any, any, any, any>, animate: boolean) {\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.model.getOptions();\n\t\tconst { filled } = options.points;\n\t\tconst { cartesianScales, transitions } = this.services;\n\n\t\tconst { groupMapsTo } = options.data;\n\t\tconst domainIdentifier = cartesianScales.getDomainIdentifier();\n\t\tconst rangeIdentifier = cartesianScales.getRangeIdentifier();\n\n\t\tconst getDomainValue = (d, i) => cartesianScales.getDomainValue(d, i);\n\t\tconst getRangeValue = (d, i) => cartesianScales.getRangeValue(d, i);\n\t\tconst [\n\t\t\tgetXValue,\n\t\t\tgetYValue\n\t\t] = Tools.flipDomainAndRangeBasedOnOrientation(\n\t\t\tgetDomainValue,\n\t\t\tgetRangeValue,\n\t\t\tcartesianScales.getOrientation()\n\t\t);\n\n\t\tselection\n\t\t\t.raise()\n\t\t\t.classed(\"dot\", true)\n\t\t\t// Set class to highlight the dots that are above all the thresholds, in both directions (vertical and horizontal)\n\t\t\t.classed(\"threshold-anomaly\", (d, i) =>\n\t\t\t\tthis.isDatapointThresholdAnomaly(d, i)\n\t\t\t)\n\t\t\t.classed(\"filled\", d =>\n\t\t\t\tthis.model.getIsFilled(\n\t\t\t\t\td[groupMapsTo],\n\t\t\t\t\td[domainIdentifier],\n\t\t\t\t\td,\n\t\t\t\t\tfilled\n\t\t\t\t)\n\t\t\t)\n\t\t\t.classed(\n\t\t\t\t\"unfilled\",\n\t\t\t\td =>\n\t\t\t\t\t!this.model.getIsFilled(\n\t\t\t\t\t\td[groupMapsTo],\n\t\t\t\t\t\td[domainIdentifier],\n\t\t\t\t\t\td,\n\t\t\t\t\t\tfilled\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.attr(\"cx\", getXValue)\n\t\t\t.transition(\n\t\t\t\ttransitions.getTransition(\"scatter-update-enter\", animate)\n\t\t\t)\n\t\t\t.attr(\"cy\", getYValue)\n\t\t\t.attr(\"r\", options.points.radius)\n\t\t\t.attr(\"fill\", d => {\n\t\t\t\tif (\n\t\t\t\t\tthis.model.getIsFilled(\n\t\t\t\t\t\td[groupMapsTo],\n\t\t\t\t\t\td[domainIdentifier],\n\t\t\t\t\t\td,\n\t\t\t\t\t\tfilled\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn this.model.getFillColor(\n\t\t\t\t\t\td[groupMapsTo],\n\t\t\t\t\t\td[domainIdentifier],\n\t\t\t\t\t\td\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.attr(\"fill-opacity\", filled ? 0.2 : 1)\n\t\t\t.attr(\"stroke\", d =>\n\t\t\t\tthis.model.getStrokeColor(\n\t\t\t\t\td[groupMapsTo],\n\t\t\t\t\td[domainIdentifier],\n\t\t\t\t\td\n\t\t\t\t)\n\t\t\t)\n\t\t\t.attr(\"opacity\", 1)\n\t\t\t// a11y\n\t\t\t.attr(\"role\", Roles.GRAPHICS_SYMBOL)\n\t\t\t.attr(\"aria-roledescription\", \"point\")\n\t\t\t.attr(\"aria-label\", d => d[rangeIdentifier]);\n\n\t\t// Add event listeners to elements drawn\n\t\tthis.addEventListeners();\n\t}\n\n\thandleLegendOnHover = (event: CustomEvent) => {\n\t\tconst { hoveredElement } = event.detail;\n\n\t\tconst { groupMapsTo } = this.model.getOptions().data;\n\n\t\tthis.parent\n\t\t\t.selectAll(\"circle.dot\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\"legend-hover-scatter\")\n\t\t\t)\n\t\t\t.attr(\"opacity\", d =>\n\t\t\t\td[groupMapsTo] !== hoveredElement.datum()[\"name\"] ? 0.3 : 1\n\t\t\t);\n\t};\n\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent\n\t\t\t.selectAll(\"circle.dot\")\n\t\t\t.transition(\n\t\t\t\tthis.services.transitions.getTransition(\n\t\t\t\t\t\"legend-mouseout-scatter\"\n\t\t\t\t)\n\t\t\t)\n\t\t\t.attr(\"opacity\", 1);\n\t};\n\n\taddEventListeners() {\n\t\tconst self = this;\n\t\tconst { groupMapsTo } = this.model.getOptions().data;\n\t\tconst domainIdentifier = this.services.cartesianScales.getDomainIdentifier();\n\n\t\tthis.parent\n\t\t\t.selectAll(\"circle\")\n\t\t\t.on(\"mouseover mousemove\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\thoveredElement\n\t\t\t\t\t.classed(\"hovered\", true)\n\t\t\t\t\t.style(\"fill\", (d: any) =>\n\t\t\t\t\t\tself.model.getFillColor(\n\t\t\t\t\t\t\td[groupMapsTo],\n\t\t\t\t\t\t\td[domainIdentifier],\n\t\t\t\t\t\t\td\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\n\t\t\t\tconst eventNameToDispatch =\n\t\t\t\t\td3Event.type === \"mouseover\"\n\t\t\t\t\t\t? Events.Scatter.SCATTER_MOUSEOVER\n\t\t\t\t\t\t: Events.Scatter.SCATTER_MOUSEMOVE;\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(eventNameToDispatch, {\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum\n\t\t\t\t});\n\n\t\t\t\t// Show tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\thoveredElement,\n\t\t\t\t\ttype: TooltipTypes.DATAPOINT\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on(\"click\", function(datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Scatter.SCATTER_CLICK,\n\t\t\t\t\t{\n\t\t\t\t\t\telement: select(this),\n\t\t\t\t\t\tdatum\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t})\n\t\t\t.on(\"mouseout\", function(datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed(\"hovered\", false);\n\n\t\t\t\tif (!self.configs.filled) {\n\t\t\t\t\thoveredElement.style(\"fill\", null);\n\t\t\t\t}\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Scatter.SCATTER_MOUSEOUT,\n\t\t\t\t\t{\n\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\tdatum\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Hide tooltip\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, {\n\t\t\t\t\thoveredElement\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent\n\t\t\t.selectAll(\"circle\")\n\t\t\t.on(\"mousemove\", null)\n\t\t\t.on(\"mouseout\", null);\n\n\t\t// Remove legend listeners\n\t\tconst { events } = this.services;\n\t\tevents.removeEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\t\tevents.removeEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleLegendMouseOut\n\t\t);\n\t}\n}\n"]}
|
|
@@ -30,7 +30,9 @@ var Skeleton = /** @class */ (function (_super) {
|
|
|
30
30
|
Skeleton.prototype.render = function () {
|
|
31
31
|
var svg = this.parent;
|
|
32
32
|
var parent = svg.node().parentNode;
|
|
33
|
-
var _a = DOMUtils.getSVGElementSize(parent, {
|
|
33
|
+
var _a = DOMUtils.getSVGElementSize(parent, {
|
|
34
|
+
useAttrs: true
|
|
35
|
+
}), width = _a.width, height = _a.height;
|
|
34
36
|
svg.attr("width", width).attr("height", height);
|
|
35
37
|
var isDataEmpty = this.model.isDataEmpty();
|
|
36
38
|
var isDataLoading = Tools.getProperty(this.model.getOptions(), "data", "loading");
|
|
@@ -101,18 +103,24 @@ var Skeleton = /** @class */ (function (_super) {
|
|
|
101
103
|
Skeleton.prototype.setScales = function () {
|
|
102
104
|
var xRange = this.services.cartesianScales.getMainXScale().range();
|
|
103
105
|
var yRange = this.services.cartesianScales.getMainYScale().range();
|
|
104
|
-
this.xScale = scaleLinear()
|
|
105
|
-
|
|
106
|
+
this.xScale = scaleLinear()
|
|
107
|
+
.domain([0, 1])
|
|
108
|
+
.range(xRange);
|
|
109
|
+
this.yScale = scaleLinear()
|
|
110
|
+
.domain([0, 1])
|
|
111
|
+
.range(yRange);
|
|
106
112
|
};
|
|
107
113
|
Skeleton.prototype.drawBackdrop = function (showShimmerEffect) {
|
|
108
114
|
var svg = this.parent;
|
|
109
115
|
var parent = svg.node().parentNode;
|
|
110
|
-
var _a = DOMUtils.getSVGElementSize(parent, {
|
|
111
|
-
|
|
116
|
+
var _a = DOMUtils.getSVGElementSize(parent, {
|
|
117
|
+
useAttrs: true
|
|
118
|
+
}), width = _a.width, height = _a.height;
|
|
119
|
+
this.backdrop = DOMUtils.appendOrSelect(svg, "svg.chart-skeleton.DAII")
|
|
120
|
+
.attr("width", width)
|
|
121
|
+
.attr("height", height);
|
|
112
122
|
var backdropRect = DOMUtils.appendOrSelect(this.backdrop, "rect.chart-skeleton-backdrop");
|
|
113
|
-
backdropRect
|
|
114
|
-
.attr("width", "100%")
|
|
115
|
-
.attr("height", "100%");
|
|
123
|
+
backdropRect.attr("width", "100%").attr("height", "100%");
|
|
116
124
|
var _b = this.xScale.range(), xScaleStart = _b[0], xScaleEnd = _b[1];
|
|
117
125
|
var _c = this.yScale.range(), yScaleEnd = _c[0], yScaleStart = _c[1];
|
|
118
126
|
this.backdrop
|
|
@@ -130,14 +138,16 @@ var Skeleton = /** @class */ (function (_super) {
|
|
|
130
138
|
var ticksValues = this.xScale.ticks(ticksNumber).map(function (d) { return d * width; });
|
|
131
139
|
var xGridG = DOMUtils.appendOrSelect(this.backdrop, "g.x.skeleton");
|
|
132
140
|
var update = xGridG.selectAll("line").data(ticksValues);
|
|
133
|
-
update
|
|
141
|
+
update
|
|
142
|
+
.enter()
|
|
134
143
|
.append("line")
|
|
135
144
|
.merge(update)
|
|
136
145
|
.attr("x1", function (d) { return d; })
|
|
137
146
|
.attr("x2", function (d) { return d; })
|
|
138
147
|
.attr("y1", 0)
|
|
139
148
|
.attr("y2", height);
|
|
140
|
-
xGridG
|
|
149
|
+
xGridG
|
|
150
|
+
.selectAll("line")
|
|
141
151
|
.classed("shimmer-effect-lines", showShimmerEffect)
|
|
142
152
|
.classed("empty-state-lines", !showShimmerEffect);
|
|
143
153
|
};
|
|
@@ -148,14 +158,16 @@ var Skeleton = /** @class */ (function (_super) {
|
|
|
148
158
|
var ticksValues = this.xScale.ticks(ticksNumber).map(function (d) { return d * height; });
|
|
149
159
|
var yGridG = DOMUtils.appendOrSelect(this.backdrop, "g.y.skeleton");
|
|
150
160
|
var update = yGridG.selectAll("line").data(ticksValues);
|
|
151
|
-
update
|
|
161
|
+
update
|
|
162
|
+
.enter()
|
|
152
163
|
.append("line")
|
|
153
164
|
.merge(update)
|
|
154
165
|
.attr("x1", 0)
|
|
155
166
|
.attr("x2", width)
|
|
156
167
|
.attr("y1", function (d) { return d; })
|
|
157
168
|
.attr("y2", function (d) { return d; });
|
|
158
|
-
yGridG
|
|
169
|
+
yGridG
|
|
170
|
+
.selectAll("line")
|
|
159
171
|
.classed("shimmer-effect-lines", showShimmerEffect)
|
|
160
172
|
.classed("empty-state-lines", !showShimmerEffect);
|
|
161
173
|
};
|
|
@@ -204,7 +216,9 @@ var Skeleton = /** @class */ (function (_super) {
|
|
|
204
216
|
var stopBgShimmerClass = "stop-bg-shimmer";
|
|
205
217
|
var stopShimmerClass = "stop-shimmer";
|
|
206
218
|
var container = this.parent.select(".chart-skeleton");
|
|
207
|
-
var width = DOMUtils.getSVGElementSize(this.parent, {
|
|
219
|
+
var width = DOMUtils.getSVGElementSize(this.parent, {
|
|
220
|
+
useAttrs: true
|
|
221
|
+
}).width;
|
|
208
222
|
var startPoint = 0;
|
|
209
223
|
var endPoint = width;
|
|
210
224
|
// append the defs as first child of container
|
|
@@ -217,7 +231,8 @@ var Skeleton = /** @class */ (function (_super) {
|
|
|
217
231
|
.attr("y2", 0)
|
|
218
232
|
.attr("gradientUnits", "userSpaceOnUse")
|
|
219
233
|
.attr("gradientTransform", "translate(0, 0)");
|
|
220
|
-
var stops = "\n\t\t\t<stop class=\"" + stopBgShimmerClass + "\" offset=\"" + startPoint + "\"></stop>\n\t\t\t<stop class=\"" + stopShimmerClass + "\" offset=\"" + (startPoint + shimmerWidth) + "\"></stop>\n\t\t\t<stop class=\"" + stopBgShimmerClass + "\" offset=\"" + (startPoint +
|
|
234
|
+
var stops = "\n\t\t\t<stop class=\"" + stopBgShimmerClass + "\" offset=\"" + startPoint + "\"></stop>\n\t\t\t<stop class=\"" + stopShimmerClass + "\" offset=\"" + (startPoint + shimmerWidth) + "\"></stop>\n\t\t\t<stop class=\"" + stopBgShimmerClass + "\" offset=\"" + (startPoint +
|
|
235
|
+
2 * shimmerWidth) + "\"></stop>\n\t\t";
|
|
221
236
|
linearGradient.html(stops);
|
|
222
237
|
repeat();
|
|
223
238
|
function repeat() {
|