@vizzly/dashboard 0.15.0-dev-307a9830cb4e82f036693ccfe2634f74381a2b72 → 0.15.0-dev-d949562f7d69a747b6f32349c6a53a2dc3ed06f9

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.
@@ -1,3 +1,3 @@
1
1
  /// <reference types="react" />
2
2
  import { PolygonProps } from './types';
3
- export declare const Polygons: ({ chart, radius, visibleYKeys }: PolygonProps) => JSX.Element;
3
+ export declare const Polygons: ({ chart, radius, visibleYKeys, tooltipData, hoveredDataPointIndex }: PolygonProps) => JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { FunctionComponent } from 'react';
2
+ import { DataItem, ShapeDefinition } from '../../../../../shared-logic/src/ChartsV2/types';
3
+ import { LinesItemStyleLine } from '../../../../../shared-logic/src/RadarChart/types';
4
+ export declare const RadarCrosshairCircle: FunctionComponent<{
5
+ tooltipData: {
6
+ [keyId: string]: DataItem;
7
+ };
8
+ yKeys: string[];
9
+ legendItems: ShapeDefinition<LinesItemStyleLine>[];
10
+ conditionalFormattingRules?: any;
11
+ visibleYKeys: string[];
12
+ radius: number;
13
+ yScale: {
14
+ max: number | null;
15
+ min: number | null;
16
+ };
17
+ dataPointIndex: number;
18
+ totalDataPoints: number;
19
+ }>;
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare const LINE_STYLES: React.CSSProperties;
@@ -17,6 +17,10 @@ export declare type PolygonProps = {
17
17
  chart: RadarChartRepresentation;
18
18
  radius: number;
19
19
  visibleYKeys: string[];
20
+ tooltipData?: {
21
+ [keyId: string]: import('../../../../../shared-logic/src/RadarChart/types').DataItem;
22
+ } | null;
23
+ hoveredDataPointIndex?: number;
20
24
  };
21
25
  export declare type RadarShapeProps = {
22
26
  chart: RadarChartRepresentation;
@@ -14,7 +14,7 @@ export declare const CrosshairCircle: FunctionComponent<{
14
14
  xKey: string | null;
15
15
  margin: Margin;
16
16
  legendItems: ShapeDefinition<AreaStyles | LineStyles | BubbleStyles>[];
17
- conditionalFormattingRules: any;
17
+ conditionalFormattingRules?: any;
18
18
  visibleYKeys: string[];
19
19
  yScale: (yKey: string) => number;
20
20
  xScale: (value: string | number | Date) => number | undefined;
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ import { DataItem } from '../../../../shared-logic/src/RadarChart/types';
3
+ declare type RadarTooltipData = {
4
+ [keyId: string]: DataItem;
5
+ };
6
+ interface GetRadarTooltipDataArgs {
7
+ data: Array<{
8
+ [keyId: string]: DataItem;
9
+ }>;
10
+ event: React.MouseEvent<SVGElement>;
11
+ totalDataPoints: number;
12
+ centerX: number;
13
+ centerY: number;
14
+ }
15
+ interface RadarTooltipDataReturn {
16
+ tooltipData: RadarTooltipData | null;
17
+ dataPointIndex: number;
18
+ angle: number;
19
+ }
20
+ export declare const getRadarTooltipData: ({ data, event, totalDataPoints, centerX, centerY, }: GetRadarTooltipDataArgs) => RadarTooltipDataReturn | undefined;
21
+ export {};
@@ -44147,11 +44147,12 @@ var AxisLeft = function AxisLeft(_ref) {
44147
44147
  });
44148
44148
  };
44149
44149
 
44150
- var GRID_STYLES = {
44150
+ var LINE_STYLES = {
44151
44151
  strokeWidth: 2,
44152
44152
  strokeOpacity: 0.8,
44153
44153
  strokeLinecap: 'round',
44154
- strokeDasharray: '0.5 5'
44154
+ strokeDasharray: '0.5 5',
44155
+ stroke: 'rgba(0, 0, 0, 0.1)'
44155
44156
  };
44156
44157
 
44157
44158
  var GridRows = function GridRows(_ref) {
@@ -44171,7 +44172,7 @@ var GridRows = function GridRows(_ref) {
44171
44172
  strokeWidth: removeStroke ? 0 : 2,
44172
44173
  lineStyle: _extends({
44173
44174
  stroke: themeCSS.grid.stroke
44174
- }, GRID_STYLES)
44175
+ }, LINE_STYLES)
44175
44176
  });
