@carbon/charts 0.53.5 → 0.54.3

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.
Files changed (118) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/build/demo/data/CHART_TYPES.d.ts +5 -0
  3. package/build/demo/data/heatmap.d.ts +96 -0
  4. package/build/demo/data/index.d.ts +1 -0
  5. package/build/src/charts/heatmap.d.ts +10 -0
  6. package/build/src/charts/index.d.ts +1 -0
  7. package/build/src/components/axes/axis.d.ts +7 -1
  8. package/build/src/components/axes/hover-axis.d.ts +10 -0
  9. package/build/src/components/essentials/color-scale-legend.d.ts +11 -0
  10. package/build/src/components/graphs/bar-stacked.d.ts +1 -0
  11. package/build/src/components/graphs/heatmap.d.ts +25 -0
  12. package/build/src/components/index.d.ts +2 -0
  13. package/build/src/configuration-non-customizable.d.ts +12 -0
  14. package/build/src/configuration.d.ts +2 -1
  15. package/build/src/interfaces/charts.d.ts +35 -2
  16. package/build/src/interfaces/enums.d.ts +22 -0
  17. package/build/src/interfaces/events.d.ts +13 -1
  18. package/build/src/model/cartesian-charts.d.ts +8 -1
  19. package/build/src/model/heatmap.d.ts +57 -0
  20. package/build/src/model/model.d.ts +1 -1
  21. package/build/src/services/scales-cartesian.d.ts +1 -0
  22. package/bundle.js +1 -1
  23. package/charts/heatmap.d.ts +10 -0
  24. package/charts/heatmap.js +138 -0
  25. package/charts/heatmap.js.map +1 -0
  26. package/charts/index.d.ts +1 -0
  27. package/charts/index.js +1 -0
  28. package/charts/index.js.map +1 -1
  29. package/components/axes/axis.d.ts +7 -1
  30. package/components/axes/axis.js +9 -2
  31. package/components/axes/axis.js.map +1 -1
  32. package/components/axes/hover-axis.d.ts +10 -0
  33. package/components/axes/hover-axis.js +235 -0
  34. package/components/axes/hover-axis.js.map +1 -0
  35. package/components/axes/two-dimensional-axes.js +8 -3
  36. package/components/axes/two-dimensional-axes.js.map +1 -1
  37. package/components/essentials/color-scale-legend.d.ts +11 -0
  38. package/components/essentials/color-scale-legend.js +236 -0
  39. package/components/essentials/color-scale-legend.js.map +1 -0
  40. package/components/graphs/bar-stacked.d.ts +1 -0
  41. package/components/graphs/bar-stacked.js +16 -0
  42. package/components/graphs/bar-stacked.js.map +1 -1
  43. package/components/graphs/heatmap.d.ts +25 -0
  44. package/components/graphs/heatmap.js +369 -0
  45. package/components/graphs/heatmap.js.map +1 -0
  46. package/components/index.d.ts +2 -0
  47. package/components/index.js +2 -0
  48. package/components/index.js.map +1 -1
  49. package/configuration-non-customizable.d.ts +12 -0
  50. package/configuration-non-customizable.js +13 -0
  51. package/configuration-non-customizable.js.map +1 -1
  52. package/configuration.d.ts +2 -1
  53. package/configuration.js +13 -1
  54. package/configuration.js.map +1 -1
  55. package/demo/data/CHART_TYPES.d.ts +5 -0
  56. package/demo/data/CHART_TYPES.js +5 -0
  57. package/demo/data/CHART_TYPES.js.map +1 -1
  58. package/demo/data/bundle.js +1 -1
  59. package/demo/data/heatmap.d.ts +96 -0
  60. package/demo/data/heatmap.js +1135 -0
  61. package/demo/data/heatmap.js.map +1 -0
  62. package/demo/data/index.d.ts +1 -0
  63. package/demo/data/index.js +30 -0
  64. package/demo/data/index.js.map +1 -1
  65. package/demo/styles.css +16458 -9179
  66. package/demo/styles.css.map +1 -1
  67. package/demo/styles.min.css +1 -1
  68. package/demo/styles.min.css.map +1 -1
  69. package/demo/tsconfig.tsbuildinfo +18 -4
  70. package/interfaces/charts.d.ts +35 -2
  71. package/interfaces/charts.js.map +1 -1
  72. package/interfaces/components.js.map +1 -1
  73. package/interfaces/enums.d.ts +22 -0
  74. package/interfaces/enums.js +25 -0
  75. package/interfaces/enums.js.map +1 -1
  76. package/interfaces/events.d.ts +13 -1
  77. package/interfaces/events.js +13 -0
  78. package/interfaces/events.js.map +1 -1
  79. package/model/cartesian-charts.d.ts +8 -1
  80. package/model/cartesian-charts.js +4 -2
  81. package/model/cartesian-charts.js.map +1 -1
  82. package/model/heatmap.d.ts +57 -0
  83. package/model/heatmap.js +289 -0
  84. package/model/heatmap.js.map +1 -0
  85. package/model/model.d.ts +1 -1
  86. package/model/model.js +1 -1
  87. package/model/model.js.map +1 -1
  88. package/package.json +1 -1
  89. package/services/canvas-zoom.js +1 -1
  90. package/services/canvas-zoom.js.map +1 -1
  91. package/services/scales-cartesian.d.ts +1 -0
  92. package/services/scales-cartesian.js +16 -0
  93. package/services/scales-cartesian.js.map +1 -1
  94. package/styles/_chart-holder.scss +1 -1
  95. package/styles/color-palatte.scss +96 -0
  96. package/styles/colors.scss +35 -1
  97. package/styles/components/_axis.scss +41 -0
  98. package/styles/components/_color-legend.scss +24 -0
  99. package/styles/components/index.scss +1 -0
  100. package/styles/graphs/_heatmap.scss +70 -0
  101. package/styles/graphs/index.scss +1 -0
  102. package/styles-g10.css +2002 -181
  103. package/styles-g10.css.map +1 -1
  104. package/styles-g10.min.css +1 -1
  105. package/styles-g10.min.css.map +1 -1
  106. package/styles-g100.css +2005 -184
  107. package/styles-g100.css.map +1 -1
  108. package/styles-g100.min.css +1 -1
  109. package/styles-g100.min.css.map +1 -1
  110. package/styles-g90.css +2006 -182
  111. package/styles-g90.css.map +1 -1
  112. package/styles-g90.min.css +1 -1
  113. package/styles-g90.min.css.map +1 -1
  114. package/styles.css +2002 -181
  115. package/styles.css.map +1 -1
  116. package/styles.min.css +1 -1
  117. package/styles.min.css.map +1 -1
  118. package/tsconfig.tsbuildinfo +188 -65
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-scale-legend.js","sourceRoot":"","sources":["color-scale-legend.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Tools } from '../../tools';\nimport { ColorLegendType, Events, RenderTypes } from '../../interfaces';\nimport * as Configuration from '../../configuration';\nimport { Legend } from './legend';\nimport { DOMUtils } from '../../services';\n\n// D3 imports\nimport { axisBottom } from 'd3-axis';\nimport { scaleBand, scaleLinear } from 'd3-scale';\nimport { interpolateRound, quantize } from 'd3-interpolate';\n\nexport class ColorScaleLegend extends Legend {\n\ttype = 'color-legend';\n\trenderType = RenderTypes.SVG;\n\n\tprivate gradient_id =\n\t\t'gradient-id-' + Math.floor(Math.random() * 99999999999);\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct circle on legend item hovers\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Axis.RENDER_COMPLETE,\n\t\t\tthis.handleAxisComplete\n\t\t);\n\t}\n\n\thandleAxisComplete = (event: CustomEvent) => {\n\t\tconst svg = this.getComponentContainer();\n\n\t\tconst { width } = DOMUtils.getSVGElementSize(svg, {\n\t\t\tuseAttrs: true,\n\t\t});\n\n\t\tconst isDataLoading = Tools.getProperty(\n\t\t\tthis.getOptions(),\n\t\t\t'data',\n\t\t\t'loading'\n\t\t);\n\n\t\tif (width > Configuration.legend.color.barWidth && !isDataLoading) {\n\t\t\tconst title = Tools.getProperty(\n\t\t\t\tthis.getOptions(),\n\t\t\t\t'heatmap',\n\t\t\t\t'colorLegend',\n\t\t\t\t'title'\n\t\t\t);\n\n\t\t\tconst { cartesianScales } = this.services;\n\t\t\t// Get available chart area\n\t\t\tconst mainXScale = cartesianScales.getMainXScale();\n\n\t\t\tconst xDimensions = mainXScale.range();\n\n\t\t\t// Align legend with the axis\n\t\t\tif (xDimensions[0] > 1) {\n\t\t\t\tsvg.select('g.legend').attr(\n\t\t\t\t\t'transform',\n\t\t\t\t\t`translate(${xDimensions[0]}, 0)`\n\t\t\t\t);\n\n\t\t\t\tif (title) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\twidth: textWidth,\n\t\t\t\t\t} = DOMUtils.getSVGElementSize(\n\t\t\t\t\t\tsvg.select('g.legend-title').select('text'),\n\t\t\t\t\t\t{ useBBox: true }\n\t\t\t\t\t);\n\n\t\t\t\t\t// -9 since LEFT y-axis labels are moved towards the left by 9 by d3\n\t\t\t\t\tconst availableSpace = xDimensions[0] - textWidth - 9;\n\n\t\t\t\t\t// If space is available align the the label with the axis labels\n\t\t\t\t\tif (availableSpace > 1) {\n\t\t\t\t\t\tsvg.select('g.legend-title').attr(\n\t\t\t\t\t\t\t'transform',\n\t\t\t\t\t\t\t`translate(${availableSpace}, 0)`\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Move the legend down by 16 pixels to display legend text on top\n\t\t\t\t\t\tsvg.select('g.legend').attr(\n\t\t\t\t\t\t\t'transform',\n\t\t\t\t\t\t\t`translate(${xDimensions[0]}, 16)`\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Align legend title with start of axis\n\t\t\t\t\t\tsvg.select('g.legend-title').attr(\n\t\t\t\t\t\t\t'transform',\n\t\t\t\t\t\t\t`translate(${xDimensions[0]}, 0)`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\trender(animate = false) {\n\t\tconst options = this.getOptions();\n\n\t\tconst customColors = Tools.getProperty(\n\t\t\toptions,\n\t\t\t'color',\n\t\t\t'gradient',\n\t\t\t'colors'\n\t\t);\n\n\t\tconst colorScaleType = Tools.getProperty(\n\t\t\toptions,\n\t\t\t'heatmap',\n\t\t\t'colorLegend',\n\t\t\t'type'\n\t\t);\n\n\t\tlet colorPairingOption = Tools.getProperty(\n\t\t\toptions,\n\t\t\t'color',\n\t\t\t'pairing',\n\t\t\t'option'\n\t\t);\n\n\t\tconst title = Tools.getProperty(\n\t\t\toptions,\n\t\t\t'heatmap',\n\t\t\t'colorLegend',\n\t\t\t'title'\n\t\t);\n\n\t\tconst customColorsEnabled = !Tools.isEmpty(customColors);\n\t\tconst domain = this.model.getValueDomain();\n\n\t\tconst svg = this.getComponentContainer();\n\n\t\t// Clear DOM if loading\n\t\tconst isDataLoading = Tools.getProperty(\n\t\t\tthis.getOptions(),\n\t\t\t'data',\n\t\t\t'loading'\n\t\t);\n\n\t\tif (isDataLoading) {\n\t\t\tsvg.html('');\n\t\t\treturn;\n\t\t}\n\n\t\tconst legend = DOMUtils.appendOrSelect(svg, 'g.legend');\n\t\tconst axis = DOMUtils.appendOrSelect(legend, 'g.legend-axis');\n\n\t\tconst { width } = DOMUtils.getSVGElementSize(svg, {\n\t\t\tuseAttrs: true,\n\t\t});\n\n\t\tlet barWidth = Configuration.legend.color.barWidth;\n\t\tif (width <= Configuration.legend.color.barWidth) {\n\t\t\tbarWidth = width;\n\t\t}\n\n\t\tif (title) {\n\t\t\tconst legendTitleGroup = DOMUtils.appendOrSelect(\n\t\t\t\tsvg,\n\t\t\t\t'g.legend-title'\n\t\t\t);\n\t\t\tconst legendTitle = DOMUtils.appendOrSelect(\n\t\t\t\tlegendTitleGroup,\n\t\t\t\t'text'\n\t\t\t);\n\t\t\tlegendTitle.text(title).attr('dy', '0.7em');\n\n\t\t\t// Move the legend down by 16 pixels to display legend text on top\n\t\t\tlegend.attr('transform', `translate(0, 16)`);\n\t\t}\n\n\t\t// If domain consists of negative and positive values, use diverging palettes\n\t\tconst colorScheme = domain[0] < 0 && domain[1] > 0 ? 'diverge' : 'mono';\n\n\t\t// Use default color pairing options if not in defined range\n\t\tif (\n\t\t\tcolorPairingOption < 1 &&\n\t\t\tcolorPairingOption > 4 &&\n\t\t\tcolorScheme === 'mono'\n\t\t) {\n\t\t\tcolorPairingOption = 1;\n\t\t} else if (\n\t\t\tcolorPairingOption < 1 &&\n\t\t\tcolorPairingOption > 2 &&\n\t\t\tcolorScheme === 'diverge'\n\t\t) {\n\t\t\tcolorPairingOption = 1;\n\t\t}\n\n\t\tlet colorPairing = [];\n\t\t// Carbon charts has 11 colors for a single monochromatic palette & 17 for a divergent palette\n\t\tlet colorGroupingLength = colorScheme === 'diverge' ? 17 : 11;\n\n\t\tif (!customColorsEnabled) {\n\t\t\t// Add class names to list and the amount based on the color scheme\n\t\t\tfor (let i = 1; i < colorGroupingLength + 1; i++) {\n\t\t\t\tcolorPairing.push(\n\t\t\t\t\tcolorScaleType === ColorLegendType.LINEAR\n\t\t\t\t\t\t? `stop-color-${colorScheme}-${colorPairingOption}-${i}`\n\t\t\t\t\t\t: `fill-${colorScheme}-${colorPairingOption}-${i}`\n\t\t\t\t);\n\t\t\t}\n\t\t} else {\n\t\t\t// Use custom colors\n\t\t\tcolorPairing = customColors;\n\t\t}\n\n\t\tif (colorScaleType === ColorLegendType.LINEAR) {\n\t\t\tconst stopLengthPercentage = 100 / (colorPairing.length - 1);\n\n\t\t\t// Generate the gradient\n\t\t\tconst linearGradient = DOMUtils.appendOrSelect(\n\t\t\t\tlegend,\n\t\t\t\t'linearGradient'\n\t\t\t);\n\t\t\tlinearGradient\n\t\t\t\t.attr('id', `${this.gradient_id}-legend`)\n\t\t\t\t.selectAll('stop')\n\t\t\t\t.data(colorPairing)\n\t\t\t\t.enter()\n\t\t\t\t.append('stop')\n\t\t\t\t.attr('offset', (_, i) => `${i * stopLengthPercentage}%`)\n\t\t\t\t.attr('class', (_, i) => colorPairing[i])\n\t\t\t\t.attr('stop-color', (d) => d);\n\n\t\t\t// Create the legend container\n\t\t\tconst rectangle = DOMUtils.appendOrSelect(legend, 'rect');\n\t\t\trectangle\n\t\t\t\t.attr('width', barWidth)\n\t\t\t\t.attr('height', Configuration.legend.color.barHeight)\n\t\t\t\t.style('fill', `url(#${this.gradient_id}-legend)`);\n\n\t\t\t// Create scale & ticks\n\t\t\tconst linearScale = scaleLinear()\n\t\t\t\t.domain(domain)\n\t\t\t\t.range([0, barWidth]);\n\t\t\tdomain.splice(1, 0, (domain[0] + domain[1]) / 2);\n\n\t\t\tconst xAxis = axisBottom(linearScale)\n\t\t\t\t.tickSize(0)\n\t\t\t\t.tickValues(domain);\n\n\t\t\t// Align axes at the bottom of the rectangle and delete the domain line\n\t\t\taxis.attr(\n\t\t\t\t'transform',\n\t\t\t\t`translate(0,${Configuration.legend.color.axisYTranslation})`\n\t\t\t).call(xAxis);\n\n\t\t\t// Remove domain\n\t\t\taxis.select('.domain').remove();\n\n\t\t\t// Align text to fit in container\n\t\t\taxis.style('text-anchor', 'start');\n\t\t} else if (colorScaleType === ColorLegendType.QUANTIZE) {\n\t\t\t// Generate equal chunks between range to act as ticks\n\t\t\tconst interpolator = interpolateRound(domain[0], domain[1]);\n\t\t\tconst quant = quantize(interpolator, colorPairing.length);\n\n\t\t\t// If divergent && non-custom color, remove 0/white from being displayed\n\t\t\tif (!customColorsEnabled && colorScheme === 'diverge') {\n\t\t\t\tcolorPairing.splice(colorPairing.length / 2, 1);\n\t\t\t}\n\n\t\t\tconst colorScaleBand = scaleBand()\n\t\t\t\t.domain(colorPairing)\n\t\t\t\t.range([0, barWidth]);\n\n\t\t\t// Render the quantized rectangles\n\t\t\tconst rectangle = DOMUtils.appendOrSelect(\n\t\t\t\tlegend,\n\t\t\t\t'g.quantized-rect'\n\t\t\t);\n\n\t\t\trectangle\n\t\t\t\t.selectAll('rect')\n\t\t\t\t.data(colorScaleBand.domain())\n\t\t\t\t.join('rect')\n\t\t\t\t.attr('x', (d) => colorScaleBand(d))\n\t\t\t\t.attr('y', 0)\n\t\t\t\t.attr('width', Math.max(0, colorScaleBand.bandwidth()) - 1)\n\t\t\t\t.attr('height', Configuration.legend.color.barHeight)\n\t\t\t\t.attr('class', (d) => d)\n\t\t\t\t.attr('fill', (d) => d);\n\n\t\t\tconst xAxis = axisBottom(colorScaleBand)\n\t\t\t\t.tickSize(0)\n\t\t\t\t.tickValues(colorPairing)\n\t\t\t\t.tickFormat((_, i) => {\n\t\t\t\t\t// Display every other tick to create space\n\t\t\t\t\tif (\n\t\t\t\t\t\t!customColorsEnabled &&\n\t\t\t\t\t\t((i + 1) % 2 === 0 || i === colorPairing.length - 1)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Use the quant interpolators as ticks\n\t\t\t\t\treturn quant[i].toString();\n\t\t\t\t});\n\n\t\t\t// Align axis to match bandwidth start after initial (white)\n\t\t\tconst axisTranslation = colorScaleBand.bandwidth() / 2;\n\t\t\taxis.attr(\n\t\t\t\t'transform',\n\t\t\t\t`translate(${\n\t\t\t\t\t!customColorsEnabled && colorScheme === 'diverge' ? '-' : ''\n\t\t\t\t}${axisTranslation}, ${\n\t\t\t\t\tConfiguration.legend.color.axisYTranslation\n\t\t\t\t})`\n\t\t\t).call(xAxis);\n\n\t\t\t// Append the last tick\n\t\t\tconst firstTick = axis.select('g.tick').clone(true);\n\t\t\tfirstTick\n\t\t\t\t.attr(\n\t\t\t\t\t'transform',\n\t\t\t\t\t`translate(${\n\t\t\t\t\t\tbarWidth +\n\t\t\t\t\t\t(!customColorsEnabled && colorScheme === 'diverge'\n\t\t\t\t\t\t\t? axisTranslation\n\t\t\t\t\t\t\t: -axisTranslation)\n\t\t\t\t\t}, 0)`\n\t\t\t\t)\n\t\t\t\t.classed('final-tick', true)\n\t\t\t\t.select('text')\n\t\t\t\t.text(quant[quant.length - 1]);\n\n\t\t\taxis.enter().append(firstTick.node());\n\t\t\taxis.select('.domain').remove();\n\t\t} else {\n\t\t\tthrow Error('Entered color legend type is not supported.');\n\t\t}\n\n\t\t// Translate last axis tick if barWidth equals chart width\n\t\tif (width <= Configuration.legend.color.barWidth) {\n\t\t\tconst lastTick = axis.select('g.tick:last-of-type text');\n\t\t\tconst { width } = DOMUtils.getSVGElementSize(lastTick, {\n\t\t\t\tuseBBox: true,\n\t\t\t});\n\t\t\tlastTick.attr('x', `-${width}`);\n\t\t}\n\t}\n\n\tdestroy() {\n\t\t// Remove legend listeners\n\t\tconst eventsFragment = this.services.events;\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Axis.RENDER_COMPLETE,\n\t\t\tthis.handleAxisComplete\n\t\t);\n\t}\n}\n"]}
@@ -8,5 +8,6 @@ export declare class StackedBar extends Bar {
8
8
  handleLegendOnHover: (event: CustomEvent<any>) => void;
9
9
  handleLegendMouseOut: (event: CustomEvent<any>) => void;
10
10
  addEventListeners(): void;
11
+ protected getBarWidth(): any;
11
12
  destroy(): void;
12
13
  }
