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.
- package/CHANGELOG.md +6 -0
- package/dist/victory-pie.js +487 -224
- package/dist/victory-pie.min.js +1 -1
- package/es/helper-methods.d.ts +14 -0
- package/es/helper-methods.js +72 -9
- package/es/index.d.ts +3 -83
- package/es/index.js +2 -2
- package/es/slice.d.ts +62 -0
- package/es/slice.js +3 -6
- package/es/victory-pie.d.ts +117 -0
- package/es/victory-pie.js +106 -83
- package/lib/helper-methods.d.ts +14 -0
- package/lib/helper-methods.js +92 -10
- package/lib/index.d.ts +3 -83
- package/lib/index.js +23 -15
- package/lib/slice.d.ts +62 -0
- package/lib/slice.js +5 -6
- package/lib/victory-pie.d.ts +117 -0
- package/lib/victory-pie.js +109 -88
- package/package.json +3 -3
- package/src/{helper-methods.js → helper-methods.ts} +80 -8
- package/src/index.ts +2 -0
- package/src/{slice.js → slice.tsx} +46 -6
- package/src/victory-pie.tsx +269 -0
- package/src/index.d.ts +0 -83
- package/src/index.js +0 -2
- package/src/victory-pie.js +0 -268
|
@@ -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
|
package/lib/victory-pie.js
CHANGED
|
@@ -3,20 +3,32 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports.VictoryPie = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _isNil2 = _interopRequireDefault(require("lodash/isNil"));
|
|
9
9
|
|
|
10
|
-
var
|
|
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
|
|
54
|
-
|
|
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
|
-
|
|
72
|
+
var VictoryPieBase = /*#__PURE__*/function (_React$Component) {
|
|
73
|
+
_inherits(VictoryPieBase, _React$Component);
|
|
57
74
|
|
|
58
|
-
|
|
59
|
-
|
|
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(
|
|
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.
|
|
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
|
|
172
|
+
return VictoryPieBase;
|
|
89
173
|
}(_react.default.Component);
|
|
90
174
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
230
|
+
VictoryPieBase.getBaseProps = function (props) {
|
|
208
231
|
return (0, _helperMethods.getBaseProps)(props, fallbackProps);
|
|
209
232
|
};
|
|
210
233
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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.
|
|
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.
|
|
26
|
-
"victory-vendor": "^36.8.
|
|
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
|
|
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 = (
|
|
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
|
-
|
|
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
|
|
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
|
|
232
|
-
|
|
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
|
@@ -1,9 +1,51 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import PropTypes from "prop-types";
|
|
3
|
-
import {
|
|
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 = (
|
|
78
|
-
props = evaluateProps({ ...defaultProps, ...
|
|
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;
|