44176
44177
  };
44177
44178
 
@@ -45966,6 +45967,58 @@ function Bubbles(_ref2) {
45966
45967
  });
45967
45968
  }
45968
45969
 
45970
+ var RadarCrosshairCircle = function RadarCrosshairCircle(_ref) {
45971
+ var tooltipData = _ref.tooltipData,
45972
+ yKeys = _ref.yKeys,
45973
+ legendItems = _ref.legendItems,
45974
+ conditionalFormattingRules = _ref.conditionalFormattingRules,
45975
+ visibleYKeys = _ref.visibleYKeys,
45976
+ radius = _ref.radius,
45977
+ yScale = _ref.yScale,
45978
+ dataPointIndex = _ref.dataPointIndex,
45979
+ totalDataPoints = _ref.totalDataPoints;
45980
+ var radiusScale = scale.scaleLinear({
45981
+ range: [0, radius],
45982
+ domain: [0, yScale.max],
45983
+ nice: true
45984
+ });
45985
+ var step = Math.PI * 2 / totalDataPoints;
45986
+ var yKeysTest = [].concat(yKeys);
45987
+ if (yKeysTest.length > 1) {
45988
+ var lastItem = yKeysTest.pop();
45989
+ yKeysTest.unshift(lastItem);
45990
+ }
45991
+ return jsxRuntime.jsx(React.Fragment, {
45992
+ children: yKeysTest.map(function (yKey) {
45993
+ var _legendItems$filter$;
45994
+ if (!tooltipData[yKey] || tooltipData[yKey].value === null || !visibleYKeys.includes(yKey)) {
45995
+ return null;
45996
+ }
45997
+ var value = tooltipData[yKey].value;
45998
+ var scaledRadius = radiusScale(value);
45999
+ var angle = (dataPointIndex + 1) * step;
46000
+ var x = scaledRadius * Math.sin(angle);
46001
+ var y = scaledRadius * Math.cos(angle);
46002
+ return jsxRuntime.jsx("circle", {
46003
+ cx: x,
46004
+ cy: y,
46005
+ r: 6,
46006
+ fill: getColor({
46007
+ defaultColor: ((_legendItems$filter$ = legendItems.filter(function (legendItem) {
46008
+ return legendItem.yKey === yKey;
46009
+ })[0]) == null ? void 0 : _legendItems$filter$.color) || '#000',
46010
+ yKey: yKey,
46011
+ value: tooltipData[yKey].value,
46012
+ conditionalFormattingRules: conditionalFormattingRules
46013
+ }),
46014
+ strokeWidth: 2,
46015
+ stroke: "#fff",
46016
+ pointerEvents: "none"
46017
+ }, "radar-crosshair-" + yKey);
46018
+ })
46019
+ });
46020
+ };
46021
+
45969
46022
  var getValue = function getValue(d, key) {
45970
46023
  return d[key].value;
45971
46024
  };
