victory-pie 36.8.2 → 36.8.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.
@@ -0,0 +1,117 @@
1
+ import React from "react";
2
+ import { Data, ColorScalePropType, EventPropTypeInterface, NumberOrCallback, OriginType, SliceNumberOrCallback, StringOrNumberOrCallback, VictoryCommonProps, VictoryLabelableProps, VictoryMultiLabelableProps, VictoryStyleInterface, EventsMixinClass, VictoryDatableProps } from "victory-core";
3
+ import { SliceProps, VictorySliceTTargetType, VictorySliceLabelPlacementType, VictorySliceLabelPositionType } from "./slice";
4
+ export interface VictoryPieProps extends Omit<VictoryCommonProps, "polar">, VictoryDatableProps, VictoryLabelableProps, VictoryMultiLabelableProps {
5
+ colorScale?: ColorScalePropType;
6
+ cornerRadius?: SliceNumberOrCallback<SliceProps, "cornerRadius">;
7
+ endAngle?: number;
8
+ events?: EventPropTypeInterface<VictorySliceTTargetType, StringOrNumberOrCallback | string[] | number[]>[];
9
+ eventKey?: StringOrNumberOrCallback;
10
+ innerRadius?: NumberOrCallback;
11
+ labelIndicator?: boolean | React.ReactElement;
12
+ labelIndicatorInnerOffset?: number;
13
+ labelIndicatorOuterOffset?: number;
14
+ labelPlacement?: VictorySliceLabelPlacementType | ((props: SliceProps) => VictorySliceLabelPlacementType);
15
+ labelPosition?: VictorySliceLabelPositionType | ((props: SliceProps) => VictorySliceLabelPositionType);
16
+ labelIndicatorComponent?: React.ReactElement;
17
+ labelRadius?: number | ((props: SliceProps) => number);
18
+ origin?: OriginType;
19
+ padAngle?: NumberOrCallback;
20
+ radius?: NumberOrCallback;
21
+ startAngle?: number;
22
+ style?: VictoryStyleInterface;
23
+ }
24
+ interface VictoryPieBase extends EventsMixinClass<VictoryPieProps> {
25
+ }
26
+ declare class VictoryPieBase extends React.Component<VictoryPieProps> {
27
+ static animationWhitelist: (keyof VictoryPieProps)[];
28
+ static displayName: string;
29
+ static role: string;
30
+ static defaultTransitions: {
31
+ onExit: {
32
+ duration: number;
33
+ before: () => {
34
+ _y: number;
35
+ label: string;
36
+ };
37
+ };
38
+ onEnter: {
39
+ duration: number;
40
+ before: () => {
41
+ _y: number;
42
+ label: string;
43
+ };
44
+ after: (datum: any) => {
45
+ y_: any;
46
+ label: any;
47
+ };
48
+ };
49
+ };
50
+ static defaultProps: VictoryPieProps;
51
+ static getBaseProps: (props: VictoryPieProps) => any;
52
+ static getData: typeof Data.getData;
53
+ static expectedComponents: (keyof VictoryPieProps)[];
54
+ shouldAnimate(): boolean;
55
+ renderComponents(props: VictoryPieProps, shouldRenderDatum?: (datum: any) => boolean): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
56
+ render(): React.ReactElement;
57
+ }
58
+ export declare const VictoryPie: {
59
+ new (props: import("victory-core").EventMixinCommonProps): {
60
+ state: {};
61
+ getEventState: (eventKey: string | number, namespace: string, childType?: string | undefined) => any;
62
+ getScopedEvents: (events: any, namespace: any, childType: any, baseProps: any) => {};
63
+ getEvents: (p: any, target: any, eventKey: any) => any;
64
+ externalMutations: {} | undefined;
65
+ calculatedState: {};
66
+ globalEvents: {};
67
+ prevGlobalEventKeys: string[];
68
+ boundGlobalEvents: {};
69
+ shouldComponentUpdate(nextProps: import("victory-core").EventMixinCommonProps): boolean;
70
+ componentDidMount(): void;
71
+ componentDidUpdate(prevProps: any): void;
72
+ componentWillUnmount(): void;
73
+ addGlobalListener(key: any): void;
74
+ removeGlobalListener(key: any): void;
75
+ getStateChanges(props: any): {};
76
+ applyExternalMutations(props: any, externalMutations: any): void;
77
+ getCalculatedValues(props: any): import("victory-core").EventMixinCalculatedValues;
78
+ getExternalMutations(props: import("victory-core").EventMixinCommonProps): {} | undefined;
79
+ cacheValues(obj: any): void;
80
+ getBaseProps(props: any, getSharedEventState: any): Record<string, object>;
81
+ getAllEvents(props: any): any;
82
+ getComponentProps(component: React.ReactNode, type: string, index: string | number): any;
83
+ renderContainer(component: any, children: any): React.DetailedReactHTMLElement<any, HTMLElement>;
84
+ animateComponent(props: import("victory-core").EventMixinCommonProps, defaultAnimationWhitelist: string[]): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
85
+ renderContinuousData(props: import("victory-core").EventMixinCommonProps): React.DetailedReactHTMLElement<any, HTMLElement>;
86
+ renderData(props: any, shouldRenderDatum?: ((datum: any) => boolean) | undefined): React.DetailedReactHTMLElement<any, HTMLElement>;
87
+ context: unknown;
88
+ setState<K extends never>(state: {} | ((prevState: Readonly<{}>, props: Readonly<import("victory-core").EventMixinCommonProps>) => {} | Pick<{}, K> | null) | Pick<{}, K> | null, callback?: (() => void) | undefined): void;
89
+ forceUpdate(callback?: (() => void) | undefined): void;
90
+ render(): React.ReactNode;
91
+ readonly props: Readonly<import("victory-core").EventMixinCommonProps>;
92
+ refs: {
93
+ [key: string]: React.ReactInstance;
94
+ };
95
+ componentDidCatch?(error: Error, errorInfo: React.ErrorInfo): void;
96
+ getSnapshotBeforeUpdate?(prevProps: Readonly<import("victory-core").EventMixinCommonProps>, prevState: Readonly<{}>): any;
97
+ componentWillMount?(): void;
98
+ UNSAFE_componentWillMount?(): void;
99
+ componentWillReceiveProps?(nextProps: Readonly<import("victory-core").EventMixinCommonProps>, nextContext: any): void;
100
+ UNSAFE_componentWillReceiveProps?(nextProps: Readonly<import("victory-core").EventMixinCommonProps>, nextContext: any): void;
101
+ componentWillUpdate?(nextProps: Readonly<import("victory-core").EventMixinCommonProps>, nextState: Readonly<{}>, nextContext: any): void;
102
+ UNSAFE_componentWillUpdate?(nextProps: Readonly<import("victory-core").EventMixinCommonProps>, nextState: Readonly<{}>, nextContext: any): void;
103
+ componentEvents: import("victory-core/lib/victory-util/events").ComponentEvent[];
104
+ getSharedEventState: (key: string, value: string) => unknown;
105
+ baseProps: Record<string, object>;
106
+ dataKeys: string[];
107
+ hasEvents: unknown;
108
+ events: unknown;
109
+ };
110
+ getBaseProps?(props: import("victory-core").EventMixinCommonProps): Record<string, object>;
111
+ role?: string | undefined;
112
+ expectedComponents?: string[] | undefined;
113
+ getChildren?: ((props: import("victory-core").EventMixinCommonProps, childComponents?: React.ReactNode[] | undefined, calculatedProps?: import("victory-core").EventMixinCommonProps | undefined) => void) | undefined;
114
+ animationWhitelist?: string[] | undefined;
115
+ } & typeof VictoryPieBase;
116
+ export {};
117
+ //# sourceMappingURL=victory-pie.d.ts.map
@@ -3,20 +3,32 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.VictoryPie = void 0;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _isNil2 = _interopRequireDefault(require("lodash/isNil"));
9
9
 
