@gravity-ui/chartkit 3.1.3 → 3.2.0

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 (92) hide show
  1. package/build/plugins/d3/__stories__/LinearCategories.stories.d.ts +4 -0
  2. package/build/plugins/d3/__stories__/LinearCategories.stories.js +101 -0
  3. package/build/plugins/d3/__stories__/Timestamp.stories.d.ts +4 -0
  4. package/build/plugins/d3/__stories__/Timestamp.stories.js +89 -0
  5. package/build/plugins/d3/__stories__/penguins.json +3098 -0
  6. package/build/plugins/d3/index.d.ts +7 -0
  7. package/build/plugins/d3/index.js +10 -0
  8. package/build/plugins/d3/renderer/D3Widget.d.ts +15 -0
  9. package/build/plugins/d3/renderer/D3Widget.js +40 -0
  10. package/build/plugins/d3/renderer/components/AxisX.d.ts +10 -0
  11. package/build/plugins/d3/renderer/components/AxisX.js +68 -0
  12. package/build/plugins/d3/renderer/components/AxisY.d.ts +10 -0
  13. package/build/plugins/d3/renderer/components/AxisY.js +73 -0
  14. package/build/plugins/d3/renderer/components/Chart.d.ts +10 -0
  15. package/build/plugins/d3/renderer/components/Chart.js +64 -0
  16. package/build/plugins/d3/renderer/components/Legend.d.ts +12 -0
  17. package/build/plugins/d3/renderer/components/Legend.js +66 -0
  18. package/build/plugins/d3/renderer/components/Title.d.ts +7 -0
  19. package/build/plugins/d3/renderer/components/Title.js +8 -0
  20. package/build/plugins/d3/renderer/components/Tooltip/DefaultContent.d.ts +10 -0
  21. package/build/plugins/d3/renderer/components/Tooltip/DefaultContent.js +21 -0
  22. package/build/plugins/d3/renderer/components/Tooltip/index.d.ts +12 -0
  23. package/build/plugins/d3/renderer/components/Tooltip/index.js +53 -0
  24. package/build/plugins/d3/renderer/components/index.d.ts +1 -0
  25. package/build/plugins/d3/renderer/components/index.js +1 -0
  26. package/build/plugins/d3/renderer/components/styles.css +61 -0
  27. package/build/plugins/d3/renderer/constants.d.ts +1 -0
  28. package/build/plugins/d3/renderer/constants.js +22 -0
  29. package/build/plugins/d3/renderer/hooks/index.d.ts +10 -0
  30. package/build/plugins/d3/renderer/hooks/index.js +10 -0
  31. package/build/plugins/d3/renderer/hooks/useChartDimensions/index.d.ts +17 -0
  32. package/build/plugins/d3/renderer/hooks/useChartDimensions/index.js +13 -0
  33. package/build/plugins/d3/renderer/hooks/useChartEvents/index.d.ts +5 -0
  34. package/build/plugins/d3/renderer/hooks/useChartEvents/index.js +15 -0
  35. package/build/plugins/d3/renderer/hooks/useChartOptions/chart.d.ts +8 -0
  36. package/build/plugins/d3/renderer/hooks/useChartOptions/chart.js +60 -0
  37. package/build/plugins/d3/renderer/hooks/useChartOptions/constants.d.ts +3 -0
  38. package/build/plugins/d3/renderer/hooks/useChartOptions/constants.js +3 -0
  39. package/build/plugins/d3/renderer/hooks/useChartOptions/index.d.ts +3 -0
  40. package/build/plugins/d3/renderer/hooks/useChartOptions/index.js +32 -0
  41. package/build/plugins/d3/renderer/hooks/useChartOptions/legend.d.ts +6 -0
  42. package/build/plugins/d3/renderer/hooks/useChartOptions/legend.js +5 -0
  43. package/build/plugins/d3/renderer/hooks/useChartOptions/title.d.ts +5 -0
  44. package/build/plugins/d3/renderer/hooks/useChartOptions/title.js +17 -0
  45. package/build/plugins/d3/renderer/hooks/useChartOptions/tooltip.d.ts +5 -0
  46. package/build/plugins/d3/renderer/hooks/useChartOptions/tooltip.js +5 -0
  47. package/build/plugins/d3/renderer/hooks/useChartOptions/types.d.ts +32 -0
  48. package/build/plugins/d3/renderer/hooks/useChartOptions/types.js +1 -0
  49. package/build/plugins/d3/renderer/hooks/useChartOptions/utils.d.ts +5 -0
  50. package/build/plugins/d3/renderer/hooks/useChartOptions/utils.js +18 -0
  51. package/build/plugins/d3/renderer/hooks/useChartOptions/x-axis.d.ts +5 -0
  52. package/build/plugins/d3/renderer/hooks/useChartOptions/x-axis.js +29 -0
  53. package/build/plugins/d3/renderer/hooks/useChartOptions/y-axis.d.ts +5 -0
  54. package/build/plugins/d3/renderer/hooks/useChartOptions/y-axis.js +34 -0
  55. package/build/plugins/d3/renderer/hooks/useLegend/index.d.ts +13 -0
  56. package/build/plugins/d3/renderer/hooks/useLegend/index.js +28 -0
  57. package/build/plugins/d3/renderer/hooks/useScales/index.d.ts +17 -0
  58. package/build/plugins/d3/renderer/hooks/useScales/index.js +101 -0
  59. package/build/plugins/d3/renderer/hooks/useSeries/index.d.ts +14 -0
  60. package/build/plugins/d3/renderer/hooks/useSeries/index.js +23 -0
  61. package/build/plugins/d3/renderer/hooks/useShapes/index.d.ts +19 -0
  62. package/build/plugins/d3/renderer/hooks/useShapes/index.js +73 -0
  63. package/build/plugins/d3/renderer/hooks/useTooltip/index.d.ts +13 -0
  64. package/build/plugins/d3/renderer/hooks/useTooltip/index.js +19 -0
  65. package/build/plugins/d3/renderer/hooks/useTooltip/types.d.ts +7 -0
  66. package/build/plugins/d3/renderer/hooks/useTooltip/types.js +1 -0
  67. package/build/plugins/d3/renderer/utils/index.d.ts +18 -0
  68. package/build/plugins/d3/renderer/utils/index.js +71 -0
  69. package/build/plugins/d3/types.d.ts +4 -0
  70. package/build/plugins/d3/types.js +1 -0
  71. package/build/types/widget-data/axis.d.ts +22 -0
  72. package/build/types/widget-data/axis.js +1 -0
  73. package/build/types/widget-data/base.d.ts +15 -0
  74. package/build/types/widget-data/base.js +1 -0
  75. package/build/types/widget-data/chart.d.ts +9 -0
  76. package/build/types/widget-data/chart.js +1 -0
  77. package/build/types/widget-data/index.d.ts +24 -0
  78. package/build/types/widget-data/index.js +9 -0
  79. package/build/types/widget-data/legend.d.ts +3 -0
  80. package/build/types/widget-data/legend.js +1 -0
  81. package/build/types/widget-data/pie.d.ts +10 -0
  82. package/build/types/widget-data/pie.js +1 -0
  83. package/build/types/widget-data/scatter.d.ts +20 -0
  84. package/build/types/widget-data/scatter.js +1 -0
  85. package/build/types/widget-data/series.d.ts +4 -0
  86. package/build/types/widget-data/series.js +1 -0
  87. package/build/types/widget-data/title.d.ts +5 -0
  88. package/build/types/widget-data/title.js +1 -0
  89. package/build/types/widget-data/tooltip.d.ts +12 -0
  90. package/build/types/widget-data/tooltip.js +1 -0
  91. package/build/types/widget.d.ts +5 -0
  92. package/package.json +4 -2