@@ -45995,7 +46048,9 @@ var genPolygonPoints = function genPolygonPoints(dataArray, scale, yKey) {
45995
46048
  var Polygons = function Polygons(_ref) {
45996
46049
  var chart = _ref.chart,
45997
46050
  radius = _ref.radius,
45998
- visibleYKeys = _ref.visibleYKeys;
46051
+ visibleYKeys = _ref.visibleYKeys,
46052
+ tooltipData = _ref.tooltipData,
46053
+ hoveredDataPointIndex = _ref.hoveredDataPointIndex;
45999
46054
  var yKeys = chart.y.keys;
46000
46055
  var yScale = scale.scaleLinear({
46001
46056
  range: [0, radius],
@@ -46008,16 +46063,26 @@ var Polygons = function Polygons(_ref) {
46008
46063
  return (_yScale = yScale(d)) != null ? _yScale : 0;
46009
46064
  }, yKey);
46010
46065
  });
46011
- return jsxRuntime.jsx(jsxRuntime.Fragment, {
46012
- children: polygonsPoints.map(function (polygonPoints) {
46066
+ return jsxRuntime.jsxs(jsxRuntime.Fragment, {
46067
+ children: [polygonsPoints.map(function (polygonPoints) {
46013
46068
  return jsxRuntime.jsx(SinglePolygon, {
46014
46069
  isVisible: visibleYKeys.includes(polygonPoints.yKey),
46015
46070
  polygonPoints: polygonPoints,
46016
46071
  colors: chart.lines.filter(function (legendItem) {
46017
46072
  return legendItem.yKey === polygonPoints.yKey;
46018
46073
  })[0].color
46019
- });
46020
- })
46074
+ }, polygonPoints.yKey);
46075
+ }), tooltipData && hoveredDataPointIndex !== undefined && hoveredDataPointIndex >= 0 && jsxRuntime.jsx(RadarCrosshairCircle, {
46076
+ tooltipData: tooltipData,
46077
+ yKeys: chart.y.keys,
46078
+ legendItems: chart.lines,
46079
+ conditionalFormattingRules: [],
46080
+ visibleYKeys: visibleYKeys,
46081
+ radius: radius,
46082
+ yScale: chart.y.scale,
46083
+ dataPointIndex: hoveredDataPointIndex,
46084
+ totalDataPoints: chart.data.length
46085
+ })]
46021
46086
  });
46022
46087
  };
46023
46088
  var SinglePolygon = function SinglePolygon(_ref2) {
@@ -46044,15 +46109,6 @@ var SinglePolygon = function SinglePolygon(_ref2) {
46044
46109
  });
46045
46110
  };
46046
46111
 