@@ -15,6 +15,7 @@ var __extends = (this && this.__extends) || (function () {
15
15
  import { Tools } from '../../tools';
16
16
  import { Bar } from './bar';
17
17
  import { Roles, Events, CartesianOrientations, ColorClassNameTypes, RenderTypes, } from '../../interfaces';
18
+ import { DOMUtils } from '../../services';
18
19
  // D3 Imports
19
20
  import { select } from 'd3-selection';
20
21
  var StackedBar = /** @class */ (function (_super) {
@@ -246,6 +247,21 @@ var StackedBar = /** @class */ (function (_super) {
246
247
  });
247
248
  });
248
249
  };
250
+ StackedBar.prototype.getBarWidth = function () {
251
+ var options = this.getOptions();
252
+ if (Tools.getProperty(options, "bars", "width")) {
253
+ return options.bars.width;
254
+ }
255
+ var mainXScale = this.services.cartesianScales.getMainXScale();
256
+ var chartWidth = DOMUtils.getSVGElementSize(this.parent, {
257
+ useAttrs: true,
258
+ }).width;
259
+ var numberOfDomainValues = this.model.getStackKeys().length;
260
+ if (!mainXScale.step) {
261
+ return Math.min(options.bars.maxWidth, (chartWidth * 0.25) / numberOfDomainValues);
262
+ }
263
+ return Math.min(options.bars.maxWidth, mainXScale.step() / 2);
264
+ };
249
265
  StackedBar.prototype.destroy = function () {
250
266
  // Remove event listeners
251
267
  this.parent
@@ -1 +1 @@
1
- {"version":3,"file":"bar-stacked.js","sourceRoot":"","sources":["bar-stacked.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Tools } from '../../tools';\nimport { Bar } from './bar';\nimport {\n\tRoles,\n\tEvents,\n\tCartesianOrientations,\n\tColorClassNameTypes,\n\tRenderTypes,\n} from '../../interfaces';\n\n// D3 Imports\nimport { select } from 'd3-selection';\n\nexport class StackedBar extends Bar {\n\ttype = 'stacked-bar';\n\trenderType = RenderTypes.SVG;\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct circle on legend item hovers\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\n\t\t// Un-highlight circles on legend item mouseouts\n\t\teventsFragment.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.getComponentContainer({ withinChartClip: true });\n\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\t// Create the data and keys that'll be used by the stack layout\n\t\tconst stackData = this.model.getStackedData({\n\t\t\tgroups: this.configs.groups,\n\t\t\tdivergent: true,\n\t\t});\n\n\t\tconst activeDataGroupNames = this.model.getActiveDataGroupNames();\n\n\t\t// Update data on all bar groups\n\t\tconst barGroups = svg\n\t\t\t.selectAll('g.bars')\n\t\t\t.data(stackData, (d) => Tools.getProperty(d, 0, groupMapsTo));\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tbarGroups.exit().attr('opacity', 0).remove();\n\n\t\t// Add bar groups that need to be introduced\n\t\tbarGroups\n\t\t\t.enter()\n\t\t\t.append('g')\n\t\t\t.classed('bars', true)\n\t\t\t.attr('role', Roles.GROUP)\n\t\t\t.attr('data-name', 'bars');\n\n\t\t// Update data on all bars\n\t\tconst bars = svg\n\t\t\t.selectAll('g.bars')\n\t\t\t.selectAll('path.bar')\n\t\t\t.data(\n\t\t\t\t(d) => d,\n\t\t\t\t(d) => d.data.sharedStackKey\n\t\t\t);\n\n\t\t// Remove bars that need to be removed\n\t\tbars.exit().remove();\n\n\t\tbars.enter()\n\t\t\t.append('path')\n\t\t\t.merge(bars)\n\t\t\t.classed('bar', true)\n\t\t\t.transition()\n\t\t\t.call((t) =>\n\t\t\t\tthis.services.transitions.setupTransition({\n\t\t\t\t\ttransition: t,\n\t\t\t\t\tname: 'bar-update-enter',\n\t\t\t\t\tanimate,\n\t\t\t\t})\n\t\t\t)\n\t\t\t.attr('class', (d) =>\n\t\t\t\tthis.model.getColorClassName({\n\t\t\t\t\tclassNameTypes: [ColorClassNameTypes.FILL],\n\t\t\t\t\tdataGroupName: d[groupMapsTo],\n\t\t\t\t\toriginalClassName: 'bar',\n\t\t\t\t})\n\t\t\t)\n\t\t\t.style('fill', (d) => this.model.getFillColor(d[groupMapsTo]))\n\t\t\t.attr('d', (d, i) => {\n\t\t\t\tconst key = d.data.sharedStackKey;\n\n\t\t\t\t/*\n\t\t\t\t * Orientation support for horizontal/vertical bar charts\n\t\t\t\t * Determine coordinates needed for a vertical set of paths\n\t\t\t\t * to draw the bars needed, and pass those coordinates down to\n\t\t\t\t * generateSVGPathString() to decide whether it needs to flip them\n\t\t\t\t */\n\t\t\t\tconst barWidth = this.getBarWidth();\n\t\t\t\tconst x0 =\n\t\t\t\t\tthis.services.cartesianScales.getDomainValue(key, i) -\n\t\t\t\t\tbarWidth / 2;\n\t\t\t\tconst x1 = x0 + barWidth;\n\t\t\t\tlet y0 = this.services.cartesianScales.getRangeValue(d[0], i);\n\t\t\t\tlet y1 = this.services.cartesianScales.getRangeValue(d[1], i);\n\n\t\t\t\t// don't show if part of bar is out of zoom domain\n\t\t\t\tif (this.isOutsideZoomedDomain(x0, x1)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Add the divider gap\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(y1 - y0) > 0 &&\n\t\t\t\t\tMath.abs(y1 - y0) > options.bars.dividerSize\n\t\t\t\t) {\n\t\t\t\t\tconst barIsNegative = d[0] < 0 && d[1] <= 0;\n\t\t\t\t\tif (barIsNegative && activeDataGroupNames.length > 1) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.services.cartesianScales.getOrientation() ===\n\t\t\t\t\t\t\tCartesianOrientations.VERTICAL\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ty1 += d[1] === 0 ? 2 : 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!barIsNegative) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.services.cartesianScales.getOrientation() ===\n\t\t\t\t\t\t\tCartesianOrientations.VERTICAL\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ty1 += 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn Tools.generateSVGPathString(\n\t\t\t\t\t{ x0, x1, y0, y1 },\n\t\t\t\t\tthis.services.cartesianScales.getOrientation()\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', 'bar')\n\t\t\t.attr('aria-label', (d) => d[1] - d[0]);\n\n\t\t// Add event listeners for the above elements\n\t\tthis.addEventListeners();\n\t}\n\n\t// Highlight elements that match the hovered legend item\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('path.bar')\n\t\t\t.transition('legend-hover-bar')\n\t\t\t.call((t) =>\n\t\t\t\tthis.services.transitions.setupTransition({\n\t\t\t\t\ttransition: t,\n\t\t\t\t\tname: 'legend-hover-bar',\n\t\t\t\t})\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\t// Un-highlight all elements\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent\n\t\t\t.selectAll('path.bar')\n\t\t\t.transition('legend-mouseout-bar')\n\t\t\t.call((t) =>\n\t\t\t\tthis.services.transitions.setupTransition({\n\t\t\t\t\ttransition: t,\n\t\t\t\t\tname: 'legend-mouseout-bar',\n\t\t\t\t})\n\t\t\t)\n\t\t\t.attr('opacity', 1);\n\t};\n\n\taddEventListeners() {\n\t\tconst options = this.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst self = this;\n\t\tthis.parent\n\t\t\t.selectAll('path.bar')\n\t\t\t.on('mouseover', function (event, datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed('hovered', true);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOVER, {\n\t\t\t\t\tevent,\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum,\n\t\t\t\t});\n\n\t\t\t\tconst displayData = self.model.getDisplayData(\n\t\t\t\t\tself.configs.groups\n\t\t\t\t);\n\n\t\t\t\tlet matchingDataPoint = displayData.find((d) => {\n\t\t\t\t\tconst domainIdentifier = self.services.cartesianScales.getDomainIdentifier(\n\t\t\t\t\t\td\n\t\t\t\t\t);\n\t\t\t\t\tconst rangeIdentifier = self.services.cartesianScales.getRangeIdentifier(\n\t\t\t\t\t\td\n\t\t\t\t\t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\td[rangeIdentifier] === datum.data[datum[groupMapsTo]] &&\n\t\t\t\t\t\td[domainIdentifier].toString() ===\n\t\t\t\t\t\t\tdatum.data.sharedStackKey &&\n\t\t\t\t\t\td[groupMapsTo] === datum[groupMapsTo]\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif (matchingDataPoint === undefined) {\n\t\t\t\t\t// use the primary range and domain ids\n\t\t\t\t\tconst domainIdentifier = self.services.cartesianScales.getDomainIdentifier();\n\t\t\t\t\tconst rangeIdentifier = self.services.cartesianScales.getRangeIdentifier();\n\t\t\t\t\tmatchingDataPoint = {\n\t\t\t\t\t\t[domainIdentifier]: datum.data.sharedStackKey,\n\t\t\t\t\t\t[rangeIdentifier]: datum.data[datum[groupMapsTo]],\n\t\t\t\t\t\t[groupMapsTo]: datum[groupMapsTo],\n\t\t\t\t\t};\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\tevent,\n\t\t\t\t\thoveredElement,\n\t\t\t\t\tdata: [matchingDataPoint],\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('mousemove', function (event, datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEMOVE, {\n\t\t\t\t\tevent,\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum,\n\t\t\t\t});\n\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.MOVE, {\n\t\t\t\t\tevent,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('click', function (event, datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_CLICK, {\n\t\t\t\t\tevent,\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 (event, datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed('hovered', false);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {\n\t\t\t\t\tevent,\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, {\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('path.bar')\n\t\t\t.on('mouseover', null)\n\t\t\t.on('mousemove', null)\n\t\t\t.on('mouseout', null);\n\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"]}
1
+ {"version":3,"file":"bar-stacked.js","sourceRoot":"","sources":["bar-stacked.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Tools } from '../../tools';\nimport { Bar } from './bar';\nimport {\n\tRoles,\n\tEvents,\n\tCartesianOrientations,\n\tColorClassNameTypes,\n\tRenderTypes,\n} from '../../interfaces';\nimport { DOMUtils } from '../../services';\n\n\n// D3 Imports\nimport { select } from 'd3-selection';\n\nexport class StackedBar extends Bar {\n\ttype = 'stacked-bar';\n\trenderType = RenderTypes.SVG;\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct circle on legend item hovers\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Legend.ITEM_HOVER,\n\t\t\tthis.handleLegendOnHover\n\t\t);\n\n\t\t// Un-highlight circles on legend item mouseouts\n\t\teventsFragment.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.getComponentContainer({ withinChartClip: true });\n\n\t\t// Chart options mixed with the internal configurations\n\t\tconst options = this.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\t// Create the data and keys that'll be used by the stack layout\n\t\tconst stackData = this.model.getStackedData({\n\t\t\tgroups: this.configs.groups,\n\t\t\tdivergent: true,\n\t\t});\n\n\t\tconst activeDataGroupNames = this.model.getActiveDataGroupNames();\n\n\t\t// Update data on all bar groups\n\t\tconst barGroups = svg\n\t\t\t.selectAll('g.bars')\n\t\t\t.data(stackData, (d) => Tools.getProperty(d, 0, groupMapsTo));\n\n\t\t// Remove elements that need to be exited\n\t\t// We need exit at the top here to make sure that\n\t\t// Data filters are processed before entering new elements\n\t\t// Or updating existing ones\n\t\tbarGroups.exit().attr('opacity', 0).remove();\n\n\t\t// Add bar groups that need to be introduced\n\t\tbarGroups\n\t\t\t.enter()\n\t\t\t.append('g')\n\t\t\t.classed('bars', true)\n\t\t\t.attr('role', Roles.GROUP)\n\t\t\t.attr('data-name', 'bars');\n\n\t\t// Update data on all bars\n\t\tconst bars = svg\n\t\t\t.selectAll('g.bars')\n\t\t\t.selectAll('path.bar')\n\t\t\t.data(\n\t\t\t\t(d) => d,\n\t\t\t\t(d) => d.data.sharedStackKey\n\t\t\t);\n\n\t\t// Remove bars that need to be removed\n\t\tbars.exit().remove();\n\n\t\tbars.enter()\n\t\t\t.append('path')\n\t\t\t.merge(bars)\n\t\t\t.classed('bar', true)\n\t\t\t.transition()\n\t\t\t.call((t) =>\n\t\t\t\tthis.services.transitions.setupTransition({\n\t\t\t\t\ttransition: t,\n\t\t\t\t\tname: 'bar-update-enter',\n\t\t\t\t\tanimate,\n\t\t\t\t})\n\t\t\t)\n\t\t\t.attr('class', (d) =>\n\t\t\t\tthis.model.getColorClassName({\n\t\t\t\t\tclassNameTypes: [ColorClassNameTypes.FILL],\n\t\t\t\t\tdataGroupName: d[groupMapsTo],\n\t\t\t\t\toriginalClassName: 'bar',\n\t\t\t\t})\n\t\t\t)\n\t\t\t.style('fill', (d) => this.model.getFillColor(d[groupMapsTo]))\n\t\t\t.attr('d', (d, i) => {\n\t\t\t\tconst key = d.data.sharedStackKey;\n\n\t\t\t\t/*\n\t\t\t\t * Orientation support for horizontal/vertical bar charts\n\t\t\t\t * Determine coordinates needed for a vertical set of paths\n\t\t\t\t * to draw the bars needed, and pass those coordinates down to\n\t\t\t\t * generateSVGPathString() to decide whether it needs to flip them\n\t\t\t\t */\n\t\t\t\tconst barWidth = this.getBarWidth();\n\t\t\t\tconst x0 =\n\t\t\t\t\tthis.services.cartesianScales.getDomainValue(key, i) -\n\t\t\t\t\tbarWidth / 2;\n\t\t\t\tconst x1 = x0 + barWidth;\n\t\t\t\tlet y0 = this.services.cartesianScales.getRangeValue(d[0], i);\n\t\t\t\tlet y1 = this.services.cartesianScales.getRangeValue(d[1], i);\n\n\t\t\t\t// don't show if part of bar is out of zoom domain\n\t\t\t\tif (this.isOutsideZoomedDomain(x0, x1)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Add the divider gap\n\t\t\t\tif (\n\t\t\t\t\tMath.abs(y1 - y0) > 0 &&\n\t\t\t\t\tMath.abs(y1 - y0) > options.bars.dividerSize\n\t\t\t\t) {\n\t\t\t\t\tconst barIsNegative = d[0] < 0 && d[1] <= 0;\n\t\t\t\t\tif (barIsNegative && activeDataGroupNames.length > 1) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.services.cartesianScales.getOrientation() ===\n\t\t\t\t\t\t\tCartesianOrientations.VERTICAL\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ty1 += d[1] === 0 ? 2 : 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (!barIsNegative) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis.services.cartesianScales.getOrientation() ===\n\t\t\t\t\t\t\tCartesianOrientations.VERTICAL\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ty1 += 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ty1 -= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn Tools.generateSVGPathString(\n\t\t\t\t\t{ x0, x1, y0, y1 },\n\t\t\t\t\tthis.services.cartesianScales.getOrientation()\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', 'bar')\n\t\t\t.attr('aria-label', (d) => d[1] - d[0]);\n\n\t\t// Add event listeners for the above elements\n\t\tthis.addEventListeners();\n\t}\n\n\t// Highlight elements that match the hovered legend item\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('path.bar')\n\t\t\t.transition('legend-hover-bar')\n\t\t\t.call((t) =>\n\t\t\t\tthis.services.transitions.setupTransition({\n\t\t\t\t\ttransition: t,\n\t\t\t\t\tname: 'legend-hover-bar',\n\t\t\t\t})\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\t// Un-highlight all elements\n\thandleLegendMouseOut = (event: CustomEvent) => {\n\t\tthis.parent\n\t\t\t.selectAll('path.bar')\n\t\t\t.transition('legend-mouseout-bar')\n\t\t\t.call((t) =>\n\t\t\t\tthis.services.transitions.setupTransition({\n\t\t\t\t\ttransition: t,\n\t\t\t\t\tname: 'legend-mouseout-bar',\n\t\t\t\t})\n\t\t\t)\n\t\t\t.attr('opacity', 1);\n\t};\n\n\taddEventListeners() {\n\t\tconst options = this.getOptions();\n\t\tconst { groupMapsTo } = options.data;\n\n\t\tconst self = this;\n\t\tthis.parent\n\t\t\t.selectAll('path.bar')\n\t\t\t.on('mouseover', function (event, datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed('hovered', true);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOVER, {\n\t\t\t\t\tevent,\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum,\n\t\t\t\t});\n\n\t\t\t\tconst displayData = self.model.getDisplayData(\n\t\t\t\t\tself.configs.groups\n\t\t\t\t);\n\n\t\t\t\tlet matchingDataPoint = displayData.find((d) => {\n\t\t\t\t\tconst domainIdentifier = self.services.cartesianScales.getDomainIdentifier(\n\t\t\t\t\t\td\n\t\t\t\t\t);\n\t\t\t\t\tconst rangeIdentifier = self.services.cartesianScales.getRangeIdentifier(\n\t\t\t\t\t\td\n\t\t\t\t\t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\td[rangeIdentifier] === datum.data[datum[groupMapsTo]] &&\n\t\t\t\t\t\td[domainIdentifier].toString() ===\n\t\t\t\t\t\t\tdatum.data.sharedStackKey &&\n\t\t\t\t\t\td[groupMapsTo] === datum[groupMapsTo]\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tif (matchingDataPoint === undefined) {\n\t\t\t\t\t// use the primary range and domain ids\n\t\t\t\t\tconst domainIdentifier = self.services.cartesianScales.getDomainIdentifier();\n\t\t\t\t\tconst rangeIdentifier = self.services.cartesianScales.getRangeIdentifier();\n\t\t\t\t\tmatchingDataPoint = {\n\t\t\t\t\t\t[domainIdentifier]: datum.data.sharedStackKey,\n\t\t\t\t\t\t[rangeIdentifier]: datum.data[datum[groupMapsTo]],\n\t\t\t\t\t\t[groupMapsTo]: datum[groupMapsTo],\n\t\t\t\t\t};\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\tevent,\n\t\t\t\t\thoveredElement,\n\t\t\t\t\tdata: [matchingDataPoint],\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('mousemove', function (event, datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEMOVE, {\n\t\t\t\t\tevent,\n\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\tdatum,\n\t\t\t\t});\n\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.MOVE, {\n\t\t\t\t\tevent,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('click', function (event, datum) {\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_CLICK, {\n\t\t\t\t\tevent,\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 (event, datum) {\n\t\t\t\tconst hoveredElement = select(this);\n\t\t\t\thoveredElement.classed('hovered', false);\n\n\t\t\t\t// Dispatch mouse event\n\t\t\t\tself.services.events.dispatchEvent(Events.Bar.BAR_MOUSEOUT, {\n\t\t\t\t\tevent,\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, {\n\t\t\t\t\thoveredElement,\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tprotected getBarWidth() {\n\t\tconst options = this.getOptions();\n\t\tif (Tools.getProperty(options, \"bars\", \"width\")) {\n\t\t\treturn options.bars.width;\n\t\t}\n\t\tconst mainXScale = this.services.cartesianScales.getMainXScale();\n\t\tconst chartWidth = DOMUtils.getSVGElementSize(this.parent, {\n\t\t\tuseAttrs: true,\n\t\t}).width;\n\t\n\t\tconst numberOfDomainValues = this.model.getStackKeys().length;\n\t\n\t\tif (!mainXScale.step) {\n\t\t\treturn Math.min(\n\t\t\t\toptions.bars.maxWidth,\n\t\t\t\t(chartWidth * 0.25) / numberOfDomainValues\n\t\t\t);\n\t\t}\n\t\treturn Math.min(options.bars.maxWidth, mainXScale.step() / 2);\n\t}\n\t\n\tdestroy() {\n\t\t// Remove event listeners\n\t\tthis.parent\n\t\t\t.selectAll('path.bar')\n\t\t\t.on('mouseover', null)\n\t\t\t.on('mousemove', null)\n\t\t\t.on('mouseout', null);\n\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"]}
@@ -0,0 +1,25 @@
1
+ import { Component } from '../component';
2
+ import { RenderTypes } from '../../interfaces';
3
+ export declare class Heatmap extends Component {
4
+ type: string;
5
+ renderType: RenderTypes;
6
+ private matrix;
7
+ private xBandwidth;
8
+ private yBandwidth;
9
+ private translationUnits;
10
+ init(): void;
11
+ render(animate?: boolean): void;
12
+ /**
13
+ * Generates a box using lines to create a hover effect
14
+ * The lines have drop shadow in their respective direction
15
+ * @param parentTag - tag name
16
+ * @param xBandwidth - X length
17
+ * @param yBandwidth - y length
18
+ */
19
+ private createOuterBox;
20
+ private determineDividerStatus;
21
+ addEventListener(): void;
22
+ handleAxisOnHover: (event: CustomEvent<any>) => void;
23
+ handleAxisMouseOut: (event: CustomEvent<any>) => void;
24
+ destroy(): void;
25
+ }
@@ -0,0 +1,369 @@
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ extendStatics(d, b);
10
+ function __() { this.constructor = d; }
11
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
12
+ };
13
+ })();
14
+ // Internal Imports
15
+ import { Component } from '../component';
16
+ import * as Configuration from '../../configuration';
17
+ import { Events, RenderTypes, DividerStatus } from '../../interfaces';
18
+ import { Tools } from '../../tools';
19
+ import { DOMUtils } from '../../services';
20
+ import { get } from 'lodash-es';
21
+ // D3 Imports
22
+ import { min } from 'd3-array';
23
+ import { select } from 'd3-selection';
24
+ var Heatmap = /** @class */ (function (_super) {
25
+ __extends(Heatmap, _super);
26
+ function Heatmap() {
27
+ var _this = _super !== null && _super.apply(this, arguments) || this;
28
+ _this.type = 'heatmap';
29
+ _this.renderType = RenderTypes.SVG;
30
+ _this.matrix = {};
31
+ _this.xBandwidth = 0;
32
+ _this.yBandwidth = 0;
33
+ _this.translationUnits = {
34
+ x: 0,
35
+ y: 0,
36
+ };
37
+ // Highlight elements that match the hovered axis item
38
+ _this.handleAxisOnHover = function (event) {
39
+ var detail = event.detail;
40
+ var datum = detail.datum;
41
+ // Unique ranges and domains
42
+ var ranges = _this.model.getUniqueRanges();
43
+ var domains = _this.model.getUniqueDomain();
44
+ // Labels
45
+ var domainLabel = _this.services.cartesianScales.getDomainLabel();
46
+ var rangeLabel = _this.services.cartesianScales.getRangeLabel();
47
+ // Scales
48
+ var mainXScale = _this.services.cartesianScales.getMainXScale();
49
+ var mainYScale = _this.services.cartesianScales.getMainYScale();
50
+ var label = '', sum = 0, minimum = 0, maximum = 0;
51
+ // Check to see where datum belongs
52
+ if (_this.matrix[datum] !== undefined) {
53
+ label = domainLabel;
54
+ // Iterate through Object and get sum, min, and max
55
+ ranges.forEach(function (element) {
56
+ var value = _this.matrix[datum][element].value || 0;
57
+ sum += value;
58
+ minimum = value < minimum ? value : minimum;
59
+ maximum = value > maximum ? value : maximum;
60
+ });
61
+ }
62
+ else {
63
+ label = rangeLabel;
64
+ domains.forEach(function (element) {
65
+ var value = _this.matrix[element][datum].value || 0;
66
+ sum += value;
67
+ minimum = value < minimum ? value : minimum;
68
+ maximum = value > maximum ? value : maximum;
69
+ });
70
+ }
71
+ if (mainXScale(datum) !== undefined) {
72
+ _this.parent
73
+ .select('g.multi-cell.column-highlight')
74
+ .classed('highlighter-hidden', false)
75
+ .attr('transform', "translate(" + mainXScale(datum) + ", " + min(mainYScale.range()) + ")");
76
+ }
77
+ else if (mainYScale(datum) !== undefined) {
78
+ _this.parent
79
+ .select('g.multi-cell.row-highlight')
80
+ .classed('highlighter-hidden', false)
81
+ .attr('transform', "translate(" + min(mainXScale.range()) + "," + mainYScale(datum) + ")");
82
+ }
83
+ // Dispatch tooltip show event
84
+ _this.services.events.dispatchEvent(Events.Tooltip.SHOW, {
85
+ event: detail.event,
86
+ hoveredElement: select(event.detail.element),
87
+ items: [
88
+ {
89
+ label: label,
90
+ value: datum,
91
+ bold: true,
92
+ },
93
+ {
94
+ label: 'Min',
95
+ value: minimum,
96
+ },
97
+ {
98
+ label: 'Max',
99
+ value: maximum,
100
+ },
101
+ {
102
+ label: 'Average',
103
+ value: sum / domains.length,
104
+ },
105
+ ],
106
+ });
107
+ };
108
+ // Un-highlight all elements
109
+ _this.handleAxisMouseOut = function (event) {
110
+ // Hide column/row
111
+ _this.parent
112
+ .selectAll('g.multi-cell')
113
+ .classed('highlighter-hidden', true);
114
+ // Dispatch hide tooltip event
115
+ _this.services.events.dispatchEvent(Events.Tooltip.HIDE, {
116
+ event: event,
117
+ });
118
+ };
119
+ return _this;
120
+ }
121
+ Heatmap.prototype.init = function () {
122
+ var eventsFragment = this.services.events;
123
+ // Highlight correct cells on Axis item hovers
124
+ eventsFragment.addEventListener(Events.Axis.LABEL_MOUSEOVER, this.handleAxisOnHover);
125
+ // Highlight correct cells on Axis item mouseouts
126
+ eventsFragment.addEventListener(Events.Axis.LABEL_MOUSEOUT, this.handleAxisMouseOut);
127
+ // Highlight correct cells on Axis item focus
128
+ eventsFragment.addEventListener(Events.Axis.LABEL_FOCUS, this.handleAxisOnHover);
129
+ // Highlight correct cells on Axis item blur
130
+ eventsFragment.addEventListener(Events.Axis.LABEL_BLUR, this.handleAxisMouseOut);
131
+ };
132
+ Heatmap.prototype.render = function (animate) {
133
+ var _this = this;
134
+ if (animate === void 0) { animate = true; }
135
+ var svg = this.getComponentContainer({ withinChartClip: true });
136
+ // Lower the chart so the axes are always visible
137
+ svg.lower();
138
+ var cartesianScales = this.services.cartesianScales;
139
+ this.matrix = this.model.getMatrix();
140
+ svg.html('');
141
+ if (Tools.getProperty(this.getOptions(), 'data', 'loading')) {
142
+ return;
143
+ }
144
+ // determine x and y axis scale
145
+ var mainXScale = cartesianScales.getMainXScale();
146
+ var mainYScale = cartesianScales.getMainYScale();
147
+ var domainIdentifier = cartesianScales.getDomainIdentifier();
148
+ var rangeIdentifier = cartesianScales.getRangeIdentifier();
149
+ // Get unique axis values & create a matrix
150
+ var uniqueDomain = this.model.getUniqueDomain();
151
+ var uniqueRange = this.model.getUniqueRanges();
152
+ // Get matrix in the form of an array to create a single heatmap group
153
+ var matrixArray = this.model.getMatrixAsArray();
154
+ // Get available chart area
155
+ var xRange = mainXScale.range();
156
+ var yRange = mainYScale.range();
157
+ // Determine rectangle dimensions based on the number of unique domain and range
158
+ this.xBandwidth = Math.abs((xRange[1] - xRange[0]) / uniqueDomain.length);
159
+ this.yBandwidth = Math.abs((yRange[1] - yRange[0]) / uniqueRange.length);
160
+ var patternID = this.services.domUtils.generateElementIDString("heatmap-pattern-stripes");
161
+ // Create a striped pattern for missing data
162
+ svg.append('defs')
163
+ .append('pattern')
164
+ .attr('id', patternID)
165
+ .attr('width', 3)
166
+ .attr('height', 3)
167
+ .attr('patternUnits', 'userSpaceOnUse')
168
+ .attr('patternTransform', 'rotate(45)')
169
+ .append('rect')
170
+ .classed('pattern-fill', true)
171
+ .attr('width', 0.5)
172
+ .attr('height', 8);
173
+ var rectangles = svg
174
+ .selectAll()
175
+ .data(matrixArray)
176
+ .enter()
177
+ .append('g')
178
+ .attr('class', function (d) { return "heat-" + d.index; })
179
+ .classed('cell', true)
180
+ .attr('transform', function (d) {
181
+ return "translate(" + mainXScale(d[domainIdentifier]) + ", " + mainYScale(d[rangeIdentifier]) + ")";
182
+ })
183
+ .append('rect')
184
+ .attr('class', function (d) {
185
+ return _this.model.getColorClassName({
186
+ value: d.value,
187
+ originalClassName: "heat-" + d.index,
188
+ });
189
+ })
190
+ .classed('heat', true)
191
+ .classed('null-state', function (d) {
192
+ return d.index === -1 || d.value === null ? true : false;
193
+ })
194
+ .attr('width', this.xBandwidth)
195
+ .attr('height', this.yBandwidth)
196
+ .style('fill', function (d) {
197
+ // Check if a valid value exists
198
+ if (d.index === -1 || d.value === null) {
199
+ return "url(#" + patternID + ")";
200
+ }
201
+ return _this.model.getFillColor(Number(d.value));
202
+ })
203
+ .attr('aria-label', function (d) { return d.value; });
204
+ // Cell highlight box
205
+ this.createOuterBox('g.cell-highlight', this.xBandwidth, this.yBandwidth);
206
+ // Column highlight box
207
+ this.createOuterBox('g.multi-cell.column-highlight', this.xBandwidth, Math.abs(yRange[1] - yRange[0]));
208
+ // Row highlight box
209
+ this.createOuterBox('g.multi-cell.row-highlight', Math.abs(xRange[1] - xRange[0]), this.yBandwidth);
210
+ if (this.determineDividerStatus()) {
211
+ rectangles.style('stroke-width', '1px');
212
+ this.parent.select('g.cell-highlight').classed('cell-2', true);
213
+ }
214
+ this.addEventListener();
215
+ };
216
+ /**
217
+ * Generates a box using lines to create a hover effect
218
+ * The lines have drop shadow in their respective direction
219
+ * @param parentTag - tag name
220
+ * @param xBandwidth - X length
221
+ * @param yBandwidth - y length
222
+ */
223
+ Heatmap.prototype.createOuterBox = function (parentTag, xBandwidth, yBandwidth) {
224
+ // Create a highlighter in the parent component so the shadow and the lines do not get clipped
225
+ var highlight = DOMUtils.appendOrSelect(this.parent, parentTag)
226
+ .classed('shadows', true)
227
+ .classed('highlighter-hidden', true);
228
+ DOMUtils.appendOrSelect(highlight, 'line.top')
229
+ .attr('x1', -1)
230
+ .attr('x2', xBandwidth + 1);
231
+ DOMUtils.appendOrSelect(highlight, 'line.left')
232
+ .attr('x1', 0)
233
+ .attr('y1', -1)
234
+ .attr('x2', 0)
235
+ .attr('y2', yBandwidth + 1);
236
+ DOMUtils.appendOrSelect(highlight, 'line.down')
237
+ .attr('x1', -1)
238
+ .attr('x2', xBandwidth + 1)
239
+ .attr('y1', yBandwidth)
240
+ .attr('y2', yBandwidth);
241
+ DOMUtils.appendOrSelect(highlight, 'line.right')
242
+ .attr('x1', xBandwidth)
243
+ .attr('x2', xBandwidth)
244
+ .attr('y1', -1)
245
+ .attr('y2', yBandwidth + 1);
246
+ };
247
+ Heatmap.prototype.determineDividerStatus = function () {
248
+ // Add dividers if status is not off, will assume auto or on by default.
249
+ var dividerStatus = Tools.getProperty(this.getOptions(), 'heatmap', 'divider', 'state');
250
+ // Determine if cell divider should be displayed
251
+ if (dividerStatus !== DividerStatus.OFF) {
252
+ if ((dividerStatus === DividerStatus.AUTO &&
253
+ Configuration.heatmap.minCellDividerDimension <=
254
+ this.xBandwidth &&
255
+ Configuration.heatmap.minCellDividerDimension <=
256
+ this.yBandwidth) ||
257
+ dividerStatus === DividerStatus.ON) {
258
+ return true;
259
+ }
260
+ }
261
+ return false;
262
+ };
263
+ Heatmap.prototype.addEventListener = function () {
264
+ var self = this;
265
+ var cartesianScales = this.services.cartesianScales;
266
+ var options = this.getOptions();
267
+ var totalLabel = get(options, 'tooltip.totalLabel');
268
+ var domainIdentifier = cartesianScales.getDomainIdentifier();
269
+ var rangeIdentifier = cartesianScales.getRangeIdentifier();
270
+ var domainLabel = cartesianScales.getDomainLabel();
271
+ var rangeLabel = cartesianScales.getRangeLabel();
272
+ this.parent
273
+ .selectAll('g.cell')
274
+ .on('mouseover', function (event, datum) {
275
+ var cell = select(this);
276
+ var hoveredElement = cell.select('rect.heat');
277
+ var nullState = hoveredElement.classed('null-state');
278
+ // Dispatch event and tooltip only if value exists
279
+ if (!nullState) {
280
+ // Get transformation value of node
281
+ var transform = Tools.getTranformOffsets(cell.attr('transform'));
282
+ select('g.cell-highlight')
283
+ .attr('transform', "translate(" + (transform.x + self.translationUnits.x) + ", " + (transform.y + self.translationUnits.y) + ")")
284
+ .classed('highlighter-hidden', false);
285
+ // Dispatch mouse over event
286
+ self.services.events.dispatchEvent(Events.Heatmap.HEATMAP_MOUSEOVER, {
287
+ event: event,
288
+ element: hoveredElement,
289
+ datum: datum,
290
+ });
291
+ // Dispatch tooltip show event
292
+ self.services.events.dispatchEvent(Events.Tooltip.SHOW, {
293
+ event: event,
294
+ items: [
295
+ {
296
+ label: domainLabel,
297
+ value: datum[domainIdentifier],
298
+ },
299
+ {
300
+ label: rangeLabel,
301
+ value: datum[rangeIdentifier],
302
+ },
303
+ {
304
+ label: totalLabel || 'Total',
305
+ value: datum['value'],
306
+ color: hoveredElement.style('fill'),
307
+ },
308
+ ],
309
+ });
310
+ }
311
+ })
312
+ .on('mousemove', function (event, datum) {
313
+ // Dispatch mouse move event
314
+ self.services.events.dispatchEvent(Events.Heatmap.HEATMAP_MOUSEMOVE, {
315
+ event: event,
316
+ element: select(this),
317
+ datum: datum,
318
+ });
319
+ // Dispatch tooltip move event
320
+ self.services.events.dispatchEvent(Events.Tooltip.MOVE, {
321
+ event: event,
322
+ });
323
+ })
324
+ .on('click', function (event, datum) {
325
+ // Dispatch mouse click event
326
+ self.services.events.dispatchEvent(Events.Heatmap.HEATMAP_CLICK, {
327
+ event: event,
328
+ element: select(this),
329
+ datum: datum,
330
+ });
331
+ })
332
+ .on('mouseout', function (event, datum) {
333
+ var cell = select(this);
334
+ var hoveredElement = cell.select('rect.heat');
335
+ var nullState = hoveredElement.classed('null-state');
336
+ select('g.cell-highlight').classed('highlighter-hidden', true);
337
+ // Dispatch event and tooltip only if value exists
338
+ if (!nullState) {
339
+ // Dispatch mouse out event
340
+ self.services.events.dispatchEvent(Events.Heatmap.HEATMAP_MOUSEOUT, {
341
+ event: event,
342
+ element: hoveredElement,
343
+ datum: datum,
344
+ });
345
+ // Dispatch hide tooltip event
346
+ self.services.events.dispatchEvent(Events.Tooltip.HIDE, {
347
+ event: event,
348
+ hoveredElement: hoveredElement,
349
+ });
350
+ }
351
+ });
352
+ };
353
+ // Remove event listeners
354
+ Heatmap.prototype.destroy = function () {
355
+ this.parent
356
+ .selectAll('rect.heat')
357
+ .on('mouseover', null)
358
+ .on('mousemove', null)
359
+ .on('click', null)
360
+ .on('mouseout', null);
361
+ // Remove legend listeners
362
+ var eventsFragment = this.services.events;
363
+ eventsFragment.removeEventListener(Events.Legend.ITEM_HOVER, this.handleAxisOnHover);
364
+ eventsFragment.removeEventListener(Events.Legend.ITEM_MOUSEOUT, this.handleAxisMouseOut);
365
+ };
366
+ return Heatmap;
367
+ }(Component));
368
+ export { Heatmap };
369
+ //# sourceMappingURL=../../../src/components/graphs/heatmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heatmap.js","sourceRoot":"","sources":["heatmap.ts"],"names":[],"mappings":"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","sourcesContent":["// Internal Imports\nimport { Component } from '../component';\nimport * as Configuration from '../../configuration';\nimport { Events, RenderTypes, DividerStatus } from '../../interfaces';\nimport { Tools } from '../../tools';\nimport { DOMUtils } from '../../services';\n\nimport { get } from 'lodash-es';\n\n// D3 Imports\nimport { min } from 'd3-array';\nimport { select } from 'd3-selection';\n\nexport class Heatmap extends Component {\n\ttype = 'heatmap';\n\trenderType = RenderTypes.SVG;\n\n\tprivate matrix = {};\n\tprivate xBandwidth = 0;\n\tprivate yBandwidth = 0;\n\tprivate translationUnits = {\n\t\tx: 0,\n\t\ty: 0,\n\t};\n\n\tinit() {\n\t\tconst eventsFragment = this.services.events;\n\n\t\t// Highlight correct cells on Axis item hovers\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Axis.LABEL_MOUSEOVER,\n\t\t\tthis.handleAxisOnHover\n\t\t);\n\n\t\t// Highlight correct cells on Axis item mouseouts\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Axis.LABEL_MOUSEOUT,\n\t\t\tthis.handleAxisMouseOut\n\t\t);\n\n\t\t// Highlight correct cells on Axis item focus\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Axis.LABEL_FOCUS,\n\t\t\tthis.handleAxisOnHover\n\t\t);\n\n\t\t// Highlight correct cells on Axis item blur\n\t\teventsFragment.addEventListener(\n\t\t\tEvents.Axis.LABEL_BLUR,\n\t\t\tthis.handleAxisMouseOut\n\t\t);\n\t}\n\n\trender(animate = true) {\n\t\tconst svg = this.getComponentContainer({ withinChartClip: true });\n\t\t// Lower the chart so the axes are always visible\n\t\tsvg.lower();\n\n\t\tconst { cartesianScales } = this.services;\n\t\tthis.matrix = this.model.getMatrix();\n\n\t\tsvg.html('');\n\n\t\tif (Tools.getProperty(this.getOptions(), 'data', 'loading')) {\n\t\t\treturn;\n\t\t}\n\n\t\t// determine x and y axis scale\n\t\tconst mainXScale = cartesianScales.getMainXScale();\n\t\tconst mainYScale = cartesianScales.getMainYScale();\n\t\tconst domainIdentifier = cartesianScales.getDomainIdentifier();\n\t\tconst rangeIdentifier = cartesianScales.getRangeIdentifier();\n\n\t\t// Get unique axis values & create a matrix\n\t\tconst uniqueDomain = this.model.getUniqueDomain();\n\t\tconst uniqueRange = this.model.getUniqueRanges();\n\n\t\t// Get matrix in the form of an array to create a single heatmap group\n\t\tconst matrixArray = this.model.getMatrixAsArray();\n\n\t\t// Get available chart area\n\t\tconst xRange = mainXScale.range();\n\t\tconst yRange = mainYScale.range();\n\n\t\t// Determine rectangle dimensions based on the number of unique domain and range\n\t\tthis.xBandwidth = Math.abs(\n\t\t\t(xRange[1] - xRange[0]) / uniqueDomain.length\n\t\t);\n\t\tthis.yBandwidth = Math.abs(\n\t\t\t(yRange[1] - yRange[0]) / uniqueRange.length\n\t\t);\n\n\t\tconst patternID = this.services.domUtils.generateElementIDString(\n\t\t\t`heatmap-pattern-stripes`\n\t\t);\n\n\t\t// Create a striped pattern for missing data\n\t\tsvg.append('defs')\n\t\t\t.append('pattern')\n\t\t\t.attr('id', patternID)\n\t\t\t.attr('width', 3)\n\t\t\t.attr('height', 3)\n\t\t\t.attr('patternUnits', 'userSpaceOnUse')\n\t\t\t.attr('patternTransform', 'rotate(45)')\n\t\t\t.append('rect')\n\t\t\t.classed('pattern-fill', true)\n\t\t\t.attr('width', 0.5)\n\t\t\t.attr('height', 8);\n\n\t\tconst rectangles = svg\n\t\t\t.selectAll()\n\t\t\t.data(matrixArray)\n\t\t\t.enter()\n\t\t\t.append('g')\n\t\t\t.attr('class', (d) => `heat-${d.index}`)\n\t\t\t.classed('cell', true)\n\t\t\t.attr(\n\t\t\t\t'transform',\n\t\t\t\t(d) =>\n\t\t\t\t\t`translate(${mainXScale(d[domainIdentifier])}, ${mainYScale(\n\t\t\t\t\t\td[rangeIdentifier]\n\t\t\t\t\t)})`\n\t\t\t)\n\t\t\t.append('rect')\n\t\t\t.attr('class', (d) => {\n\t\t\t\treturn this.model.getColorClassName({\n\t\t\t\t\tvalue: d.value,\n\t\t\t\t\toriginalClassName: `heat-${d.index}`,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.classed('heat', true)\n\t\t\t.classed('null-state', (d) =>\n\t\t\t\td.index === -1 || d.value === null ? true : false\n\t\t\t)\n\t\t\t.attr('width', this.xBandwidth)\n\t\t\t.attr('height', this.yBandwidth)\n\t\t\t.style('fill', (d) => {\n\t\t\t\t// Check if a valid value exists\n\t\t\t\tif (d.index === -1 || d.value === null) {\n\t\t\t\t\treturn `url(#${patternID})`;\n\t\t\t\t}\n\t\t\t\treturn this.model.getFillColor(Number(d.value));\n\t\t\t})\n\t\t\t.attr('aria-label', (d) => d.value);\n\n\t\t// Cell highlight box\n\t\tthis.createOuterBox(\n\t\t\t'g.cell-highlight',\n\t\t\tthis.xBandwidth,\n\t\t\tthis.yBandwidth\n\t\t);\n\t\t// Column highlight box\n\t\tthis.createOuterBox(\n\t\t\t'g.multi-cell.column-highlight',\n\t\t\tthis.xBandwidth,\n\t\t\tMath.abs(yRange[1] - yRange[0])\n\t\t);\n\t\t// Row highlight box\n\t\tthis.createOuterBox(\n\t\t\t'g.multi-cell.row-highlight',\n\t\t\tMath.abs(xRange[1] - xRange[0]),\n\t\t\tthis.yBandwidth\n\t\t);\n\n\t\tif (this.determineDividerStatus()) {\n\t\t\trectangles.style('stroke-width', '1px');\n\t\t\tthis.parent.select('g.cell-highlight').classed('cell-2', true);\n\t\t}\n\n\t\tthis.addEventListener();\n\t}\n\n\t/**\n\t * Generates a box using lines to create a hover effect\n\t * The lines have drop shadow in their respective direction\n\t * @param parentTag - tag name\n\t * @param xBandwidth - X length\n\t * @param yBandwidth - y length\n\t */\n\tprivate createOuterBox(parentTag, xBandwidth, yBandwidth) {\n\t\t// Create a highlighter in the parent component so the shadow and the lines do not get clipped\n\t\tconst highlight = DOMUtils.appendOrSelect(this.parent, parentTag)\n\t\t\t.classed('shadows', true)\n\t\t\t.classed('highlighter-hidden', true);\n\n\t\tDOMUtils.appendOrSelect(highlight, 'line.top')\n\t\t\t.attr('x1', -1)\n\t\t\t.attr('x2', xBandwidth + 1);\n\n\t\tDOMUtils.appendOrSelect(highlight, 'line.left')\n\t\t\t.attr('x1', 0)\n\t\t\t.attr('y1', -1)\n\t\t\t.attr('x2', 0)\n\t\t\t.attr('y2', yBandwidth + 1);\n\n\t\tDOMUtils.appendOrSelect(highlight, 'line.down')\n\t\t\t.attr('x1', -1)\n\t\t\t.attr('x2', xBandwidth + 1)\n\t\t\t.attr('y1', yBandwidth)\n\t\t\t.attr('y2', yBandwidth);\n\n\t\tDOMUtils.appendOrSelect(highlight, 'line.right')\n\t\t\t.attr('x1', xBandwidth)\n\t\t\t.attr('x2', xBandwidth)\n\t\t\t.attr('y1', -1)\n\t\t\t.attr('y2', yBandwidth + 1);\n\t}\n\n\tprivate determineDividerStatus(): boolean {\n\t\t// Add dividers if status is not off, will assume auto or on by default.\n\t\tconst dividerStatus = Tools.getProperty(\n\t\t\tthis.getOptions(),\n\t\t\t'heatmap',\n\t\t\t'divider',\n\t\t\t'state'\n\t\t);\n\n\t\t// Determine if cell divider should be displayed\n\t\tif (dividerStatus !== DividerStatus.OFF) {\n\t\t\tif (\n\t\t\t\t(dividerStatus === DividerStatus.AUTO &&\n\t\t\t\t\tConfiguration.heatmap.minCellDividerDimension <=\n\t\t\t\t\t\tthis.xBandwidth &&\n\t\t\t\t\tConfiguration.heatmap.minCellDividerDimension <=\n\t\t\t\t\t\tthis.yBandwidth) ||\n\t\t\t\tdividerStatus === DividerStatus.ON\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\taddEventListener() {\n\t\tconst self = this;\n\t\tconst { cartesianScales } = this.services;\n\t\tconst options = this.getOptions();\n\t\tconst totalLabel = get(options, 'tooltip.totalLabel');\n\n\t\tconst domainIdentifier = cartesianScales.getDomainIdentifier();\n\t\tconst rangeIdentifier = cartesianScales.getRangeIdentifier();\n\n\t\tconst domainLabel = cartesianScales.getDomainLabel();\n\t\tconst rangeLabel = cartesianScales.getRangeLabel();\n\n\t\tthis.parent\n\t\t\t.selectAll('g.cell')\n\t\t\t.on('mouseover', function (event, datum) {\n\t\t\t\tconst cell = select(this);\n\t\t\t\tconst hoveredElement = cell.select('rect.heat');\n\t\t\t\tconst nullState = hoveredElement.classed('null-state');\n\n\t\t\t\t// Dispatch event and tooltip only if value exists\n\t\t\t\tif (!nullState) {\n\t\t\t\t\t// Get transformation value of node\n\t\t\t\t\tconst transform = Tools.getTranformOffsets(\n\t\t\t\t\t\tcell.attr('transform')\n\t\t\t\t\t);\n\n\t\t\t\t\tselect('g.cell-highlight')\n\t\t\t\t\t\t.attr(\n\t\t\t\t\t\t\t'transform',\n\t\t\t\t\t\t\t`translate(${\n\t\t\t\t\t\t\t\ttransform.x + self.translationUnits.x\n\t\t\t\t\t\t\t}, ${transform.y + self.translationUnits.y})`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.classed('highlighter-hidden', false);\n\n\t\t\t\t\t// Dispatch mouse over event\n\t\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\t\tEvents.Heatmap.HEATMAP_MOUSEOVER,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\t\tdatum: datum,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t// Dispatch tooltip show event\n\t\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: domainLabel,\n\t\t\t\t\t\t\t\tvalue: datum[domainIdentifier],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: rangeLabel,\n\t\t\t\t\t\t\t\tvalue: datum[rangeIdentifier],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: totalLabel || 'Total',\n\t\t\t\t\t\t\t\tvalue: datum['value'],\n\t\t\t\t\t\t\t\tcolor: hoveredElement.style('fill'),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('mousemove', function (event, datum) {\n\t\t\t\t// Dispatch mouse move event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Heatmap.HEATMAP_MOUSEMOVE,\n\t\t\t\t\t{\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\telement: select(this),\n\t\t\t\t\t\tdatum: datum,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t// Dispatch tooltip move event\n\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.MOVE, {\n\t\t\t\t\tevent,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('click', function (event, datum) {\n\t\t\t\t// Dispatch mouse click event\n\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\tEvents.Heatmap.HEATMAP_CLICK,\n\t\t\t\t\t{\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\telement: select(this),\n\t\t\t\t\t\tdatum: datum,\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t})\n\t\t\t.on('mouseout', function (event, datum) {\n\t\t\t\tconst cell = select(this);\n\t\t\t\tconst hoveredElement = cell.select('rect.heat');\n\t\t\t\tconst nullState = hoveredElement.classed('null-state');\n\n\t\t\t\tselect('g.cell-highlight').classed('highlighter-hidden', true);\n\n\t\t\t\t// Dispatch event and tooltip only if value exists\n\t\t\t\tif (!nullState) {\n\t\t\t\t\t// Dispatch mouse out event\n\t\t\t\t\tself.services.events.dispatchEvent(\n\t\t\t\t\t\tEvents.Heatmap.HEATMAP_MOUSEOUT,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\telement: hoveredElement,\n\t\t\t\t\t\t\tdatum: datum,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t// Dispatch hide tooltip event\n\t\t\t\t\tself.services.events.dispatchEvent(Events.Tooltip.HIDE, {\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\thoveredElement,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t// Highlight elements that match the hovered axis item\n\thandleAxisOnHover = (event: CustomEvent) => {\n\t\tconst { detail } = event;\n\t\tconst { datum } = detail;\n\t\t// Unique ranges and domains\n\t\tconst ranges = this.model.getUniqueRanges();\n\t\tconst domains = this.model.getUniqueDomain();\n\t\t// Labels\n\t\tconst domainLabel = this.services.cartesianScales.getDomainLabel();\n\t\tconst rangeLabel = this.services.cartesianScales.getRangeLabel();\n\t\t// Scales\n\t\tconst mainXScale = this.services.cartesianScales.getMainXScale();\n\t\tconst mainYScale = this.services.cartesianScales.getMainYScale();\n\n\t\tlet label = '',\n\t\t\tsum = 0,\n\t\t\tminimum = 0,\n\t\t\tmaximum = 0;\n\n\t\t// Check to see where datum belongs\n\t\tif (this.matrix[datum] !== undefined) {\n\t\t\tlabel = domainLabel;\n\t\t\t// Iterate through Object and get sum, min, and max\n\t\t\tranges.forEach((element) => {\n\t\t\t\tlet value = this.matrix[datum][element].value || 0;\n\t\t\t\tsum += value;\n\t\t\t\tminimum = value < minimum ? value : minimum;\n\t\t\t\tmaximum = value > maximum ? value : maximum;\n\t\t\t});\n\t\t} else {\n\t\t\tlabel = rangeLabel;\n\t\t\tdomains.forEach((element) => {\n\t\t\t\tlet value = this.matrix[element][datum].value || 0;\n\t\t\t\tsum += value;\n\t\t\t\tminimum = value < minimum ? value : minimum;\n\t\t\t\tmaximum = value > maximum ? value : maximum;\n\t\t\t});\n\t\t}\n\n\t\tif (mainXScale(datum) !== undefined) {\n\t\t\tthis.parent\n\t\t\t\t.select('g.multi-cell.column-highlight')\n\t\t\t\t.classed('highlighter-hidden', false)\n\t\t\t\t.attr(\n\t\t\t\t\t'transform',\n\t\t\t\t\t`translate(${mainXScale(datum)}, ${min(\n\t\t\t\t\t\tmainYScale.range()\n\t\t\t\t\t)})`\n\t\t\t\t);\n\t\t} else if (mainYScale(datum) !== undefined) {\n\t\t\tthis.parent\n\t\t\t\t.select('g.multi-cell.row-highlight')\n\t\t\t\t.classed('highlighter-hidden', false)\n\t\t\t\t.attr(\n\t\t\t\t\t'transform',\n\t\t\t\t\t`translate(${min(mainXScale.range())},${mainYScale(datum)})`\n\t\t\t\t);\n\t\t}\n\n\t\t// Dispatch tooltip show event\n\t\tthis.services.events.dispatchEvent(Events.Tooltip.SHOW, {\n\t\t\tevent: detail.event,\n\t\t\thoveredElement: select(event.detail.element),\n\t\t\titems: [\n\t\t\t\t{\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tvalue: datum,\n\t\t\t\t\tbold: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Min',\n\t\t\t\t\tvalue: minimum,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Max',\n\t\t\t\t\tvalue: maximum,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Average',\n\t\t\t\t\tvalue: sum / domains.length,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t};\n\n\t// Un-highlight all elements\n\thandleAxisMouseOut = (event: CustomEvent) => {\n\t\t// Hide column/row\n\t\tthis.parent\n\t\t\t.selectAll('g.multi-cell')\n\t\t\t.classed('highlighter-hidden', true);\n\n\t\t// Dispatch hide tooltip event\n\t\tthis.services.events.dispatchEvent(Events.Tooltip.HIDE, {\n\t\t\tevent,\n\t\t});\n\t};\n\n\t// Remove event listeners\n\tdestroy() {\n\t\tthis.parent\n\t\t\t.selectAll('rect.heat')\n\t\t\t.on('mouseover', null)\n\t\t\t.on('mousemove', null)\n\t\t\t.on('click', null)\n\t\t\t.on('mouseout', null);\n\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.handleAxisOnHover\n\t\t);\n\t\teventsFragment.removeEventListener(\n\t\t\tEvents.Legend.ITEM_MOUSEOUT,\n\t\t\tthis.handleAxisMouseOut\n\t\t);\n\t}\n}\n"]}