@@ -0,0 +1,13 @@
1
+ import type { TooltipHoveredData } from '../../../../../types/widget-data';
2
+ import { PreparedTooltip } from '../useChartOptions/types';
3
+ import type { PointerPosition, OnSeriesMouseMove, OnSeriesMouseLeave } from './types';
4
+ type Args = {
5
+ tooltip: PreparedTooltip;
6
+ };
7
+ export declare const useTooltip: ({ tooltip }: Args) => {
8
+ hovered: TooltipHoveredData<any> | undefined;
9
+ pointerPosition: PointerPosition | undefined;
10
+ handleSeriesMouseMove: OnSeriesMouseMove | undefined;
11
+ handleSeriesMouseLeave: OnSeriesMouseLeave | undefined;
12
+ };
13
+ export {};
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ export const useTooltip = ({ tooltip }) => {
3
+ const [hovered, setTooltipHoveredData] = React.useState();
4
+ const [pointerPosition, setPointerPosition] = React.useState();
5
+ const handleSeriesMouseMove = React.useCallback(({ pointerPosition: nextPointerPosition, hovered: nextHovered }) => {
6
+ setTooltipHoveredData(nextHovered);
7
+ setPointerPosition(nextPointerPosition);
8
+ }, []);
9
+ const handleSeriesMouseLeave = React.useCallback(() => {
10
+ setTooltipHoveredData(undefined);
11
+ setPointerPosition(undefined);
12
+ }, []);
13
+ return {
14
+ hovered,
15
+ pointerPosition,
16
+ handleSeriesMouseMove: tooltip.enabled ? handleSeriesMouseMove : undefined,
17
+ handleSeriesMouseLeave: tooltip.enabled ? handleSeriesMouseLeave : undefined,
18
+ };
19
+ };
@@ -0,0 +1,7 @@
1
+ import type { TooltipHoveredData } from '../../../../../types/widget-data';
2
+ export type PointerPosition = [number, number];
3
+ export type OnSeriesMouseMove = (args: {
4
+ hovered: TooltipHoveredData;
5
+ pointerPosition?: PointerPosition;
6
+ }) => void;
7
+ export type OnSeriesMouseLeave = () => void;
@@ -0,0 +1,18 @@
1
+ import type { AxisDomain } from 'd3';
2
+ import type { ChartKitWidgetSeries, ChartKitWidgetAxisType, ChartKitWidgetAxisLabels } from '../../../../types/widget-data';
3
+ export declare const isAxisRelatedSeries: (series: ChartKitWidgetSeries) => boolean;
4
+ export declare const getDomainDataXBySeries: (series: ChartKitWidgetSeries[]) => unknown[];
5
+ export declare const getDomainDataYBySeries: (series: ChartKitWidgetSeries[]) => unknown[];
6
+ export declare const getSeriesNames: (series: ChartKitWidgetSeries[]) => string[];
7
+ export declare const getVisibleSeriesNames: (series: ChartKitWidgetSeries[]) => string[];
8
+ export declare const getOnlyVisibleSeries: <T extends ChartKitWidgetSeries<any>>(series: T[]) => T[];
9
+ export declare const parseTransformStyle: (style: string | null) => {
10
+ x?: number | undefined;
11
+ y?: number | undefined;
12
+ };
13
+ export declare const formatAxisTickLabel: (args: {
14
+ axisType: ChartKitWidgetAxisType;
15
+ value: AxisDomain;
16
+ dateFormat?: ChartKitWidgetAxisLabels['dateFormat'];
17
+ numberFormat?: ChartKitWidgetAxisLabels['numberFormat'];
18
+ }) => string;
@@ -0,0 +1,71 @@
1
+ import { dateTime } from '@gravity-ui/date-utils';
2
+ import { formatNumber } from '../../../shared';
3
+ const CHARTS_WITHOUT_AXIS = ['pie'];
4
+ // Сhecks whether the series should be drawn with axes
5
+ export const isAxisRelatedSeries = (series) => {
6
+ return !CHARTS_WITHOUT_AXIS.includes(series.type);
7
+ };
8
+ export const getDomainDataXBySeries = (series) => {
9
+ return series.filter(isAxisRelatedSeries).reduce((acc, s) => {
10
+ acc.push(...s.data.map((d) => 'x' in d && d.x));
11
+ return acc;
12
+ }, []);
13
+ };
14
+ export const getDomainDataYBySeries = (series) => {
15
+ return series.filter(isAxisRelatedSeries).reduce((acc, s) => {
16
+ acc.push(...s.data.map((d) => 'y' in d && d.y));
17
+ return acc;
18
+ }, []);
19
+ };
20
+ // Uses to get all series names array (except `pie` charts)
21
+ export const getSeriesNames = (series) => {
22
+ return series.reduce((acc, s) => {
23
+ if ('name' in s && typeof s.name === 'string') {
24
+ acc.push(s.name);
25
+ }
26
+ return acc;
27
+ }, []);
28
+ };
29
+ // Uses to get all visible series names array (except `pie` charts)
30
+ export const getVisibleSeriesNames = (series) => {
31
+ return series.reduce((acc, s) => {
32
+ var _a;
33
+ const visible = (_a = s.visible) !== null && _a !== void 0 ? _a : true;
34
+ if ('name' in s && typeof s.name === 'string' && visible) {
35
+ acc.push(s.name);
36
+ }
37
+ return acc;
38
+ }, []);
39
+ };
40
+ export const getOnlyVisibleSeries = (series) => {
41
+ return series.filter((s) => s.visible);
42
+ };
43
+ export const parseTransformStyle = (style) => {
44
+ var _a;
45
+ if (!style) {
46
+ return {};
47
+ }
48
+ const stringifiedValue = ((_a = style.match(/\((.*?)\)/)) === null || _a === void 0 ? void 0 : _a[1]) || '';
49
+ const [xString, yString] = stringifiedValue.split(',');
50
+ const x = Number.isNaN(Number(xString)) ? undefined : Number(xString);
51
+ const y = Number.isNaN(Number(yString)) ? undefined : Number(yString);
52
+ return { x, y };
53
+ };
54
+ const defaultFormatNumberOptions = {
55
+ precision: 0,
56
+ };
57
+ export const formatAxisTickLabel = (args) => {
58
+ const { axisType, value, dateFormat = 'DD.MM.YY', numberFormat = defaultFormatNumberOptions, } = args;
59
+ switch (axisType) {
60
+ case 'category': {
61
+ return value;
62
+ }
63
+ case 'datetime': {
64
+ return dateTime({ input: value }).format(dateFormat);
65
+ }
66
+ case 'linear':
67
+ default: {
68
+ return formatNumber(value, numberFormat);
69
+ }
70
+ }
71
+ };
@@ -0,0 +1,4 @@
1
+ import type { ChartKitWidgetData } from '../../types/widget-data';
2
+ export type D3WidgetData = {
3
+ data: ChartKitWidgetData;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { FormatNumberOptions } from '../../plugins/shared';
2
+ import type { BaseTextStyle } from './base';
3
+ export type ChartKitWidgetAxisType = 'category' | 'datetime' | 'linear';
4
+ export type ChartKitWidgetAxisLabels = {
5
+ /** Enable or disable the axis labels */
6
+ enabled?: boolean;
7
+ /** The pixel padding for axis labels */
8
+ padding?: number;
9
+ dateFormat?: string;
10
+ numberFormat?: FormatNumberOptions;
11
+ style?: Partial<BaseTextStyle>;
12
+ };
13
+ export type ChartKitWidgetAxis = {
14
+ categories?: string[];
15
+ timestamps?: number[];
16
+ type?: ChartKitWidgetAxisType;
17
+ /** The axis labels show the number or category for each tick */
18
+ labels?: ChartKitWidgetAxisLabels;
19
+ title?: {
20
+ text?: string;
21
+ };
22
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ export type BaseSeries = {
2
+ /** Initial visibility of the series */
3
+ visible?: boolean;
4
+ };
5
+ export type BaseSeriesData<T = any> = {
6
+ /**
7
+ * A reserved subspace to store options and values for customized functionality
8
+ *
9
+ * Here you can add additional data for your own event callbacks and formatter callbacks
10
+ */
11
+ custom?: T;
12
+ };
13
+ export type BaseTextStyle = {
14
+ fontSize: string;
15
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ export type ChartMargin = {
2
+ top: number;
3
+ right: number;
4
+ bottom: number;
5
+ left: number;
6
+ };
7
+ export type ChartKitWidgetChart = {
8
+ margin?: Partial<ChartMargin>;
9
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ import type { ChartKitWidgetAxis } from './axis';
2
+ import type { ChartKitWidgetChart } from './chart';
3
+ import type { ChartKitWidgetLegend } from './legend';
4
+ import type { ChartKitWidgetSeries } from './series';
5
+ import type { ChartKitWidgetTitle } from './title';
6
+ import type { ChartKitWidgetTooltip } from './tooltip';
7
+ export * from './axis';
8
+ export * from './base';
9
+ export * from './chart';
10
+ export * from './legend';
11
+ export * from './pie';
12
+ export * from './scatter';
13
+ export * from './series';
14
+ export * from './title';
15
+ export * from './tooltip';
16
+ export type ChartKitWidgetData<T = any> = {
17
+ chart?: ChartKitWidgetChart;
18
+ legend?: ChartKitWidgetLegend;
19
+ series: ChartKitWidgetSeries<T>[];
20
+ title?: ChartKitWidgetTitle;
21
+ tooltip?: ChartKitWidgetTooltip<T>;
22
+ xAxis?: ChartKitWidgetAxis;
23
+ yAxis?: ChartKitWidgetAxis[];
24
+ };
@@ -0,0 +1,9 @@
1
+ export * from './axis';
2
+ export * from './base';
3
+ export * from './chart';
4
+ export * from './legend';
5
+ export * from './pie';
6
+ export * from './scatter';
7
+ export * from './series';
8
+ export * from './title';
9
+ export * from './tooltip';
@@ -0,0 +1,3 @@
1
+ export type ChartKitWidgetLegend = {
2
+ enabled?: boolean;
3
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { BaseSeries, BaseSeriesData } from './base';
2
+ export type PieSeriesData<T = any> = BaseSeriesData<T> & {
3
+ value: number;
4
+ color: string;
5
+ name: string;
6
+ };
7
+ export type PieSeries<T = any> = BaseSeries & {
8
+ type: 'pie';
9
+ data: PieSeriesData<T>[];
10
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import type { BaseSeries, BaseSeriesData } from './base';
2
+ export type ScatterSeriesData<T = any> = BaseSeriesData<T> & {
3
+ /** The x value of the point */
4
+ x?: number;
5
+ /** The y value of the point */
6
+ y?: number;
7
+ /** Corresponding value of axis category */
8
+ category?: string;
9
+ radius?: number;
10
+ };
11
+ export type ScatterSeries<T = any> = BaseSeries & {
12
+ type: 'scatter';
13
+ data: ScatterSeriesData<T>[];
14
+ /** The name of the series (used in legend) */
15
+ name: string;
16
+ /** The main color of the series (hex, rgba) */
17
+ color?: string;
18
+ /** A predefined shape or symbol for the dot */
19
+ symbol?: string;
20
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import type { PieSeries, PieSeriesData } from './pie';
2
+ import type { ScatterSeries, ScatterSeriesData } from './scatter';
3
+ export type ChartKitWidgetSeries<T = any> = ScatterSeries<T> | PieSeries<T>;
4
+ export type ChartKitWidgetSeriesData<T = any> = ScatterSeriesData<T> | PieSeriesData<T>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { BaseTextStyle } from './base';
2
+ export type ChartKitWidgetTitle = {
3
+ text: string;
4
+ style?: Partial<BaseTextStyle>;
5
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import type { ChartKitWidgetSeries, ChartKitWidgetSeriesData } from './series';
3
+ export type TooltipHoveredData<T = any> = {
4
+ data: ChartKitWidgetSeriesData<T>;
5
+ series: ChartKitWidgetSeries;
6
+ };
7
+ export type ChartKitWidgetTooltip<T = any> = {
8
+ enabled?: boolean;
9
+ renderer?: (data: {
10
+ hovered: TooltipHoveredData<T>;
11
+ }) => React.ReactElement;
12
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -2,6 +2,7 @@
2
2
  import type { CustomTooltipProps, Yagr, YagrWidgetData } from '../plugins/yagr/types';
3
3
  import type { IndicatorWidgetData } from '../plugins/indicator/types';
4
4
  import type { Highcharts, HighchartsWidgetData, StringParams } from '../plugins/highcharts/types';
5
+ import type { ChartKitWidgetData } from './widget-data';
5
6
  export interface ChartKitWidget {
6
7
  yagr: {
7
8
  data: YagrWidgetData;
@@ -28,4 +29,8 @@ export interface ChartKitWidget {
28
29
  forceUpdate: boolean;
29
30
  }, callExternalOnChange?: boolean) => void;
30
31
  };
32
+ d3: {
33
+ data: ChartKitWidgetData;
34
+ widget: never;
35
+ };
31
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/chartkit",
3
- "version": "3.1.3",
3
+ "version": "3.2.0",
4
4
  "description": "React component used to render charts based on any sources you need",
5
5
  "license": "MIT",
6
6
  "repository": "git@github.com:gravity-ui/ChartKit.git",
@@ -14,8 +14,9 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "@gravity-ui/date-utils": "^1.4.1",
17
- "@gravity-ui/yagr": "^3.7.7",
17
+ "@gravity-ui/yagr": "^3.7.8",
18
18
  "bem-cn-lite": "^4.1.0",
19
+ "d3": "^7.8.5",
19
20
  "lodash": "^4.17.21",
20
21
  "react-split-pane": "^0.1.92"
21
22
  },
@@ -35,6 +36,7 @@
35
36
  "@storybook/preset-scss": "^1.0.3",
36
37
  "@storybook/react": "^7.0.26",
37
38
  "@storybook/react-webpack5": "^7.0.26",
39
+ "@types/d3": "^7.4.0",
38
40
  "@types/jest": "^28.1.3",
39
41
  "@types/lodash": "^4.14.177",
40
42
  "@types/node": "^18.0.0",