10
- var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _react = _interopRequireDefault(require("react"));
11
11
 
12
12
  var _victoryCore = require("victory-core");
13
13
 
14
- var _slice = _interopRequireDefault(require("./slice"));
15
-
16
14
  var _helperMethods = require("./helper-methods");
17
15
 
16
+ var _slice = require("./slice");
17
+
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
19
 
20
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
21
+
22
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
23
+
24
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
25
+
26
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
27
+
28
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
29
+
30
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
31
+
20
32
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
21
33
 
22
34
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -47,26 +59,98 @@ var fallbackProps = {
47
59
  width: 400,
48
60
  startAngle: 0,
49
61
  colorScale: ["#ffffff", "#f0f0f0", "#d9d9d9", "#bdbdbd", "#969696", "#737373", "#525252", "#252525", "#000000"],
50
- labelPosition: "centroid"
62
+ labelPosition: "centroid",
63
+ labelIndicatorInnerOffset: 15,
64
+ labelIndicatorOuterOffset: 5
51
65
  };
52
66
 
53
- var VictoryPie = /*#__PURE__*/function (_React$Component) {
54
- _inherits(VictoryPie, _React$Component);
67
+ var datumHasXandY = function (datum) {
68
+ return !(0, _isNil2.default)(datum._x) && !(0, _isNil2.default)(datum._y);
69
+ }; // eslint-disable-next-line @typescript-eslint/no-empty-interface
70
+
55
71
 
56
- var _super = _createSuper(VictoryPie);
72
+ var VictoryPieBase = /*#__PURE__*/function (_React$Component) {
73
+ _inherits(VictoryPieBase, _React$Component);
57
74
 
58
- function VictoryPie() {
59
- _classCallCheck(this, VictoryPie);
75
+ var _super = _createSuper(VictoryPieBase);
76
+
77
+ function VictoryPieBase() {
78
+ _classCallCheck(this, VictoryPieBase);
60
79
 
61
80
  return _super.apply(this, arguments);
62
81
  }
63
82
 
64
- _createClass(VictoryPie, [{
83
+ _createClass(VictoryPieBase, [{
65
84
  key: "shouldAnimate",
66
85
  value: // Overridden in victory-native
67
86
  function shouldAnimate() {
68
87
  return Boolean(this.props.animate);
69
88
  }
89
+ }, {
90
+ key: "renderComponents",
91
+ value: function renderComponents(props) {
92
+ var _this = this;
93
+
94
+ var shouldRenderDatum = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : datumHasXandY;
95
+ var dataComponent = props.dataComponent,
96
+ labelComponent = props.labelComponent,
97
+ groupComponent = props.groupComponent,
98
+ labelIndicator = props.labelIndicator,
99
+ labelPosition = props.labelPosition;
100
+
101
+ if (!groupComponent) {
102
+ throw new Error("VictoryPie expects a groupComponent prop");
103
+ }
104
+
105
+ var showIndicator = labelIndicator && labelPosition === "centroid";
106
+ var children = [];
107
+
108
+ if (dataComponent) {
109
+ var dataComponents = this.dataKeys.reduce(function (validDataComponents, _dataKey, index) {
110
+ var dataProps = _this.getComponentProps(dataComponent, "data", index);
111
+
112
+ if (shouldRenderDatum(dataProps.datum)) {
113
+ validDataComponents.push( /*#__PURE__*/_react.default.cloneElement(dataComponent, dataProps));
114
+ }
115
+
116
+ return validDataComponents;
117
+ }, []);
118
+ children.push.apply(children, _toConsumableArray(dataComponents));
119
+ }
120
+
121
+ if (labelComponent) {
122
+ var labelComponents = this.dataKeys.map(function (_dataKey, index) {
123
+ var labelProps = _this.getComponentProps(labelComponent, "labels", index);
124
+
125
+ if (labelProps.text !== undefined && labelProps.text !== null) {
126
+ return /*#__PURE__*/_react.default.cloneElement(labelComponent, labelProps);
127
+ }
128
+
129
+ return undefined;
130
+ }).filter(function (comp) {
131
+ return comp !== undefined;
132
+ });
133
+ children.push.apply(children, _toConsumableArray(labelComponents));
134
+ }
135
+
136
+ if (showIndicator && labelIndicator) {
137
+ var labelIndicatorComponent = /*#__PURE__*/_react.default.createElement(_victoryCore.LineSegment, null);
138
+
139
+ if (typeof labelIndicator === "object") {
140
+ // pass user provided react component
141
+ labelIndicatorComponent = labelIndicator;
142
+ }
143
+
144
+ var labelIndicatorComponents = this.dataKeys.map(function (_dataKey, index) {
145
+ var labelIndicatorProps = _this.getComponentProps(labelIndicatorComponent, "labelIndicators", index);
146
+
147
+ return /*#__PURE__*/_react.default.cloneElement(labelIndicatorComponent, labelIndicatorProps);
148
+ });
149
+ children.push.apply(children, _toConsumableArray(labelIndicatorComponents));
150
+ }
151
+
152
+ return this.renderContainer(groupComponent, children);
153
+ }
70
154
  }, {
71
155
  key: "render",
72
156
  value: function render() {
@@ -79,19 +163,19 @@ var VictoryPie = /*#__PURE__*/function (_React$Component) {
79
163
  return this.animateComponent(props, animationWhitelist);
80
164
  }
81
165
 
82
- var children = this.renderData(props);
166
+ var children = this.renderComponents(props);
83
167
  var component = props.standalone ? this.renderContainer(props.containerComponent, children) : children;
84
168
  return _victoryCore.UserProps.withSafeUserProps(component, props);
85
169
  }
86
170
  }]);
87
171
 
88
- return VictoryPie;
172
+ return VictoryPieBase;
89
173
  }(_react.default.Component);
90
174
 
91
- VictoryPie.animationWhitelist = ["data", "endAngle", "height", "innerRadius", "cornerRadius", "padAngle", "padding", "colorScale", "startAngle", "style", "width"];
92
- VictoryPie.displayName = "VictoryPie";
93
- VictoryPie.role = "pie";
94
- VictoryPie.defaultTransitions = {
175
+ VictoryPieBase.animationWhitelist = ["data", "endAngle", "height", "innerRadius", "cornerRadius", "padAngle", "padding", "colorScale", "startAngle", "style", "width"];
176
+ VictoryPieBase.displayName = "VictoryPie";
177
+ VictoryPieBase.role = "pie";
178
+ VictoryPieBase.defaultTransitions = {
95
179
  onExit: {
96
180
  duration: 500,
97
181
  before: function () {
@@ -117,68 +201,7 @@ VictoryPie.defaultTransitions = {
117
201
  }
118
202
  }
119
203
  };
120
- VictoryPie.propTypes = {
121
- animate: _propTypes.default.oneOfType([_propTypes.default.bool, _propTypes.default.object]),
122
- colorScale: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.string), _propTypes.default.oneOf(["grayscale", "qualitative", "heatmap", "warm", "cool", "red", "green", "blue"])]),
123
- containerComponent: _propTypes.default.element,
124
- cornerRadius: _propTypes.default.oneOfType([_victoryCore.PropTypes.nonNegative, _propTypes.default.func]),
125
- data: _propTypes.default.array,
126
- dataComponent: _propTypes.default.element,
127
- disableInlineStyes: _propTypes.default.bool,
128
- endAngle: _propTypes.default.number,
129
- eventKey: _propTypes.default.oneOfType([_propTypes.default.func, _victoryCore.PropTypes.allOfType([_victoryCore.PropTypes.integer, _victoryCore.PropTypes.nonNegative]), _propTypes.default.string]),
130
- events: _propTypes.default.arrayOf(_propTypes.default.shape({
131
- target: _propTypes.default.oneOf(["data", "labels", "parent"]),
132
- eventKey: _propTypes.default.oneOfType([_propTypes.default.array, _propTypes.default.func, _victoryCore.PropTypes.allOfType([_victoryCore.PropTypes.integer, _victoryCore.PropTypes.nonNegative]), _propTypes.default.string]),
133
- eventHandlers: _propTypes.default.object
134
- })),
135
- externalEventMutations: _propTypes.default.arrayOf(_propTypes.default.shape({
136
- callback: _propTypes.default.func,
137
- childName: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.array]),
138
- eventKey: _propTypes.default.oneOfType([_propTypes.default.array, _victoryCore.PropTypes.allOfType([_victoryCore.PropTypes.integer, _victoryCore.PropTypes.nonNegative]), _propTypes.default.string]),
139
- mutation: _propTypes.default.func,
140
- target: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.array])
141
- })),
142
- groupComponent: _propTypes.default.element,
143
- height: _victoryCore.PropTypes.nonNegative,
144
- innerRadius: _propTypes.default.oneOfType([_victoryCore.PropTypes.nonNegative, _propTypes.default.func]),
145
- labelComponent: _propTypes.default.element,
146
- labelPlacement: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.oneOf(["parallel", "perpendicular", "vertical"])]),
147
- labelPosition: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.oneOf(["startAngle", "centroid", "endAngle"])]),
148
- labelRadius: _propTypes.default.oneOfType([_victoryCore.PropTypes.nonNegative, _propTypes.default.func]),
149
- labels: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.array]),
150
- name: _propTypes.default.string,
151
- origin: _propTypes.default.shape({
152
- x: _victoryCore.PropTypes.nonNegative,
153
- y: _victoryCore.PropTypes.nonNegative
154
- }),
155
- padAngle: _propTypes.default.oneOfType([_victoryCore.PropTypes.nonNegative, _propTypes.default.func]),
156
- padding: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
157
- top: _propTypes.default.number,
158
- bottom: _propTypes.default.number,
159
- left: _propTypes.default.number,
160
- right: _propTypes.default.number
161
- })]),
162
- radius: _propTypes.default.oneOfType([_victoryCore.PropTypes.nonNegative, _propTypes.default.func]),
163
- sharedEvents: _propTypes.default.shape({
164
- events: _propTypes.default.array,
165
- getEventState: _propTypes.default.func
166
- }),
167
- sortKey: _propTypes.default.oneOfType([_propTypes.default.func, _victoryCore.PropTypes.allOfType([_victoryCore.PropTypes.integer, _victoryCore.PropTypes.nonNegative]), _propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
168
- sortOrder: _propTypes.default.oneOf(["ascending", "descending"]),
169
- standalone: _propTypes.default.bool,
170
- startAngle: _propTypes.default.number,
171
- style: _propTypes.default.shape({
172
- parent: _propTypes.default.object,
173
- data: _propTypes.default.object,
174
- labels: _propTypes.default.object
175
- }),
176
- theme: _propTypes.default.object,
177
- width: _victoryCore.PropTypes.nonNegative,
178
- x: _propTypes.default.oneOfType([_propTypes.default.func, _victoryCore.PropTypes.allOfType([_victoryCore.PropTypes.integer, _victoryCore.PropTypes.nonNegative]), _propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)]),
179
- y: _propTypes.default.oneOfType([_propTypes.default.func, _victoryCore.PropTypes.allOfType([_victoryCore.PropTypes.integer, _victoryCore.PropTypes.nonNegative]), _propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.string)])
180
- };
181
- VictoryPie.defaultProps = {
204
+ VictoryPieBase.defaultProps = {
182
205
  data: [{
183
206
  x: "A",
184
207
  y: 1
@@ -196,7 +219,7 @@ VictoryPie.defaultProps = {
196
219
  y: 2
197
220
  }],
198
221
  standalone: true,
199
- dataComponent: /*#__PURE__*/_react.default.createElement(_slice.default, null),
222
+ dataComponent: /*#__PURE__*/_react.default.createElement(_slice.Slice, null),
200
223
  labelComponent: /*#__PURE__*/_react.default.createElement(_victoryCore.VictoryLabel, null),
201
224
  containerComponent: /*#__PURE__*/_react.default.createElement(_victoryCore.VictoryContainer, null),
202
225
  groupComponent: /*#__PURE__*/_react.default.createElement("g", null),
@@ -204,13 +227,11 @@ VictoryPie.defaultProps = {
204
227
  theme: _victoryCore.VictoryTheme.grayscale
205
228
  };
206
229
 
207
- VictoryPie.getBaseProps = function (props) {
230
+ VictoryPieBase.getBaseProps = function (props) {
208
231
  return (0, _helperMethods.getBaseProps)(props, fallbackProps);
209
232
  };
210
233
 
211
- VictoryPie.getData = _victoryCore.Data.getData;
212
- VictoryPie.expectedComponents = ["dataComponent", "labelComponent", "groupComponent", "containerComponent"];
213
-
214
- var _default = (0, _victoryCore.addEvents)(VictoryPie);
215
-
216
- exports.default = _default;
234
+ VictoryPieBase.getData = _victoryCore.Data.getData;
235
+ VictoryPieBase.expectedComponents = ["dataComponent", "labelComponent", "groupComponent", "containerComponent", "labelIndicatorComponent"];
236
+ var VictoryPie = (0, _victoryCore.addEvents)(VictoryPieBase);
237
+ exports.VictoryPie = VictoryPie;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "victory-pie",
3
- "version": "36.8.2",
3
+ "version": "36.8.3",
4
4
  "description": "Pie Component for Victory",
5
5
  "keywords": [
6
6
  "data visualization",
@@ -22,8 +22,8 @@
22
22
  "dependencies": {
23
23
  "lodash": "^4.17.19",
24
24
  "prop-types": "^15.8.1",
25
- "victory-core": "^36.8.2",
26
- "victory-vendor": "^36.8.2"
25
+ "victory-core": "^36.8.3",
26
+ "victory-vendor": "^36.8.3"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "react": ">=16.6.0"
@@ -53,7 +53,7 @@ const getSlices = (props, data) => {
53
53
  .startAngle(Helpers.degreesToRadians(props.startAngle))
54
54
  .endAngle(Helpers.degreesToRadians(props.endAngle))
55
55
  .padAngle(Helpers.degreesToRadians(padAngle))
56
- .value((datum) => {
56
+ .value((datum: any) => {
57
57
  return datum._y;
58
58
  });
59
59
  return layoutFunction(data);
@@ -62,7 +62,7 @@ const getSlices = (props, data) => {
62
62
  const getCalculatedValues = (props) => {
63
63
  const { colorScale } = props;
64
64
  const styleObject = Helpers.getDefaultStyles(props, "pie");
65
- const style = Helpers.getStyles(props.style, styleObject, "auto", "100%");
65
+ const style = Helpers.getStyles(props.style, styleObject);
66
66
  const colors = Array.isArray(colorScale)
67
67
  ? colorScale
68
68
  : Style.getColorScale(colorScale);
@@ -100,10 +100,13 @@ const getLabelText = (props, datum, index) => {
100
100
  return checkForValidText(text);
101
101
  };
102
102
 
103
- const getLabelArc = (radius, labelRadius, style) => {
103
+ const getLabelArc = (labelRadius) => {
104
+ return d3Shape.arc().outerRadius(labelRadius).innerRadius(labelRadius);
105
+ };
106
+
107
+ const getCalculatedLabelRadius = (radius, labelRadius, style) => {
104
108
  const padding = (style && style.padding) || 0;
105
- const arcRadius = labelRadius || radius + padding;
106
- return d3Shape.arc().outerRadius(arcRadius).innerRadius(arcRadius);
109
+ return labelRadius || radius + padding;
107
110
  };
108
111
 
109
112
  const getLabelPosition = (arc, slice, position) => {
@@ -195,7 +198,12 @@ const getLabelProps = (text, dataProps, calculatedValues) => {
195
198
  labelStyle,
196
199
  assign({ labelRadius, text }, dataProps),
197
200
  );
198
- const labelArc = getLabelArc(defaultRadius, labelRadius, evaluatedStyle);
201
+ const calculatedLabelRadius = getCalculatedLabelRadius(
202
+ defaultRadius,
203
+ labelRadius,
204
+ evaluatedStyle,
205
+ );
206
+ const labelArc = getLabelArc(calculatedLabelRadius);
199
207
  const position = getLabelPosition(labelArc, slice, labelPosition);
200
208
  const baseAngle = getBaseLabelAngle(slice, labelPosition, labelStyle);
201
209
  const labelAngle = getLabelAngle(baseAngle, labelPlacement);
@@ -219,6 +227,7 @@ const getLabelProps = (text, dataProps, calculatedValues) => {
219
227
  textAnchor,
220
228
  verticalAnchor,
221
229
  angle: labelAngle,
230
+ calculatedLabelRadius,
222
231
  };
223
232
 
224
233
  if (!Helpers.isTooltip(labelComponent)) {
@@ -228,8 +237,59 @@ const getLabelProps = (text, dataProps, calculatedValues) => {
228
237
  return defaults({}, labelProps, Helpers.omit(tooltipTheme, ["style"]));
229
238
  };
230
239
 
231
- export const getBaseProps = (props, fallbackProps) => {
232
- props = Helpers.modifyProps(props, fallbackProps, "pie");
240
+ export const getXOffsetMultiplayerByAngle = (angle) =>
241
+ Math.cos(angle - Helpers.degreesToRadians(90));
242
+ export const getYOffsetMultiplayerByAngle = (angle) =>
243
+ Math.sin(angle - Helpers.degreesToRadians(90));
244
+ export const getXOffset = (offset, angle) =>
245
+ offset * getXOffsetMultiplayerByAngle(angle);
246
+ export const getYOffset = (offset, angle) =>
247
+ offset * getYOffsetMultiplayerByAngle(angle);
248
+ export const getAverage = (array) =>
249
+ array.reduce((acc, cur) => acc + cur, 0) / array.length;
250
+
251
+ export const getLabelIndicatorPropsForLineSegment = (
252
+ props,
253
+ calculatedValues,
254
+ labelProps,
255
+ ) => {
256
+ const {
257
+ innerRadius,
258
+ radius,
259
+ slice: { startAngle, endAngle },
260
+ labelIndicatorInnerOffset,
261
+ labelIndicatorOuterOffset,
262
+ index,
263
+ } = props;
264
+
265
+ const { height, width } = calculatedValues;
266
+ const { calculatedLabelRadius } = labelProps;
267
+ // calculation
268
+ const middleRadius = getAverage([innerRadius, radius]);
269
+ const midAngle = getAverage([endAngle, startAngle]);
270
+ const centerX = width / 2;
271
+ const centerY = height / 2;
272
+ const innerOffset = middleRadius + labelIndicatorInnerOffset;
273
+ const outerOffset = calculatedLabelRadius - labelIndicatorOuterOffset;
274
+
275
+ const x1 = centerX + getXOffset(innerOffset, midAngle);
276
+ const y1 = centerY + getYOffset(innerOffset, midAngle);
277
+
278
+ const x2 = centerX + getXOffset(outerOffset, midAngle);
279
+ const y2 = centerY + getYOffset(outerOffset, midAngle);
280
+
281
+ const labelIndicatorProps = {
282
+ x1,
283
+ y1,
284
+ x2,
285
+ y2,
286
+ index,
287
+ };
288
+ return defaults({}, labelIndicatorProps);
289
+ };
290
+
291
+ export const getBaseProps = (initialProps, fallbackProps) => {
292
+ const props = Helpers.modifyProps(initialProps, fallbackProps, "pie");
233
293
  const calculatedValues = getCalculatedValues(props);
234
294
  const {
235
295
  slices,
@@ -248,6 +308,7 @@ export const getBaseProps = (props, fallbackProps) => {
248
308
  cornerRadius,
249
309
  padAngle,
250
310
  disableInlineStyles,
311
+ labelIndicator,
251
312
  } = calculatedValues;
252
313
  const radius = props.radius || defaultRadius;
253
314
  const initialChildProps = {
@@ -288,6 +349,17 @@ export const getBaseProps = (props, fallbackProps) => {
288
349
  assign({}, props, dataProps),
289
350
  calculatedValues,
290
351
  );
352
+ if (labelIndicator) {
353
+ const labelProps = childProps[eventKey].labels;
354
+ if (labelProps.calculatedLabelRadius > radius) {
355
+ childProps[eventKey].labelIndicators =
356
+ getLabelIndicatorPropsForLineSegment(
357
+ assign({}, props, dataProps),
358
+ calculatedValues,
359
+ labelProps,
360
+ );
361
+ }
362
+ }
291
363
  }
292
364
  return childProps;
293
365
  }, initialChildProps);
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./victory-pie";
2
+ export * from "./slice";
@@ -1,9 +1,51 @@
1
1
  import React from "react";
2
2
  import PropTypes from "prop-types";
3
- import { Helpers, CommonProps, Path } from "victory-core";
3
+ import {
4
+ Helpers,
5
+ CommonProps,
6
+ Path,
7
+ NumberOrCallback,
8
+ SliceNumberOrCallback,
9
+ StringOrCallback,
10
+ VictoryCommonProps,
11
+ VictoryStyleInterface,
12
+ } from "victory-core";
4
13
  import { defaults, isFunction, assign } from "lodash";
5
14
  import * as d3Shape from "victory-vendor/d3-shape";
6
15
 
16
+ export type VictorySliceLabelPositionType =
17
+ | "startAngle"
18
+ | "centroid"
19
+ | "endAngle";
20
+ export type VictorySliceLabelPlacementType =
21
+ | "vertical"
22
+ | "parallel"
23
+ | "perpendicular";
24
+ export type VictorySliceTTargetType = "data" | "labels" | "parent";
25
+
26
+ export interface SliceProps extends VictoryCommonProps {
27
+ ariaLabel?: StringOrCallback;
28
+ cornerRadius?: SliceNumberOrCallback<SliceProps, "cornerRadius">;
29
+ datum?: any;
30
+ innerRadius?: NumberOrCallback;
31
+ padAngle?: SliceNumberOrCallback<SliceProps, "padAngle">;
32
+ pathComponent?: React.ReactElement;
33
+ pathFunction?: (props: SliceProps) => string;
34
+ radius?: SliceNumberOrCallback<SliceProps, "radius">;
35
+ slice?: {
36
+ startAngle?: number;
37
+ endAngle?: number;
38
+ padAngle?: number;
39
+ data?: any[];
40
+ };
41
+ sliceEndAngle?: SliceNumberOrCallback<SliceProps, "sliceEndAngle">;
42
+ sliceStartAngle?: SliceNumberOrCallback<SliceProps, "sliceStartAngle">;
43
+ style?: VictoryStyleInterface;
44
+ tabIndex?: NumberOrCallback;
45
+ role?: string;
46
+ shapeRendering?: string;
47
+ }
48
+
7
49
  const getPath = (props) => {
8
50
  const { slice, radius, innerRadius, cornerRadius } = props;
9
51
  if (isFunction(props.pathFunction)) {
@@ -68,14 +110,14 @@ const evaluateProps = (props) => {
68
110
  });
69
111
  };
70
112
 
71
- const defaultProps = {
113
+ const defaultProps: SliceProps = {
72
114
  pathComponent: <Path />,
73
115
  role: "presentation",
74
116
  shapeRendering: "auto",
75
117
  };
76
118
 
77
- const Slice = (props) => {
78
- props = evaluateProps({ ...defaultProps, ...props });
119
+ export const Slice = (initialProps: SliceProps) => {
120
+ const props = evaluateProps({ ...defaultProps, ...initialProps });
79
121
  const defaultTransform = props.origin
80
122
  ? `translate(${props.origin.x}, ${props.origin.y})`
81
123
  : undefined;
@@ -107,5 +149,3 @@ Slice.propTypes = {
107
149
  sliceEndAngle: PropTypes.oneOfType([PropTypes.number, PropTypes.func]),
108
150
  sliceStartAngle: PropTypes.oneOfType([PropTypes.number, PropTypes.func]),
109
151
  };
110
-
111
- export default Slice;