@elliemae/ds-dataviz-pie 3.9.0 → 3.10.0-next.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.
- package/dist/cjs/PieContext.js +1 -11
- package/dist/cjs/PieContext.js.map +2 -2
- package/dist/cjs/config/useKeyboardNavigation.js +13 -57
- package/dist/cjs/config/useKeyboardNavigation.js.map +2 -2
- package/dist/cjs/config/usePie.js +11 -5
- package/dist/cjs/config/usePie.js.map +2 -2
- package/dist/cjs/{parts/Tooltip.js → helpers/colorPallet.js} +24 -28
- package/dist/cjs/helpers/colorPallet.js.map +7 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/parts/ChartContainer.js +8 -3
- package/dist/cjs/parts/ChartContainer.js.map +2 -2
- package/dist/cjs/parts/Pie.js +3 -2
- package/dist/cjs/parts/Pie.js.map +2 -2
- package/dist/cjs/parts/Slice.js +49 -34
- package/dist/cjs/parts/Slice.js.map +2 -2
- package/dist/cjs/styles.js +17 -57
- package/dist/cjs/styles.js.map +2 -2
- package/dist/esm/PieContext.js +2 -12
- package/dist/esm/PieContext.js.map +2 -2
- package/dist/esm/config/useKeyboardNavigation.js +14 -58
- package/dist/esm/config/useKeyboardNavigation.js.map +2 -2
- package/dist/esm/config/usePie.js +11 -5
- package/dist/esm/config/usePie.js.map +2 -2
- package/dist/esm/helpers/colorPallet.js +25 -0
- package/dist/esm/helpers/colorPallet.js.map +7 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/parts/ChartContainer.js +8 -3
- package/dist/esm/parts/ChartContainer.js.map +2 -2
- package/dist/esm/parts/Pie.js +3 -2
- package/dist/esm/parts/Pie.js.map +2 -2
- package/dist/esm/parts/Slice.js +50 -35
- package/dist/esm/parts/Slice.js.map +2 -2
- package/dist/esm/styles.js +18 -58
- package/dist/esm/styles.js.map +2 -2
- package/package.json +8 -8
- package/dist/cjs/parts/Tooltip.js.map +0 -7
- package/dist/esm/parts/Tooltip.js +0 -29
- package/dist/esm/parts/Tooltip.js.map +0 -7
package/dist/cjs/styles.js
CHANGED
|
@@ -24,14 +24,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
24
24
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
25
|
var styles_exports = {};
|
|
26
26
|
__export(styles_exports, {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
StyledLine: () => StyledLine,
|
|
32
|
-
StyledMark: () => StyledMark,
|
|
33
|
-
StyledPoint: () => StyledPoint,
|
|
34
|
-
StyledSVGWrapper: () => StyledSVGWrapper
|
|
27
|
+
StyledInnerText: () => StyledInnerText,
|
|
28
|
+
StyledMouseOverDetectionBox: () => StyledMouseOverDetectionBox,
|
|
29
|
+
StyledSVGWrapper: () => StyledSVGWrapper,
|
|
30
|
+
StyledTooltipContainer: () => StyledTooltipContainer
|
|
35
31
|
});
|
|
36
32
|
module.exports = __toCommonJS(styles_exports);
|
|
37
33
|
var React = __toESM(require("react"));
|
|
@@ -44,56 +40,20 @@ const StyledSVGWrapper = import_ds_system.styled.div`
|
|
|
44
40
|
outline: none;
|
|
45
41
|
}
|
|
46
42
|
`;
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
text.axis-label {
|
|
53
|
-
font-size: 2.5em;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.tick text {
|
|
57
|
-
${({ color }) => color ? `fill: ${color}` : ""}
|
|
58
|
-
}
|
|
59
|
-
.tick line {
|
|
60
|
-
${({ color }) => color ? `stroke: ${color}` : ""}
|
|
61
|
-
}
|
|
62
|
-
line {
|
|
63
|
-
stroke: #c0c0bb;
|
|
64
|
-
}
|
|
65
|
-
`;
|
|
66
|
-
const StyledGrid = (0, import_ds_system.styled)("g")`
|
|
67
|
-
line {
|
|
68
|
-
stroke: #c0c0bb;
|
|
69
|
-
}
|
|
70
|
-
`;
|
|
71
|
-
const borderCircle = import_ds_system.css`
|
|
72
|
-
stroke: red;
|
|
73
|
-
stroke-width: 2;
|
|
74
|
-
`;
|
|
75
|
-
const StyledMark = (0, import_ds_system.styled)("rect")`
|
|
76
|
-
${({ isFocused }) => isFocused ? borderCircle : ""};
|
|
77
|
-
`;
|
|
78
|
-
const StyleFocusableRegion = (0, import_ds_system.styled)("div")`
|
|
79
|
-
width: ${({ s }) => s * 2}px;
|
|
80
|
-
height: ${({ s }) => s * 2}px;
|
|
81
|
-
:focus {
|
|
82
|
-
outline: none;
|
|
83
|
-
}
|
|
84
|
-
`;
|
|
85
|
-
const StyledLine = (0, import_ds_system.styled)("path")`
|
|
86
|
-
fill: none;
|
|
87
|
-
stroke-width: ${({ isActiveLine }) => isActiveLine ? 5 : 3};
|
|
88
|
-
stroke-linejoin: round;
|
|
43
|
+
const StyledInnerText = import_ds_system.styled.text`
|
|
44
|
+
font-size: 14px;
|
|
45
|
+
font-weight: 600;
|
|
89
46
|
`;
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
opacity: 0.8;
|
|
47
|
+
const StyledTooltipContainer = import_ds_system.styled.div`
|
|
48
|
+
max-width: 350px;
|
|
49
|
+
background-color: white;
|
|
94
50
|
`;
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
51
|
+
const StyledMouseOverDetectionBox = import_ds_system.styled.div`
|
|
52
|
+
position: absolute;
|
|
53
|
+
top: -15px;
|
|
54
|
+
right: -15px;
|
|
55
|
+
width: calc(100% + 30px);
|
|
56
|
+
height: calc(100% + 30px);
|
|
57
|
+
z-index: -1;
|
|
98
58
|
`;
|
|
99
59
|
//# sourceMappingURL=styles.js.map
|
package/dist/cjs/styles.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/styles.tsx", "../../../../scripts/build/transpile/react-shim.js"],
|
|
4
|
-
"sourcesContent": ["import { styled, css } from '@elliemae/ds-system';\n\nexport const StyledSVGWrapper = styled.div`\n :focus {\n outline: none;\n }\n :focus-within {\n outline: none;\n }\n`;\n\nexport const
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import { styled, css } from '@elliemae/ds-system';\n\nexport const StyledSVGWrapper = styled.div`\n :focus {\n outline: none;\n }\n :focus-within {\n outline: none;\n }\n`;\n\nexport const StyledInnerText = styled.text`\n font-size: 14px;\n font-weight: 600;\n`;\n\nexport const StyledTooltipContainer = styled.div`\n max-width: 350px;\n background-color: white;\n`;\n\nexport const StyledMouseOverDetectionBox = styled.div`\n position: absolute;\n top: -15px;\n right: -15px;\n width: calc(100% + 30px);\n height: calc(100% + 30px);\n z-index: -1;\n`;\n", "import * as React from 'react';\nexport { React };\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAA,YAAuB;ADAvB,uBAA4B;AAErB,MAAM,mBAAmB,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,MAAM,kBAAkB,wBAAO;AAAA;AAAA;AAAA;AAK/B,MAAM,yBAAyB,wBAAO;AAAA;AAAA;AAAA;AAKtC,MAAM,8BAA8B,wBAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/esm/PieContext.js
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { createContext
|
|
3
|
-
|
|
4
|
-
const pieChartdefaultContext = {
|
|
5
|
-
innerHeight: 0,
|
|
6
|
-
innerWidth: 0,
|
|
7
|
-
activeSerie: "",
|
|
8
|
-
setActiveSerie: () => {
|
|
9
|
-
},
|
|
10
|
-
containerRef: createRef(),
|
|
11
|
-
groups: [],
|
|
12
|
-
colorScale: scaleOrdinal()
|
|
13
|
-
};
|
|
2
|
+
import { createContext } from "react";
|
|
3
|
+
const pieChartdefaultContext = {};
|
|
14
4
|
const PieContext = createContext(pieChartdefaultContext);
|
|
15
5
|
export {
|
|
16
6
|
PieContext
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../scripts/build/transpile/react-shim.js", "../../src/PieContext.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { createContext, createRef } from 'react';\nimport { scaleOrdinal, ScaleOrdinal } from 'd3';\nimport { DSPieT } from './react-desc-prop-types';\n\ninterface PieChartContextT {\n props: Partial<DSPieT.Props>;\n innerHeight: number;\n innerWidth: number;\n activeSerie: string;\n setActiveSerie: React.Dispatch<React.SetStateAction<string>>;\n containerRef: React.RefObject<HTMLDivElement>;\n groups: string[];\n colorScale: ScaleOrdinal<string, unknown, never>;\n}\n\nconst pieChartdefaultContext: PieChartContextT = {\n // props: defaultProps,\n innerHeight: 0,\n innerWidth: 0,\n activeSerie: '',\n setActiveSerie: () => {},\n containerRef: createRef<HTMLDivElement>(),\n groups: [],\n colorScale: scaleOrdinal(),\n};\n\nexport const PieContext = createContext(pieChartdefaultContext);\n"],
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { createContext, createRef } from 'react';\nimport { scaleOrdinal, ScaleOrdinal } from 'd3';\nimport { DSPieT } from './react-desc-prop-types';\n\ninterface PieChartContextT {\n props: Partial<DSPieT.Props>;\n innerHeight: number;\n innerWidth: number;\n activeSerie: string;\n setActiveSerie: React.Dispatch<React.SetStateAction<string>>;\n containerRef: React.RefObject<HTMLDivElement>;\n groups: string[];\n colorScale: ScaleOrdinal<string, unknown, never>;\n}\n\nconst pieChartdefaultContext: PieChartContextT = {\n // props: defaultProps,\n // innerHeight: 0,\n // innerWidth: 0,\n // activeSerie: '',\n // setActiveSerie: () => {},\n // containerRef: createRef<HTMLDivElement>(),\n // groups: [],\n // colorScale: scaleOrdinal(),\n};\n\nexport const PieContext = createContext(pieChartdefaultContext);\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,qBAAgC;AAezC,MAAM,yBAA2C,CASjD;AAEO,MAAM,aAAa,cAAc,sBAAsB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { useCallback, useContext
|
|
2
|
+
import { useCallback, useContext } from "react";
|
|
3
3
|
import { PieContext } from "../PieContext";
|
|
4
4
|
const findInCircularList = (list, from, step = 1) => {
|
|
5
5
|
for (let i = (from + step + list.length) % list.length; i !== from && from > -1; i = (i + step + list.length) % list.length) {
|
|
@@ -9,62 +9,27 @@ const findInCircularList = (list, from, step = 1) => {
|
|
|
9
9
|
return from;
|
|
10
10
|
};
|
|
11
11
|
const useKeyboardNavigation = () => {
|
|
12
|
-
const {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
groups,
|
|
17
|
-
yScale,
|
|
18
|
-
props: { data }
|
|
19
|
-
} = useContext(PieContext);
|
|
20
|
-
const [currentFocusedDataset, setCurrentFocusedDataset] = useState(groups[0]);
|
|
21
|
-
const currentGroup = useMemo(() => data.find((d) => d.name === currentFocusedDataset), [currentFocusedDataset, data]);
|
|
22
|
-
const currentItemIndex = useMemo(
|
|
23
|
-
() => currentGroup.data.findIndex((opt) => opt.key === activePoint),
|
|
24
|
-
[activePoint, currentGroup]
|
|
25
|
-
);
|
|
26
|
-
const handleOnFocus = useCallback(
|
|
27
|
-
(e) => {
|
|
28
|
-
console.log("focus");
|
|
29
|
-
if (containerRef?.current === e.target) {
|
|
30
|
-
setActivePoint(currentGroup.data[0].key);
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
[containerRef, currentGroup, setActivePoint]
|
|
34
|
-
);
|
|
12
|
+
const { activeSerie, setActiveSerie, containerRef, currentData } = useContext(PieContext);
|
|
13
|
+
const handleOnFocus = useCallback(() => {
|
|
14
|
+
setActiveSerie(currentData[0].key);
|
|
15
|
+
}, [currentData, setActiveSerie]);
|
|
35
16
|
const handleOnBlur = useCallback(() => {
|
|
36
17
|
setTimeout(() => {
|
|
37
18
|
if (!containerRef?.current?.contains(document.activeElement) || containerRef?.current === document.activeElement) {
|
|
38
|
-
|
|
39
|
-
setActivePoint("");
|
|
19
|
+
setActiveSerie("");
|
|
40
20
|
}
|
|
41
21
|
});
|
|
42
|
-
}, [containerRef,
|
|
22
|
+
}, [containerRef, setActiveSerie]);
|
|
43
23
|
const navigateSerie = useCallback(
|
|
44
24
|
(step) => {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
25
|
+
const newFocusedSliceIndex = findInCircularList(
|
|
26
|
+
currentData,
|
|
27
|
+
currentData.findIndex((serie) => serie.key === activeSerie),
|
|
48
28
|
step
|
|
49
29
|
);
|
|
50
|
-
|
|
30
|
+
setActiveSerie(currentData[newFocusedSliceIndex].key);
|
|
51
31
|
},
|
|
52
|
-
[
|
|
53
|
-
);
|
|
54
|
-
const changeSerie = useCallback(
|
|
55
|
-
(step) => {
|
|
56
|
-
setCurrentFocusedDataset((prev) => {
|
|
57
|
-
const nextGroup = findInCircularList(
|
|
58
|
-
groups,
|
|
59
|
-
groups.findIndex((item) => item === prev),
|
|
60
|
-
step
|
|
61
|
-
);
|
|
62
|
-
const nextGroupData = data.find((d) => d.name === groups[nextGroup]);
|
|
63
|
-
setActivePoint(nextGroupData.data[currentItemIndex].key);
|
|
64
|
-
return groups[nextGroup];
|
|
65
|
-
});
|
|
66
|
-
},
|
|
67
|
-
[currentItemIndex, data, setActivePoint, groups]
|
|
32
|
+
[activeSerie, currentData, setActiveSerie]
|
|
68
33
|
);
|
|
69
34
|
const onInputKeyDown = useCallback(
|
|
70
35
|
(e) => {
|
|
@@ -72,19 +37,10 @@ const useKeyboardNavigation = () => {
|
|
|
72
37
|
e.preventDefault();
|
|
73
38
|
}
|
|
74
39
|
if (["ArrowLeft", "ArrowRight"].includes(e.code)) {
|
|
75
|
-
|
|
76
|
-
changeSerie(e.code === "ArrowLeft" ? -1 : 1);
|
|
77
|
-
else
|
|
78
|
-
navigateSerie(e.code === "ArrowLeft" ? -1 : 1);
|
|
79
|
-
}
|
|
80
|
-
if (["ArrowDown", "ArrowUp"].includes(e.code)) {
|
|
81
|
-
if (yScale.bandwidth)
|
|
82
|
-
navigateSerie(e.code === "ArrowDown" ? -1 : 1);
|
|
83
|
-
else
|
|
84
|
-
changeSerie(e.code === "ArrowDown" ? -1 : 1);
|
|
40
|
+
navigateSerie(e.code === "ArrowLeft" ? -1 : 1);
|
|
85
41
|
}
|
|
86
42
|
},
|
|
87
|
-
[
|
|
43
|
+
[navigateSerie]
|
|
88
44
|
);
|
|
89
45
|
return { onInputKeyDown, handleOnBlur, handleOnFocus };
|
|
90
46
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/config/useKeyboardNavigation.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable max-depth */\n/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport { useCallback, useContext
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACIvB,SAAS,aAAa,
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable max-lines */\n/* eslint-disable max-depth */\n/* eslint-disable max-statements */\n/* eslint-disable complexity */\nimport { useCallback, useContext } from 'react';\nimport { PieContext } from '../PieContext';\n\nexport const findInCircularList = (\n list,\n from: number,\n //criteria: (item) => boolean,\n step = 1,\n // eslint-disable-next-line max-params\n): number => {\n for (\n let i = (from + step + list.length) % list.length;\n i !== from && from > -1;\n i = (i + step + list.length) % list.length\n ) {\n if (list[i]) return i;\n }\n return from; // return same item\n};\n\nexport const useKeyboardNavigation = () => {\n const { activeSerie, setActiveSerie, containerRef, currentData } = useContext(PieContext);\n\n // const currentGroup = useMemo(() => data.find((d) => d.name === currentFocusedDataset), [currentFocusedDataset, data]);\n\n const handleOnFocus: React.FocusEventHandler<HTMLDivElement> = useCallback(() => {\n setActiveSerie(currentData[0].key);\n }, [currentData, setActiveSerie]);\n\n const handleOnBlur: React.FocusEventHandler<HTMLInputElement> = useCallback(() => {\n setTimeout(() => {\n if (\n !containerRef?.current?.contains(document.activeElement) ||\n containerRef?.current === document.activeElement\n ) {\n setActiveSerie('');\n }\n });\n }, [containerRef, setActiveSerie]);\n\n const navigateSerie = useCallback(\n (step: number) => {\n const newFocusedSliceIndex = findInCircularList(\n currentData,\n currentData.findIndex((serie) => serie.key === activeSerie),\n step,\n );\n setActiveSerie(currentData[newFocusedSliceIndex].key);\n },\n [activeSerie, currentData, setActiveSerie],\n );\n\n const onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = useCallback(\n (e) => {\n if (e.code !== 'Tab') {\n e.preventDefault();\n }\n if (['ArrowLeft', 'ArrowRight'].includes(e.code)) {\n navigateSerie(e.code === 'ArrowLeft' ? -1 : 1);\n }\n },\n [navigateSerie],\n );\n\n return { onInputKeyDown, handleOnBlur, handleOnFocus };\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACIvB,SAAS,aAAa,kBAAkB;AACxC,SAAS,kBAAkB;AAEpB,MAAM,qBAAqB,CAChC,MACA,MAEA,OAAO,MAEI;AACX,WACM,KAAK,OAAO,OAAO,KAAK,UAAU,KAAK,QAC3C,MAAM,QAAQ,OAAO,IACrB,KAAK,IAAI,OAAO,KAAK,UAAU,KAAK,QACpC;AACA,QAAI,KAAK;AAAI,aAAO;AAAA,EACtB;AACA,SAAO;AACT;AAEO,MAAM,wBAAwB,MAAM;AACzC,QAAM,EAAE,aAAa,gBAAgB,cAAc,YAAY,IAAI,WAAW,UAAU;AAIxF,QAAM,gBAAyD,YAAY,MAAM;AAC/E,mBAAe,YAAY,GAAG,GAAG;AAAA,EACnC,GAAG,CAAC,aAAa,cAAc,CAAC;AAEhC,QAAM,eAA0D,YAAY,MAAM;AAChF,eAAW,MAAM;AACf,UACE,CAAC,cAAc,SAAS,SAAS,SAAS,aAAa,KACvD,cAAc,YAAY,SAAS,eACnC;AACA,uBAAe,EAAE;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,cAAc,cAAc,CAAC;AAEjC,QAAM,gBAAgB;AAAA,IACpB,CAAC,SAAiB;AAChB,YAAM,uBAAuB;AAAA,QAC3B;AAAA,QACA,YAAY,UAAU,CAAC,UAAU,MAAM,QAAQ,WAAW;AAAA,QAC1D;AAAA,MACF;AACA,qBAAe,YAAY,sBAAsB,GAAG;AAAA,IACtD;AAAA,IACA,CAAC,aAAa,aAAa,cAAc;AAAA,EAC3C;AAEA,QAAM,iBAA+D;AAAA,IACnE,CAAC,MAAM;AACL,UAAI,EAAE,SAAS,OAAO;AACpB,UAAE,eAAe;AAAA,MACnB;AACA,UAAI,CAAC,aAAa,YAAY,EAAE,SAAS,EAAE,IAAI,GAAG;AAChD,sBAAc,EAAE,SAAS,cAAc,KAAK,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,SAAO,EAAE,gBAAgB,cAAc,cAAc;AACvD;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,10 +9,15 @@ const usePie = (props) => {
|
|
|
9
9
|
const innerHeight = height - margin.top - margin.bottom;
|
|
10
10
|
const innerWidth = width - margin.left - margin.right;
|
|
11
11
|
const groups = series.map((serie) => serie.name);
|
|
12
|
+
const currentData = useMemo(
|
|
13
|
+
() => series.map((serie, i) => ({
|
|
14
|
+
...serie,
|
|
15
|
+
key: `${serie.name}-${i}`
|
|
16
|
+
})),
|
|
17
|
+
[series]
|
|
18
|
+
);
|
|
12
19
|
const data = series.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});
|
|
13
|
-
const pieGenerator = pie().value(
|
|
14
|
-
return d[1];
|
|
15
|
-
}).sort(null).padAngle(0.02);
|
|
20
|
+
const pieGenerator = pie().value((d) => d[1]).sort(null).padAngle(0.02);
|
|
16
21
|
const pieData = pieGenerator(Object.entries(data));
|
|
17
22
|
return useMemo(
|
|
18
23
|
() => ({
|
|
@@ -24,9 +29,10 @@ const usePie = (props) => {
|
|
|
24
29
|
containerRef,
|
|
25
30
|
activeSerie,
|
|
26
31
|
pieData,
|
|
27
|
-
setActiveSerie
|
|
32
|
+
setActiveSerie,
|
|
33
|
+
currentData
|
|
28
34
|
}),
|
|
29
|
-
[props,
|
|
35
|
+
[props, innerHeight, innerWidth, groups, activeSerie, pieData, currentData]
|
|
30
36
|
);
|
|
31
37
|
};
|
|
32
38
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/config/usePie.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useMemo, useState, useRef } from 'react';\nimport { pie } from 'd3';\n// import { useValidateTypescriptPropTypes } from '@elliemae/ds-utilities';\nimport type { DSPieT } from '../react-desc-prop-types';\n\nexport const usePie = (props: DSPieT.Props) => {\n // useValidateTypescriptPropTypes(props, propTypes);\n\n const { series, width, height, margin } = props;\n\n const containerRef = useRef(null);\n const svgRef = useRef(null);\n\n const [activeSerie, setActiveSerie] = useState('');\n\n const innerHeight = height - margin.top - margin.bottom;\n const innerWidth = width - margin.left - margin.right;\n\n const groups = series.map((serie) => serie.name);\n\n const data = series.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});\n const pieGenerator = pie()\n .value(
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,SAAS,UAAU,cAAc;AAC1C,SAAS,WAAW;AAIb,MAAM,SAAS,CAAC,UAAwB;AAG7C,QAAM,EAAE,QAAQ,OAAO,QAAQ,OAAO,IAAI;AAE1C,QAAM,eAAe,OAAO,IAAI;AAChC,QAAM,SAAS,OAAO,IAAI;AAE1B,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AAEjD,QAAM,cAAc,SAAS,OAAO,MAAM,OAAO;AACjD,QAAM,aAAa,QAAQ,OAAO,OAAO,OAAO;AAEhD,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAE/C,QAAM,OAAO,OAAO,OAAO,CAAC,KAAK,UAAU,EAAE,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAClF,QAAM,eAAe,IAAI,EACtB,MAAM,
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useMemo, useState, useRef } from 'react';\nimport { pie } from 'd3';\n// import { useValidateTypescriptPropTypes } from '@elliemae/ds-utilities';\nimport type { DSPieT } from '../react-desc-prop-types';\n\nexport const usePie = (props: DSPieT.Props) => {\n // useValidateTypescriptPropTypes(props, propTypes);\n\n const { series, width, height, margin } = props;\n\n const containerRef = useRef(null);\n const svgRef = useRef(null);\n\n const [activeSerie, setActiveSerie] = useState('');\n\n const innerHeight = height - margin.top - margin.bottom;\n const innerWidth = width - margin.left - margin.right;\n\n const groups = series.map((serie) => serie.name);\n\n const currentData = useMemo(\n () =>\n series.map((serie, i) => ({\n ...serie,\n key: `${serie.name}-${i}`,\n })),\n [series],\n );\n const data = series.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});\n const pieGenerator = pie()\n .value((d) => d[1])\n .sort(null)\n .padAngle(0.02);\n const pieData = pieGenerator(Object.entries(data));\n\n return useMemo(\n () => ({\n props,\n innerHeight,\n innerWidth,\n groups,\n svgRef,\n containerRef,\n activeSerie,\n pieData,\n setActiveSerie,\n currentData,\n }),\n [props, innerHeight, innerWidth, groups, activeSerie, pieData, currentData],\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,SAAS,UAAU,cAAc;AAC1C,SAAS,WAAW;AAIb,MAAM,SAAS,CAAC,UAAwB;AAG7C,QAAM,EAAE,QAAQ,OAAO,QAAQ,OAAO,IAAI;AAE1C,QAAM,eAAe,OAAO,IAAI;AAChC,QAAM,SAAS,OAAO,IAAI;AAE1B,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AAEjD,QAAM,cAAc,SAAS,OAAO,MAAM,OAAO;AACjD,QAAM,aAAa,QAAQ,OAAO,OAAO,OAAO;AAEhD,QAAM,SAAS,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAE/C,QAAM,cAAc;AAAA,IAClB,MACE,OAAO,IAAI,CAAC,OAAO,OAAO;AAAA,MACxB,GAAG;AAAA,MACH,KAAK,GAAG,MAAM,QAAQ;AAAA,IACxB,EAAE;AAAA,IACJ,CAAC,MAAM;AAAA,EACT;AACA,QAAM,OAAO,OAAO,OAAO,CAAC,KAAK,UAAU,EAAE,GAAG,KAAK,CAAC,KAAK,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC;AAClF,QAAM,eAAe,IAAI,EACtB,MAAM,CAAC,MAAM,EAAE,EAAE,EACjB,KAAK,IAAI,EACT,SAAS,IAAI;AAChB,QAAM,UAAU,aAAa,OAAO,QAAQ,IAAI,CAAC;AAEjD,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,aAAa,YAAY,QAAQ,aAAa,SAAS,WAAW;AAAA,EAC5E;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
const COLOR_PALLET = {
|
|
3
|
+
"blue-100": "#1E79C2",
|
|
4
|
+
"blue-200": "#165A91",
|
|
5
|
+
"blue-400": "#10426A",
|
|
6
|
+
"magenta-100": "#CA3981",
|
|
7
|
+
"magenta-200": "#832553",
|
|
8
|
+
"magenta-400": "#6E1F46",
|
|
9
|
+
"orange-100": "#B25119",
|
|
10
|
+
"orange-200": "#853C12",
|
|
11
|
+
"orange-400": "#612C0D",
|
|
12
|
+
"purple-100": "#8E49B2",
|
|
13
|
+
"purple-200": "#61327A",
|
|
14
|
+
"purple-400": "#4D2861",
|
|
15
|
+
"green-100": "#007A78",
|
|
16
|
+
"green-200": "#005B59",
|
|
17
|
+
"green-400": "#004241",
|
|
18
|
+
"grey-100": "#697489",
|
|
19
|
+
"grey-200": "#4E5666",
|
|
20
|
+
"grey-400": "#323842"
|
|
21
|
+
};
|
|
22
|
+
export {
|
|
23
|
+
COLOR_PALLET
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=colorPallet.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/helpers/colorPallet.tsx"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export const COLOR_PALLET = {\n 'blue-100': '#1E79C2',\n 'blue-200': '#165A91',\n 'blue-400': '#10426A',\n 'magenta-100': '#CA3981',\n 'magenta-200': '#832553',\n 'magenta-400': '#6E1F46',\n 'orange-100': '#B25119',\n 'orange-200': '#853C12',\n 'orange-400': '#612C0D',\n 'purple-100': '#8E49B2',\n 'purple-200': '#61327A',\n 'purple-400': '#4D2861',\n 'green-100': '#007A78',\n 'green-200': '#005B59',\n 'green-400': '#004241',\n 'grey-100': '#697489',\n 'grey-200': '#4E5666',\n 'grey-400': '#323842',\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAhB,MAAM,eAAe;AAAA,EAC1B,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AACd;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../scripts/build/transpile/react-shim.js", "../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export { PieChart } from './Pie';\n"],
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,gBAAgB;",
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "export { PieChart } from './Pie';\nexport { COLOR_PALLET } from './helpers/colorPallet';\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,13 +2,13 @@ import * as React from "react";
|
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useContext, useMemo } from "react";
|
|
4
4
|
import { StyledSVGWrapper } from "../styles";
|
|
5
|
+
import { useKeyboardNavigation } from "../config/useKeyboardNavigation";
|
|
5
6
|
import { PieContext } from "../PieContext";
|
|
6
7
|
const ChartContainer = ({ children }) => {
|
|
7
8
|
const {
|
|
8
9
|
props: { width, height, margin, responsive },
|
|
9
10
|
containerRef,
|
|
10
|
-
activeSerie
|
|
11
|
-
svgRef
|
|
11
|
+
activeSerie
|
|
12
12
|
} = useContext(PieContext);
|
|
13
13
|
const dimensions = useMemo(
|
|
14
14
|
() => responsive ? {
|
|
@@ -19,10 +19,15 @@ const ChartContainer = ({ children }) => {
|
|
|
19
19
|
},
|
|
20
20
|
[height, responsive, width]
|
|
21
21
|
);
|
|
22
|
+
const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();
|
|
22
23
|
return /* @__PURE__ */ jsx(StyledSVGWrapper, {
|
|
23
24
|
ref: containerRef,
|
|
25
|
+
onKeyDown: onInputKeyDown,
|
|
26
|
+
tabIndex: activeSerie ? -1 : 0,
|
|
27
|
+
onBlur: handleOnBlur,
|
|
28
|
+
onFocus: handleOnFocus,
|
|
29
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
24
30
|
children: /* @__PURE__ */ jsx("svg", {
|
|
25
|
-
ref: svgRef,
|
|
26
31
|
...dimensions,
|
|
27
32
|
children: /* @__PURE__ */ jsx("g", {
|
|
28
33
|
className: "container",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/ChartContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo } from 'react';\nimport { StyledSVGWrapper } from '../styles';\
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,eAAe;AAC3C,SAAS,wBAAwB;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext, useMemo } from 'react';\nimport { StyledSVGWrapper } from '../styles';\nimport { useKeyboardNavigation } from '../config/useKeyboardNavigation';\nimport { PieContext } from '../PieContext';\n// import { useKeyboardNavigation } from '../config/useKeyboardNavigation';\ninterface ChartContainerT {\n children: JSX.Element | JSX.Element[] | string | string[];\n}\nexport const ChartContainer: React.ComponentType<ChartContainerT> = ({ children }) => {\n const {\n props: { width, height, margin, responsive },\n containerRef,\n activeSerie,\n } = useContext(PieContext);\n\n const dimensions = useMemo(\n () =>\n responsive\n ? {\n viewBox: `0 0 ${width} ${height}`,\n }\n : {\n width,\n height,\n },\n [height, responsive, width],\n );\n const { onInputKeyDown, handleOnBlur, handleOnFocus } = useKeyboardNavigation();\n return (\n <StyledSVGWrapper\n ref={containerRef}\n onKeyDown={onInputKeyDown}\n // aria-hidden=\"true\"\n tabIndex={activeSerie ? -1 : 0}\n onBlur={handleOnBlur}\n onFocus={handleOnFocus}\n onMouseDown={(e) => e.preventDefault()}\n >\n <svg {...dimensions}>\n <g className=\"container\" transform={`translate(${margin.left},${margin.top})`}>\n {children}\n </g>\n </svg>\n </StyledSVGWrapper>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,YAAY,eAAe;AAC3C,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,kBAAkB;AAKpB,MAAM,iBAAuD,CAAC,EAAE,SAAS,MAAM;AACpF,QAAM;AAAA,IACJ,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW;AAAA,IAC3C;AAAA,IACA;AAAA,EACF,IAAI,WAAW,UAAU;AAEzB,QAAM,aAAa;AAAA,IACjB,MACE,aACI;AAAA,MACE,SAAS,OAAO,SAAS;AAAA,IAC3B,IACA;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACN,CAAC,QAAQ,YAAY,KAAK;AAAA,EAC5B;AACA,QAAM,EAAE,gBAAgB,cAAc,cAAc,IAAI,sBAAsB;AAC9E,SACE,oBAAC;AAAA,IACC,KAAK;AAAA,IACL,WAAW;AAAA,IAEX,UAAU,cAAc,KAAK;AAAA,IAC7B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,IAErC,8BAAC;AAAA,MAAK,GAAG;AAAA,MACP,8BAAC;AAAA,QAAE,WAAU;AAAA,QAAY,WAAW,aAAa,OAAO,QAAQ,OAAO;AAAA,QACpE;AAAA,OACH;AAAA,KACF;AAAA,GACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/esm/parts/Pie.js
CHANGED
|
@@ -3,6 +3,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { useContext } from "react";
|
|
4
4
|
import { Slice } from "./Slice";
|
|
5
5
|
import { PieContext } from "../PieContext";
|
|
6
|
+
import { StyledInnerText } from "../styles";
|
|
6
7
|
const Pie = () => {
|
|
7
8
|
const {
|
|
8
9
|
innerHeight,
|
|
@@ -18,14 +19,14 @@ const Pie = () => {
|
|
|
18
19
|
pieData.map((slice) => /* @__PURE__ */ jsx(Slice, {
|
|
19
20
|
data: slice
|
|
20
21
|
}, slice.index)),
|
|
21
|
-
!isHalfPie && label ? /* @__PURE__ */ jsx(
|
|
22
|
+
!isHalfPie && label ? /* @__PURE__ */ jsx(StyledInnerText, {
|
|
22
23
|
x: 0,
|
|
23
24
|
y: 0,
|
|
24
25
|
textAnchor: "middle",
|
|
25
26
|
alignmentBaseline: "middle",
|
|
26
27
|
children: label
|
|
27
28
|
}) : null,
|
|
28
|
-
isHalfPie && label ? /* @__PURE__ */ jsx(
|
|
29
|
+
isHalfPie && label ? /* @__PURE__ */ jsx(StyledInnerText, {
|
|
29
30
|
x: 0,
|
|
30
31
|
y: -innerRadius / 4,
|
|
31
32
|
textAnchor: "middle",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../scripts/build/transpile/react-shim.js", "../../../src/parts/Pie.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext } from 'react';\nimport { Slice } from './Slice';\nimport { PieContext } from '../PieContext';\
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,kBAAkB;AAClC,SAAS,aAAa;AACtB,SAAS,kBAAkB;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import React, { useContext } from 'react';\nimport { Slice } from './Slice';\nimport { PieContext } from '../PieContext';\nimport { StyledInnerText } from '../styles';\nexport const Pie = () => {\n const {\n innerHeight,\n innerWidth,\n pieData,\n\n props: { isHalfPie, label, innerRadius },\n } = useContext(PieContext);\n\n const radius = Math.min(innerWidth, innerHeight) / 2;\n\n const currentInnerHeight = isHalfPie ? innerHeight : innerHeight / 2;\n return (\n <g transform={`translate(${innerWidth / 2},${currentInnerHeight})`}>\n {pieData.map((slice) => (\n <Slice key={slice.index} data={slice} />\n ))}\n {!isHalfPie && label ? (\n <StyledInnerText x={0} y={0} textAnchor=\"middle\" alignmentBaseline=\"middle\">\n {label}\n </StyledInnerText>\n ) : null}\n {isHalfPie && label ? (\n <StyledInnerText x={0} y={-innerRadius / 4} textAnchor=\"middle\" alignmentBaseline=\"middle\">\n {label}\n </StyledInnerText>\n ) : null}\n </g>\n );\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB;AAAA,SAAgB,kBAAkB;AAClC,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AACzB,MAAM,MAAM,MAAM;AACvB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IAEA,OAAO,EAAE,WAAW,OAAO,YAAY;AAAA,EACzC,IAAI,WAAW,UAAU;AAEzB,QAAM,SAAS,KAAK,IAAI,YAAY,WAAW,IAAI;AAEnD,QAAM,qBAAqB,YAAY,cAAc,cAAc;AACnE,SACE,qBAAC;AAAA,IAAE,WAAW,aAAa,aAAa,KAAK;AAAA,IAC1C;AAAA,cAAQ,IAAI,CAAC,UACZ,oBAAC;AAAA,QAAwB,MAAM;AAAA,SAAnB,MAAM,KAAoB,CACvC;AAAA,MACA,CAAC,aAAa,QACb,oBAAC;AAAA,QAAgB,GAAG;AAAA,QAAG,GAAG;AAAA,QAAG,YAAW;AAAA,QAAS,mBAAkB;AAAA,QAChE;AAAA,OACH,IACE;AAAA,MACH,aAAa,QACZ,oBAAC;AAAA,QAAgB,GAAG;AAAA,QAAG,GAAG,CAAC,cAAc;AAAA,QAAG,YAAW;AAAA,QAAS,mBAAkB;AAAA,QAC/E;AAAA,OACH,IACE;AAAA;AAAA,GACN;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/esm/parts/Slice.js
CHANGED
|
@@ -1,70 +1,85 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useEffect, useMemo, useRef, useContext } from "react";
|
|
3
|
+
import { useState, useEffect, useCallback, useMemo, useRef, useContext } from "react";
|
|
4
4
|
import { arc, select } from "d3";
|
|
5
|
+
import { DSPopperJS } from "@elliemae/ds-popperjs";
|
|
5
6
|
import { PieContext } from "../PieContext";
|
|
6
|
-
import {
|
|
7
|
+
import { COLOR_PALLET } from "../helpers/colorPallet";
|
|
8
|
+
import { StyledTooltipContainer, StyledMouseOverDetectionBox } from "../styles";
|
|
7
9
|
const Slice = ({ data }) => {
|
|
8
10
|
const {
|
|
9
11
|
innerHeight,
|
|
10
12
|
innerWidth,
|
|
11
13
|
activeSerie,
|
|
12
14
|
setActiveSerie,
|
|
13
|
-
props: { series, innerRadius
|
|
15
|
+
props: { series, innerRadius, isHalfPie, TooltipRenderer }
|
|
14
16
|
} = useContext(PieContext);
|
|
15
|
-
const [isTooltipShown, setIsTooltipShown] = useState(false);
|
|
16
|
-
const innerRadius = innerRadiusProp ?? 0;
|
|
17
|
-
const tooltipRef = useRef(null);
|
|
18
17
|
const arcRef = useRef(null);
|
|
18
|
+
const arcFocusedRef = useRef(null);
|
|
19
19
|
const radius = isHalfPie ? Math.min(innerWidth, innerHeight) : Math.min(innerWidth, innerHeight) / 2;
|
|
20
|
-
const { startAngle, endAngle, index
|
|
20
|
+
const { startAngle, endAngle, index } = data;
|
|
21
21
|
const currentStartAngle = isHalfPie ? startAngle / 2 : startAngle;
|
|
22
22
|
const currentEndAngle = isHalfPie ? endAngle / 2 : endAngle;
|
|
23
23
|
const serieData = series?.find((serie) => serie.name === data.data[0]);
|
|
24
24
|
const { color, name } = serieData;
|
|
25
|
-
const sliceData =
|
|
25
|
+
const sliceData = useMemo(
|
|
26
|
+
() => arc().innerRadius(innerRadius ?? 0).outerRadius(radius).startAngle(currentStartAngle).endAngle(currentEndAngle)(),
|
|
27
|
+
[currentEndAngle, currentStartAngle, innerRadius, radius]
|
|
28
|
+
);
|
|
29
|
+
const sliceOver = useMemo(
|
|
30
|
+
() => arc().innerRadius(innerRadius ?? 0).outerRadius(radius + 5).startAngle(currentStartAngle).endAngle(currentEndAngle),
|
|
31
|
+
[currentEndAngle, currentStartAngle, innerRadius, radius]
|
|
32
|
+
);
|
|
26
33
|
const deltaAngle = currentStartAngle + (currentEndAngle - currentStartAngle) / 2;
|
|
27
34
|
const x = radius * Math.sin(deltaAngle);
|
|
28
35
|
const y = -radius * Math.cos(deltaAngle);
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
[activeSerie, index, isTooltipShown, name]
|
|
32
|
-
);
|
|
36
|
+
const isFocus = useMemo(() => activeSerie === `${name}-${index}`, [activeSerie, index, name]);
|
|
37
|
+
const [isHover, setIsHover] = useState(false);
|
|
33
38
|
useEffect(() => {
|
|
34
39
|
if (arcRef.current) {
|
|
35
|
-
select(arcRef.current).attr("d", sliceData
|
|
40
|
+
select(arcRef.current).attr("d", sliceData);
|
|
36
41
|
}
|
|
37
|
-
}, [sliceData]);
|
|
42
|
+
}, [sliceData, sliceOver]);
|
|
43
|
+
const [referenceElement, setReferenceElement] = useState();
|
|
44
|
+
const handleMouseEnter = useCallback(() => {
|
|
45
|
+
setActiveSerie(`${name}-${index}`);
|
|
46
|
+
setIsHover(true);
|
|
47
|
+
if (!isHalfPie)
|
|
48
|
+
select(arcRef.current).transition().attr("d", sliceOver).duration(300);
|
|
49
|
+
}, [index, isHalfPie, name, setActiveSerie, sliceOver]);
|
|
50
|
+
const handleOnMouseLeave = useCallback(() => {
|
|
51
|
+
setActiveSerie("");
|
|
52
|
+
setIsHover(false);
|
|
53
|
+
if (!isHalfPie)
|
|
54
|
+
select(arcRef.current).transition().attr("d", sliceData).duration(300);
|
|
55
|
+
}, [isHalfPie, setActiveSerie, sliceData]);
|
|
38
56
|
return /* @__PURE__ */ jsxs("g", {
|
|
39
|
-
onMouseEnter:
|
|
40
|
-
|
|
41
|
-
setIsTooltipShown(true);
|
|
42
|
-
},
|
|
43
|
-
onMouseLeave: (e) => {
|
|
44
|
-
setIsTooltipShown(false);
|
|
45
|
-
},
|
|
57
|
+
onMouseEnter: handleMouseEnter,
|
|
58
|
+
onMouseLeave: handleOnMouseLeave,
|
|
46
59
|
transform: isHalfPie ? "rotate(-90)" : "",
|
|
47
60
|
children: [
|
|
48
61
|
/* @__PURE__ */ jsx("path", {
|
|
49
62
|
ref: arcRef,
|
|
50
|
-
fill: color,
|
|
63
|
+
fill: COLOR_PALLET[color] ?? color,
|
|
51
64
|
stroke: "white"
|
|
52
65
|
}),
|
|
53
|
-
name !== "no-data" && TooltipRenderer && /* @__PURE__ */ jsx("foreignObject", {
|
|
66
|
+
name !== "no-data" && TooltipRenderer && isFocus && /* @__PURE__ */ jsx("foreignObject", {
|
|
54
67
|
x,
|
|
55
68
|
y,
|
|
56
|
-
children: /* @__PURE__ */ jsx(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
69
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
70
|
+
ref: setReferenceElement,
|
|
71
|
+
children: /* @__PURE__ */ jsxs(DSPopperJS, {
|
|
72
|
+
referenceElement,
|
|
73
|
+
showPopover: true,
|
|
74
|
+
zIndex: 3e3,
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ jsx(StyledTooltipContainer, {
|
|
77
|
+
children: /* @__PURE__ */ jsx(TooltipRenderer, {
|
|
78
|
+
data: serieData
|
|
79
|
+
})
|
|
80
|
+
}),
|
|
81
|
+
/* @__PURE__ */ jsx(StyledMouseOverDetectionBox, {})
|
|
82
|
+
]
|
|
68
83
|
})
|
|
69
84
|
})
|
|
70
85
|
})
|