46047
- var genPoints = function genPoints(length, radius) {
46048
- var step = Math.PI * 2 / length;
46049
- return [].concat(new Array(length)).map(function (_, i) {
46050
- return {
46051
- x: radius * Math.sin(i * step),
46052
- y: radius * Math.cos(i * step)
46053
- };
46054
- });
46055
- };
46056
46112
  var MiddleLine = function MiddleLine(_ref) {
46057
46113
  var chart = _ref.chart,
46058
46114
  radius = _ref.radius,
@@ -46062,7 +46118,6 @@ var MiddleLine = function MiddleLine(_ref) {
46062
46118
  var _useState = React.useState([]),
46063
46119
  textWidths = _useState[0],
46064
46120
  setTextWidths = _useState[1];
46065
- var points = genPoints(chart.x.ticks.length, radius);
46066
46121
  var zeroPoint = new point.Point({
46067
46122
  x: 0,
46068
46123
  y: 0
@@ -46071,22 +46126,33 @@ var MiddleLine = function MiddleLine(_ref) {
46071
46126
  var _tick$formattedValue;
46072
46127
  return (_tick$formattedValue = tick.formattedValue) != null ? _tick$formattedValue : tick.value;
46073
46128
  });
46129
+ var genPoints = function genPoints(length, radius) {
46130
+ var step = Math.PI * 2 / length;
46131
+ return new Array(length).fill(0).map(function (_, i) {
46132
+ return {
46133
+ x: radius * Math.sin(i * step),
46134
+ y: radius * Math.cos(i * step)
46135
+ };
46136
+ });
46137
+ };
46074
46138
  React.useEffect(function () {
46075
46139
  var newWidths = textRefs.current.map(function (ref) {
46076
46140
  return ref ? ref.getComputedTextLength() : 0;
46077
46141
  });
46078
46142
  setTextWidths(newWidths);
46079
- }, [categoryValues]);
46143
+ }, []);
46144
+ var points = genPoints(chart.x.ticks.length, radius);
46080
46145
  points.push(points.shift());
46081
46146
  return jsxRuntime.jsx(jsxRuntime.Fragment, {
46082
- children: [].concat(new Array(chart.x.ticks.length)).map(function (_, i) {
46147
+ children: new Array(chart.x.ticks.length).fill(0).map(function (_, i) {
46083
46148
  var xOffset = points[i].x >= 0 ? textWidths[i] / 2 : -(textWidths[i] / 2);
46084
- return jsxRuntime.jsxs(jsxRuntime.Fragment, {
46149
+ return jsxRuntime.jsxs(React__default.Fragment, {
46085
46150
  children: [jsxRuntime.jsx(shape.Line, {
46086
46151
  from: zeroPoint,
46087
46152
  to: points[i],
46088
- stroke: themeCSS.axis.stroke,
46089
- strokeDasharray: "0.5 5"
46153
+ style: _extends({
46154
+ stroke: themeCSS.axis.stroke
46155
+ }, LINE_STYLES)
46090
46156
  }, "radar-line-" + i), show && jsxRuntime.jsx("text", {
46091
46157
  ref: function ref(el) {
46092
46158
  return textRefs.current[i] = el;
@@ -46097,13 +46163,13 @@ var MiddleLine = function MiddleLine(_ref) {
46097
46163
  textAnchor: "middle",
46098
46164
  children: categoryValues[i]
46099
46165
  })]
46100
- });
46166
+ }, "middle-line-" + i);
46101
46167
  })
46102
46168
  });
46103
46169
  };
46104
46170
 
46105
46171
  var genAngles = function genAngles(length, degrees) {
46106
- return [].concat(new Array(length + 1)).map(function (_, i) {
46172
+ return new Array(length + 1).fill(0).map(function (_, i) {
46107
46173
  return {
46108
46174
  angle: i * (degrees / length) + (length % 2 === 0 ? 0 : degrees / length / 2)
46109
46175
  };
@@ -46135,9 +46201,9 @@ var Grid$1 = function Grid(_ref) {
46135
46201
  }, [chart.y.ticks]);
46136
46202
  var chartValue = (_chart$y$ticks$scaleV = chart.y.ticks[levels - 1].scaleValue) != null ? _chart$y$ticks$scaleV : chart.y.ticks[levels - 1].value;
46137
46203
  return jsxRuntime.jsx(jsxRuntime.Fragment, {
46138
- children: [].concat(new Array(levels)).map(function (_, i) {
46204
+ children: new Array(levels).fill(0).map(function (_, i) {
46139
46205
  var levelRadius = chart.y.ticks[i].value / chartValue * radius;
46140
- return jsxRuntime.jsxs(jsxRuntime.Fragment, {
46206
+ return jsxRuntime.jsxs(React__default.Fragment, {
46141
46207
  children: [jsxRuntime.jsx(shape.LineRadial, {
46142
46208
  data: webs,
46143
46209
  angle: function angle(d) {
@@ -46148,7 +46214,7 @@ var Grid$1 = function Grid(_ref) {
46148
46214
  fill: "none",
46149
46215
  style: _extends({
46150
46216
  stroke: themeCSS.axis.stroke
46151
- }, GRID_STYLES)
46217
+ }, LINE_STYLES)
46152
46218
  }, "web-" + i), jsxRuntime.jsx("text", {
46153
46219
  x: 0,
46154
46220
  y: levelRadius,
@@ -46158,11 +46224,40 @@ var Grid$1 = function Grid(_ref) {
46158
46224
  textAnchor: "middle",
46159
46225
  children: tickFormat(chart.y.ticks[i].value)
46160
46226
  })]
46161
- });
46227
+ }, "grid-level-" + i);
46162
46228
  })
46163
46229
  });
46164
46230
  };
46165
46231
 
46232
+ var getRadarTooltipData = function getRadarTooltipData(_ref) {
46233
+ var data = _ref.data,
46234
+ event$1 = _ref.event,
46235
+ totalDataPoints = _ref.totalDataPoints,
46236
+ centerX = _ref.centerX,
46237
+ centerY = _ref.centerY;
46238
+ var point = event.localPoint(event$1) || {
46239
+ x: 0,
46240
+ y: 0
46241
+ };
46242
+ if (!point) return;
46243
+ var mouseX = point.x - centerX;
46244
+ var mouseY = point.y - centerY;
46245
+ var mouseAngle = Math.atan2(mouseX, mouseY);
46246
+ if (mouseAngle < 0) {
46247
+ mouseAngle += 2 * Math.PI;
46248
+ }
46249
+ var step = Math.PI * 2 / totalDataPoints;
46250
+ var dataPointIndex = Math.round(mouseAngle / step) % totalDataPoints;
46251
+ dataPointIndex = (dataPointIndex - 1 + totalDataPoints) % totalDataPoints;
46252
+ var tooltipData = data[dataPointIndex] || null;
46253
+ var angle = (dataPointIndex + 1) * step;
46254
+ return {
46255
+ tooltipData: tooltipData,
46256
+ dataPointIndex: dataPointIndex,
46257
+ angle: angle
46258
+ };
46259
+ };
46260
+
46166
46261
  var WIDTH_MULTIPLIER_TO_SCROLL = 1.2;
46167
46262
  var LEGEND_PADDING = 40;
46168
46263
  var RadarChart$2 = function RadarChart(_ref) {
@@ -46171,6 +46266,15 @@ var RadarChart$2 = function RadarChart(_ref) {
46171
46266
  height = _ref.height,
46172
46267
  options = _ref.options,
46173
46268
  theme = _ref.theme;
46269
+ var _useTooltip = useTooltip$1(),
46270
+ tooltipOpen = _useTooltip.tooltipOpen,
46271
+ _useTooltip$tooltipLe = _useTooltip.tooltipLeft,
46272
+ tooltipLeft = _useTooltip$tooltipLe === void 0 ? 0 : _useTooltip$tooltipLe,
46273
+ _useTooltip$tooltipTo = _useTooltip.tooltipTop,
46274
+ tooltipTop = _useTooltip$tooltipTo === void 0 ? 0 : _useTooltip$tooltipTo,
46275
+ tooltipData = _useTooltip.tooltipData,
46276
+ hideTooltip = _useTooltip.hideTooltip,
46277
+ showTooltip = _useTooltip.showTooltip;
46174
46278
  var ref = React.useRef(null);
46175
46279
  var _useState = React.useState(0),
46176
46280
  groupWidth = _useState[0],
@@ -46180,13 +46284,17 @@ var RadarChart$2 = function RadarChart(_ref) {
46180
46284
  })),
46181
46285
  visibleYKeys = _useState2[0],
46182
46286
  setVisibleYKeys = _useState2[1];
46287
+ var _useState3 = React.useState(),
46288
+ hoveredDataPointIndex = _useState3[0],
46289
+ setHoveredDataPointIndex = _useState3[1];
46183
46290
  var themeCSS = React.useMemo(function () {
46184
- return getChartThemeCSS(theme);
46291
+ var css = getChartThemeCSS(theme);
46292
+ return css;
46185
46293
  }, [theme]);
46186
46294
  var margin = buildMargin(chart.y.ticks, options.axis.showYAxisLabels, chart.y.title != null, chart.x.title != null);
46187
46295
  var innerWidth = width - margin.left - margin.right - (options.showLegend ? LEGEND_PADDING : 0);
46188
46296
  var innerHeight = height - margin.top - margin.bottom - (options.showLegend ? LEGEND_PADDING : 0);
46189
- var radius = Math.min(innerWidth, innerHeight) / 2;
46297
+ var radius = Math.min(innerWidth, innerHeight) / 2 * 0.93;
46190
46298
  React.useEffect(function () {
46191
46299
  var _ref$current;
46192
46300
  setVisibleYKeys(chart.lines.map(function (legendItem) {
@@ -46197,16 +46305,41 @@ var RadarChart$2 = function RadarChart(_ref) {
46197
46305
  setVisibleYKeys([]);
46198
46306
  };
46199
46307
  }, [chart.lines]);
46308
+ var centerX = (groupWidth > width ? width * WIDTH_MULTIPLIER_TO_SCROLL : width) / 2;
46309
+ var centerY = height / 2 - margin.top * 2;
46310
+ var handleMouseMove = React.useCallback(function (event) {
46311
+ var radarTooltipData = getRadarTooltipData({
46312
+ data: chart.data,
46313
+ event: event,
46314
+ totalDataPoints: chart.data.length,
46315
+ centerX: centerX,
46316
+ centerY: centerY
46317
+ });
46318
+ if (radarTooltipData) {
46319
+ setHoveredDataPointIndex(radarTooltipData.dataPointIndex);
46320
+ showTooltip({
46321
+ tooltipLeft: event.pageX,
46322
+ tooltipTop: event.pageY,
46323
+ tooltipData: radarTooltipData.tooltipData
46324
+ });
46325
+ }
46326
+ }, [showTooltip, chart.data, centerX, centerY]);
46327
+ var handleMouseLeave = React.useCallback(function () {
46328
+ hideTooltip();
46329
+ setHoveredDataPointIndex(-1);
46330
+ }, [hideTooltip]);
46200
46331
  if (width < 10) return null;
46201
46332
  return jsxRuntime.jsxs(React.Fragment, {
46202
46333
  children: [jsxRuntime.jsx(ChartWrapper$1, {
46203
46334
  width: groupWidth > width ? width * WIDTH_MULTIPLIER_TO_SCROLL : width,
46204
46335
  height: height,
46205
46336
  showLegend: options.showLegend,
46337
+ onMouseMove: handleMouseMove,
46338
+ onMouseLeave: handleMouseLeave,
46206
46339
  children: jsxRuntime.jsxs(group.Group, {
46207
46340
  innerRef: ref,
46208
- top: height / 2 - margin.top * 2,
46209
- left: (groupWidth > width ? width * WIDTH_MULTIPLIER_TO_SCROLL : width) / 2,
46341
+ top: centerY,
46342
+ left: centerX,
46210
46343
  children: [jsxRuntime.jsx(MiddleLine, {
46211
46344
  chart: chart,
46212
46345
  radius: radius,
@@ -46219,7 +46352,9 @@ var RadarChart$2 = function RadarChart(_ref) {
46219
46352
  }), jsxRuntime.jsx(Polygons, {
46220
46353
  chart: chart,
46221
46354
  radius: radius,
46222
- visibleYKeys: visibleYKeys
46355
+ visibleYKeys: visibleYKeys,
46356
+ tooltipData: tooltipData,
46357
+ hoveredDataPointIndex: hoveredDataPointIndex
46223
46358
  })]
46224
46359
  })
46225
46360
  }), options.showLegend && jsxRuntime.jsx(Legend$1, {
@@ -46231,6 +46366,21 @@ var RadarChart$2 = function RadarChart(_ref) {
46231
46366
  setVisibleYKeys: setVisibleYKeys,
46232
46367
  keys: chart.keys,
46233
46368
  marginLeft: margin.left - margin.leftTitleOffset
46369
+ }), tooltipOpen && tooltipData && chart.x.key && jsxRuntime.jsx(Tooltip$1, {
46370
+ items: [{
46371
+ legendItems: chart.lines,
46372
+ visibleYKeys: visibleYKeys,
46373
+ conditionalFormattingRules: []
46374
+ }],
46375
+ tooltipData: tooltipData,
46376
+ tooltipLeft: tooltipLeft,
46377
+ tooltipTop: tooltipTop,
46378
+ xKey: chart.x.key,
46379
+ keys: chart.keys,
46380
+ yKeys: chart.y.keys,
46381
+ showRoundedTotal: options.showRoundedTotal,
46382
+ theme: themeCSS.popoverMenus,
46383
+ shouldShowColorLegend: false
46234
46384
  })]
46235
46385
  });
46236
46386
  };
@@ -52566,7 +52716,7 @@ var getScaleAndTicks$2 = function getScaleAndTicks(_ref) {
52566
52716
  var maxY = y.max || 0;
52567
52717
  var minY = Math.min(y.min || 0, 0);
52568
52718
  var yTickInterval = getNiceInterval$2((maxY - minY) / (tickCountYAxis - 1));
52569
- for (var i = 0; i <= tickCountYAxis; i++) {
52719
+ for (var i = 0; i <= Math.ceil(maxY / yTickInterval); i++) {
52570
52720
  var _value = yTickInterval * i;
52571
52721
  var formattedValue = formattingFunctionY(_value, nullValue);
52572
52722
  yTicks.push({