victory-core 36.8.2 → 36.8.4
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 +14 -0
- package/dist/victory-core.js +181 -159
- package/dist/victory-core.min.js +1 -1
- package/es/types/callbacks.d.ts +4 -4
- package/es/victory-animation/util.d.ts +3 -3
- package/es/victory-animation/util.js +5 -3
- package/es/victory-animation/victory-animation.js +2 -2
- package/es/victory-label/victory-label.d.ts +1 -1
- package/es/victory-label/victory-label.js +7 -11
- package/es/victory-primitives/arc.d.ts +1 -1
- package/es/victory-primitives/arc.js +2 -2
- package/es/victory-primitives/background.d.ts +1 -1
- package/es/victory-primitives/background.js +2 -2
- package/es/victory-primitives/border.d.ts +1 -1
- package/es/victory-primitives/border.js +2 -2
- package/es/victory-primitives/line-segment.d.ts +1 -1
- package/es/victory-primitives/line-segment.js +2 -2
- package/es/victory-primitives/point.d.ts +1 -1
- package/es/victory-primitives/point.js +2 -2
- package/es/victory-primitives/whisker.d.ts +1 -1
- package/es/victory-primitives/whisker.js +16 -17
- package/es/victory-util/add-events.js +7 -6
- package/es/victory-util/axis.js +2 -2
- package/es/victory-util/common-props.d.ts +1 -0
- package/es/victory-util/data.js +14 -9
- package/es/victory-util/domain.js +15 -15
- package/es/victory-util/events.d.ts +3 -3
- package/es/victory-util/events.js +17 -20
- package/es/victory-util/helpers.js +5 -5
- package/es/victory-util/immutable.js +4 -2
- package/es/victory-util/label-helpers.d.ts +1 -1
- package/es/victory-util/label-helpers.js +11 -12
- package/es/victory-util/selection.js +1 -2
- package/es/victory-util/timer.js +1 -2
- package/es/victory-util/transitions.js +37 -26
- package/es/victory-util/user-props.d.ts +6 -0
- package/es/victory-util/user-props.js +12 -1
- package/es/victory-util/wrapper.js +14 -14
- package/lib/types/callbacks.d.ts +4 -4
- package/lib/victory-animation/util.d.ts +3 -3
- package/lib/victory-animation/util.js +5 -3
- package/lib/victory-animation/victory-animation.js +2 -2
- package/lib/victory-label/victory-label.d.ts +1 -1
- package/lib/victory-label/victory-label.js +7 -11
- package/lib/victory-primitives/arc.d.ts +1 -1
- package/lib/victory-primitives/arc.js +2 -2
- package/lib/victory-primitives/background.d.ts +1 -1
- package/lib/victory-primitives/background.js +2 -2
- package/lib/victory-primitives/border.d.ts +1 -1
- package/lib/victory-primitives/border.js +2 -2
- package/lib/victory-primitives/line-segment.d.ts +1 -1
- package/lib/victory-primitives/line-segment.js +2 -2
- package/lib/victory-primitives/point.d.ts +1 -1
- package/lib/victory-primitives/point.js +2 -2
- package/lib/victory-primitives/whisker.d.ts +1 -1
- package/lib/victory-primitives/whisker.js +16 -17
- package/lib/victory-util/add-events.js +7 -6
- package/lib/victory-util/axis.js +2 -2
- package/lib/victory-util/common-props.d.ts +1 -0
- package/lib/victory-util/data.js +14 -9
- package/lib/victory-util/domain.js +15 -15
- package/lib/victory-util/events.d.ts +3 -3
- package/lib/victory-util/events.js +17 -20
- package/lib/victory-util/helpers.js +5 -5
- package/lib/victory-util/immutable.js +4 -2
- package/lib/victory-util/label-helpers.d.ts +1 -1
- package/lib/victory-util/label-helpers.js +11 -11
- package/lib/victory-util/selection.js +1 -2
- package/lib/victory-util/timer.js +1 -2
- package/lib/victory-util/transitions.js +32 -26
- package/lib/victory-util/user-props.d.ts +6 -0
- package/lib/victory-util/user-props.js +13 -0
- package/lib/victory-util/wrapper.js +16 -14
- package/package.json +2 -2
- package/src/types/callbacks.ts +8 -5
- package/src/victory-animation/util.ts +5 -3
- package/src/victory-animation/victory-animation.tsx +3 -2
- package/src/victory-label/victory-label.tsx +18 -17
- package/src/victory-primitives/arc.tsx +2 -2
- package/src/victory-primitives/background.tsx +2 -2
- package/src/victory-primitives/border.tsx +2 -2
- package/src/victory-primitives/line-segment.tsx +2 -2
- package/src/victory-primitives/point.tsx +2 -2
- package/src/victory-primitives/whisker.tsx +5 -5
- package/src/victory-util/add-events.tsx +10 -9
- package/src/victory-util/axis.tsx +6 -2
- package/src/victory-util/common-props.tsx +1 -0
- package/src/victory-util/data.ts +12 -8
- package/src/victory-util/domain.ts +15 -15
- package/src/victory-util/events.ts +23 -31
- package/src/victory-util/helpers.ts +5 -5
- package/src/victory-util/immutable.ts +3 -2
- package/src/victory-util/label-helpers.ts +6 -10
- package/src/victory-util/selection.ts +3 -2
- package/src/victory-util/timer.ts +1 -2
- package/src/victory-util/transitions.ts +31 -22
- package/src/victory-util/user-props.ts +14 -0
- package/src/victory-util/wrapper.tsx +17 -22
|
@@ -36,10 +36,14 @@ export function getAxis(props) {
|
|
|
36
36
|
* @returns {Array} all axis components that pass the given predicate or []
|
|
37
37
|
*/
|
|
38
38
|
export function findAxisComponents(childComponents, predicate?) {
|
|
39
|
-
|
|
39
|
+
const predicateFunction = predicate || identity;
|
|
40
40
|
const findAxes = (children) => {
|
|
41
41
|
return children.reduce((memo, child) => {
|
|
42
|
-
if (
|
|
42
|
+
if (
|
|
43
|
+
child.type &&
|
|
44
|
+
child.type.role === "axis" &&
|
|
45
|
+
predicateFunction(child)
|
|
46
|
+
) {
|
|
43
47
|
return memo.concat(child);
|
|
44
48
|
} else if (child.props && child.props.children) {
|
|
45
49
|
return memo.concat(
|
|
@@ -95,6 +95,7 @@ export interface VictoryCommonThemeProps {
|
|
|
95
95
|
animate?: boolean | AnimatePropTypeInterface;
|
|
96
96
|
colorScale?: ColorScalePropType;
|
|
97
97
|
containerComponent?: React.ReactElement;
|
|
98
|
+
disableInlineStyles?: boolean;
|
|
98
99
|
domainPadding?: DomainPaddingPropType;
|
|
99
100
|
externalEventMutations?: EventCallbackInterface<
|
|
100
101
|
string | string[],
|
package/src/victory-util/data.ts
CHANGED
|
@@ -58,11 +58,12 @@ function sortData(dataset, sortKey, sortOrder = "ascending") {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
// Ensures previous VictoryLine api for sortKey prop stays consistent
|
|
61
|
+
let formattedSortKey = sortKey;
|
|
61
62
|
if (sortKey === "x" || sortKey === "y") {
|
|
62
|
-
|
|
63
|
+
formattedSortKey = `_${sortKey}`;
|
|
63
64
|
}
|
|
64
65
|
const order = sortOrder === "ascending" ? "asc" : "desc";
|
|
65
|
-
return orderBy(dataset,
|
|
66
|
+
return orderBy(dataset, formattedSortKey, order);
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
// This method will remove data points that break certain scales. (log scale only)
|
|
@@ -239,6 +240,9 @@ export function formatData(
|
|
|
239
240
|
}
|
|
240
241
|
|
|
241
242
|
const defaultKeys = ["x", "y", "y0"];
|
|
243
|
+
// TODO: We shouldn’t mutate the expectedKeys param here,
|
|
244
|
+
// but we need to figure out why changing it causes regressions in tests.
|
|
245
|
+
// eslint-disable-next-line no-param-reassign
|
|
242
246
|
expectedKeys = Array.isArray(expectedKeys) ? expectedKeys : defaultKeys;
|
|
243
247
|
|
|
244
248
|
const createAccessor = (name) => {
|
|
@@ -281,10 +285,10 @@ export function formatData(
|
|
|
281
285
|
? dataset
|
|
282
286
|
: dataset.reduce((dataArr, datum, index) => {
|
|
283
287
|
// eslint-disable-line complexity
|
|
284
|
-
|
|
285
|
-
const fallbackValues = { x: index, y:
|
|
288
|
+
const parsedDatum = parseDatum(datum);
|
|
289
|
+
const fallbackValues = { x: index, y: parsedDatum };
|
|
286
290
|
const processedValues = expectedKeys!.reduce((memo, type) => {
|
|
287
|
-
const processedValue = accessor[type](
|
|
291
|
+
const processedValue = accessor[type](parsedDatum);
|
|
288
292
|
const value =
|
|
289
293
|
processedValue !== undefined
|
|
290
294
|
? processedValue
|
|
@@ -300,7 +304,7 @@ export function formatData(
|
|
|
300
304
|
return memo;
|
|
301
305
|
}, {});
|
|
302
306
|
|
|
303
|
-
const formattedDatum = assign({}, processedValues,
|
|
307
|
+
const formattedDatum = assign({}, processedValues, parsedDatum);
|
|
304
308
|
if (!isEmpty(formattedDatum)) {
|
|
305
309
|
dataArr.push(formattedDatum);
|
|
306
310
|
}
|
|
@@ -408,8 +412,8 @@ export function getStringsFromData(props, axis) {
|
|
|
408
412
|
const sortedData = sortData(data, props.sortKey, props.sortOrder);
|
|
409
413
|
const dataStrings = sortedData
|
|
410
414
|
.reduce((dataArr, datum) => {
|
|
411
|
-
|
|
412
|
-
dataArr.push(accessor(
|
|
415
|
+
const parsedDatum = parseDatum(datum);
|
|
416
|
+
dataArr.push(accessor(parsedDatum));
|
|
413
417
|
return dataArr;
|
|
414
418
|
}, [])
|
|
415
419
|
.filter((datum) => typeof datum === "string");
|
|
@@ -183,22 +183,22 @@ export function createDomainFunction(
|
|
|
183
183
|
getDomainFromDataFunction?,
|
|
184
184
|
formatDomainFunction?,
|
|
185
185
|
) {
|
|
186
|
-
|
|
186
|
+
const getDomainFromDataFn = isFunction(getDomainFromDataFunction)
|
|
187
187
|
? getDomainFromDataFunction
|
|
188
188
|
: getDomainFromData;
|
|
189
|
-
|
|
189
|
+
const formatDomainFn = isFunction(formatDomainFunction)
|
|
190
190
|
? formatDomainFunction
|
|
191
191
|
: formatDomain;
|
|
192
192
|
return (props, axis) => {
|
|
193
193
|
const propsDomain = getDomainFromProps(props, axis);
|
|
194
194
|
if (propsDomain) {
|
|
195
|
-
return
|
|
195
|
+
return formatDomainFn(propsDomain, props, axis);
|
|
196
196
|
}
|
|
197
197
|
const categories = Data.getCategories(props, axis);
|
|
198
198
|
const domain = categories
|
|
199
199
|
? getDomainFromCategories(props, axis, categories)
|
|
200
|
-
:
|
|
201
|
-
return domain ?
|
|
200
|
+
: getDomainFromDataFn(props, axis);
|
|
201
|
+
return domain ? formatDomainFn(domain, props, axis) : undefined;
|
|
202
202
|
};
|
|
203
203
|
}
|
|
204
204
|
|
|
@@ -231,14 +231,14 @@ export function getDomain(props, axis) {
|
|
|
231
231
|
* @returns {Array|undefined} returns a domain from categories or undefined
|
|
232
232
|
*/
|
|
233
233
|
export function getDomainFromCategories(props, axis, categories?) {
|
|
234
|
-
|
|
234
|
+
const categoriesArray = categories || Data.getCategories(props, axis);
|
|
235
235
|
const { polar, startAngle = 0, endAngle = 360 } = props;
|
|
236
|
-
if (!
|
|
236
|
+
if (!categoriesArray) {
|
|
237
237
|
return undefined;
|
|
238
238
|
}
|
|
239
239
|
const minDomain = getMinFromProps(props, axis);
|
|
240
240
|
const maxDomain = getMaxFromProps(props, axis);
|
|
241
|
-
const stringArray = Collection.containsStrings(
|
|
241
|
+
const stringArray = Collection.containsStrings(categoriesArray)
|
|
242
242
|
? Data.getStringsFromCategories(props, axis)
|
|
243
243
|
: [];
|
|
244
244
|
const stringMap =
|
|
@@ -249,8 +249,8 @@ export function getDomainFromCategories(props, axis, categories?) {
|
|
|
249
249
|
return memo;
|
|
250
250
|
}, {});
|
|
251
251
|
const categoryValues = stringMap
|
|
252
|
-
?
|
|
253
|
-
:
|
|
252
|
+
? categoriesArray.map((value) => stringMap[value])
|
|
253
|
+
: categoriesArray;
|
|
254
254
|
const min =
|
|
255
255
|
minDomain !== undefined
|
|
256
256
|
? minDomain
|
|
@@ -273,11 +273,11 @@ export function getDomainFromCategories(props, axis, categories?) {
|
|
|
273
273
|
* @returns {Array} the domain based on data
|
|
274
274
|
*/
|
|
275
275
|
export function getDomainFromData(props, axis, dataset) {
|
|
276
|
-
|
|
276
|
+
const datasetArray = dataset || Data.getData(props);
|
|
277
277
|
const { polar, startAngle = 0, endAngle = 360 } = props;
|
|
278
278
|
const minDomain = getMinFromProps(props, axis);
|
|
279
279
|
const maxDomain = getMaxFromProps(props, axis);
|
|
280
|
-
if (
|
|
280
|
+
if (datasetArray.length < 1) {
|
|
281
281
|
return minDomain !== undefined && maxDomain !== undefined
|
|
282
282
|
? getDomainFromMinMax(minDomain, maxDomain)
|
|
283
283
|
: undefined;
|
|
@@ -285,14 +285,14 @@ export function getDomainFromData(props, axis, dataset) {
|
|
|
285
285
|
const min =
|
|
286
286
|
minDomain !== undefined
|
|
287
287
|
? minDomain
|
|
288
|
-
: getExtremeFromData(
|
|
288
|
+
: getExtremeFromData(datasetArray, axis, "min");
|
|
289
289
|
const max =
|
|
290
290
|
maxDomain !== undefined
|
|
291
291
|
? maxDomain
|
|
292
|
-
: getExtremeFromData(
|
|
292
|
+
: getExtremeFromData(datasetArray, axis, "max");
|
|
293
293
|
const domain = getDomainFromMinMax(min, max);
|
|
294
294
|
return polar && axis === "x" && Math.abs(startAngle - endAngle) === 360
|
|
295
|
-
? getSymmetricDomain(domain, getFlatData(
|
|
295
|
+
? getSymmetricDomain(domain, getFlatData(datasetArray, axis))
|
|
296
296
|
: domain;
|
|
297
297
|
}
|
|
298
298
|
|
|
@@ -48,10 +48,10 @@ interface ComponentWithEvents extends EventMixinCalculatedValues {
|
|
|
48
48
|
export function getEvents(
|
|
49
49
|
this: ComponentWithEvents,
|
|
50
50
|
props,
|
|
51
|
-
target
|
|
52
|
-
eventKey
|
|
51
|
+
target?,
|
|
52
|
+
eventKey?,
|
|
53
53
|
// eslint-disable-next-line no-shadow
|
|
54
|
-
getScopedEvents
|
|
54
|
+
getScopedEvents?,
|
|
55
55
|
) {
|
|
56
56
|
// Returns all events that apply to a particular target element
|
|
57
57
|
const getEventsByTarget = (events: Array<ComponentEvent>) => {
|
|
@@ -137,12 +137,12 @@ export function getScopedEvents(
|
|
|
137
137
|
|
|
138
138
|
// Mandatory usage: `getScopedEvents.bind(this)`
|
|
139
139
|
// eslint-disable-next-line no-invalid-this
|
|
140
|
-
|
|
140
|
+
const newBaseProps = baseProps || this.baseProps;
|
|
141
141
|
// returns the original base props or base state of a given target element
|
|
142
142
|
const getTargetProps = (identifier, type) => {
|
|
143
143
|
const { childName, target, key } = identifier;
|
|
144
144
|
// eslint-disable-next-line no-invalid-this
|
|
145
|
-
const baseType = type === "props" ?
|
|
145
|
+
const baseType = type === "props" ? newBaseProps : this.state || {};
|
|
146
146
|
const base =
|
|
147
147
|
childName === undefined || childName === null || !baseType[childName]
|
|
148
148
|
? baseType
|
|
@@ -165,13 +165,13 @@ export function getScopedEvents(
|
|
|
165
165
|
return "parent";
|
|
166
166
|
}
|
|
167
167
|
if (eventReturn.eventKey === "all") {
|
|
168
|
-
return
|
|
169
|
-
? without(keys(
|
|
170
|
-
: without(keys(
|
|
168
|
+
return newBaseProps[childName]
|
|
169
|
+
? without(keys(newBaseProps[childName]), "parent")
|
|
170
|
+
: without(keys(newBaseProps), "parent");
|
|
171
171
|
} else if (eventReturn.eventKey === undefined && eventKey === "parent") {
|
|
172
|
-
return
|
|
173
|
-
? keys(
|
|
174
|
-
: keys(
|
|
172
|
+
return newBaseProps[childName]
|
|
173
|
+
? keys(newBaseProps[childName])
|
|
174
|
+
: keys(newBaseProps);
|
|
175
175
|
}
|
|
176
176
|
return eventReturn.eventKey !== undefined
|
|
177
177
|
? eventReturn.eventKey
|
|
@@ -195,7 +195,7 @@ export function getScopedEvents(
|
|
|
195
195
|
);
|
|
196
196
|
const mutatedProps = eventReturn.mutation(
|
|
197
197
|
assign({}, mutationTargetProps, mutationTargetState),
|
|
198
|
-
|
|
198
|
+
newBaseProps,
|
|
199
199
|
);
|
|
200
200
|
const childState = baseState[childName] || {};
|
|
201
201
|
|
|
@@ -238,7 +238,7 @@ export function getScopedEvents(
|
|
|
238
238
|
|
|
239
239
|
// returns an entire mutated state for all children
|
|
240
240
|
const allChildNames =
|
|
241
|
-
childNames === "all" ? without(keys(
|
|
241
|
+
childNames === "all" ? without(keys(newBaseProps), "parent") : childNames;
|
|
242
242
|
return Array.isArray(allChildNames)
|
|
243
243
|
? allChildNames.reduce((memo, childName) => {
|
|
244
244
|
return assign(memo, getReturnByChild(childName));
|
|
@@ -249,10 +249,10 @@ export function getScopedEvents(
|
|
|
249
249
|
// Parses an array of event returns into a single state mutation
|
|
250
250
|
const parseEventReturn = (eventReturn, eventKey) => {
|
|
251
251
|
return Array.isArray(eventReturn)
|
|
252
|
-
? eventReturn.reduce(
|
|
253
|
-
memo
|
|
254
|
-
|
|
255
|
-
|
|
252
|
+
? eventReturn.reduce(
|
|
253
|
+
(memo, props) => assign({}, memo, parseEvent(props, eventKey)),
|
|
254
|
+
{},
|
|
255
|
+
)
|
|
256
256
|
: parseEvent(eventReturn, eventKey);
|
|
257
257
|
};
|
|
258
258
|
|
|
@@ -347,13 +347,10 @@ export function getEventState(
|
|
|
347
347
|
// eslint-disable-next-line max-params
|
|
348
348
|
export function getExternalMutationsWithChildren(
|
|
349
349
|
mutations,
|
|
350
|
-
baseProps,
|
|
351
|
-
baseState,
|
|
350
|
+
baseProps = {},
|
|
351
|
+
baseState = {},
|
|
352
352
|
childNames,
|
|
353
353
|
) {
|
|
354
|
-
baseProps = baseProps || {};
|
|
355
|
-
baseState = baseState || {};
|
|
356
|
-
|
|
357
354
|
return childNames.reduce((memo, childName) => {
|
|
358
355
|
const childState = baseState[childName];
|
|
359
356
|
const mutation = getExternalMutations(
|
|
@@ -380,13 +377,10 @@ export function getExternalMutationsWithChildren(
|
|
|
380
377
|
// eslint-disable-next-line max-params
|
|
381
378
|
export function getExternalMutations(
|
|
382
379
|
mutations,
|
|
383
|
-
baseProps,
|
|
384
|
-
baseState,
|
|
380
|
+
baseProps = {},
|
|
381
|
+
baseState = {},
|
|
385
382
|
childName?,
|
|
386
383
|
) {
|
|
387
|
-
baseProps = baseProps || {};
|
|
388
|
-
baseState = baseState || {};
|
|
389
|
-
|
|
390
384
|
const eventKeys = keys(baseProps);
|
|
391
385
|
return eventKeys.reduce((memo, eventKey) => {
|
|
392
386
|
const keyState = baseState[eventKey] || {};
|
|
@@ -452,8 +446,7 @@ export function getExternalMutation(
|
|
|
452
446
|
return false;
|
|
453
447
|
};
|
|
454
448
|
|
|
455
|
-
|
|
456
|
-
let scopedMutations = mutations;
|
|
449
|
+
let scopedMutations = Array.isArray(mutations) ? mutations : [mutations];
|
|
457
450
|
if (identifier.childName) {
|
|
458
451
|
scopedMutations = mutations.filter((m) => filterMutations(m, "childName"));
|
|
459
452
|
}
|
|
@@ -491,10 +484,9 @@ export function getComponentEvents(props, components) {
|
|
|
491
484
|
const componentEvents = isFunction(defaultEvents)
|
|
492
485
|
? defaultEvents(component.props)
|
|
493
486
|
: defaultEvents;
|
|
494
|
-
|
|
487
|
+
return Array.isArray(componentEvents)
|
|
495
488
|
? memo.concat(...componentEvents)
|
|
496
489
|
: memo;
|
|
497
|
-
return memo;
|
|
498
490
|
}, [] as ComponentEvent[]);
|
|
499
491
|
return events && events.length ? events : undefined;
|
|
500
492
|
}
|
|
@@ -258,6 +258,7 @@ export function reduceChildren<
|
|
|
258
258
|
];
|
|
259
259
|
const traverseChildren = (childArray, names, parent?) => {
|
|
260
260
|
return childArray.reduce((memo, child, index) => {
|
|
261
|
+
let newMemo = memo;
|
|
261
262
|
const childRole = child.type && child.type.role;
|
|
262
263
|
const childName = child.props.name || `${childRole}-${names[index]}`;
|
|
263
264
|
if (child.props && child.props.children) {
|
|
@@ -291,14 +292,14 @@ export function reduceChildren<
|
|
|
291
292
|
childNames,
|
|
292
293
|
child,
|
|
293
294
|
);
|
|
294
|
-
|
|
295
|
+
newMemo = combine(newMemo, nestedResults);
|
|
295
296
|
} else {
|
|
296
297
|
const result = iteratee(child, childName, parent);
|
|
297
298
|
if (result) {
|
|
298
|
-
|
|
299
|
+
newMemo = combine(newMemo, result);
|
|
299
300
|
}
|
|
300
301
|
}
|
|
301
|
-
return
|
|
302
|
+
return newMemo;
|
|
302
303
|
}, initialMemo);
|
|
303
304
|
};
|
|
304
305
|
|
|
@@ -320,8 +321,7 @@ export function isHorizontal(props) {
|
|
|
320
321
|
return childArray.reduce((memo, child) => {
|
|
321
322
|
const childProps = child.props || {};
|
|
322
323
|
if (memo || childProps.horizontal || !childProps.children) {
|
|
323
|
-
|
|
324
|
-
return memo;
|
|
324
|
+
return memo || childProps.horizontal;
|
|
325
325
|
}
|
|
326
326
|
return traverseChildren(React.Children.toArray(childProps.children));
|
|
327
327
|
}, false);
|
|
@@ -31,10 +31,11 @@ export function shallowToJS(x, whitelist?: Record<string, boolean | unknown>) {
|
|
|
31
31
|
return isIterable(x)
|
|
32
32
|
? x.reduce(
|
|
33
33
|
(result: any, curr: any, key: any) => {
|
|
34
|
+
let newCurr = curr;
|
|
34
35
|
if (whitelist && whitelist[key]) {
|
|
35
|
-
|
|
36
|
+
newCurr = shallowToJS(curr);
|
|
36
37
|
}
|
|
37
|
-
result[key] =
|
|
38
|
+
result[key] = newCurr;
|
|
38
39
|
return result;
|
|
39
40
|
},
|
|
40
41
|
isList(x) ? [] : {},
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/* eslint-disable no-use-before-define */
|
|
2
|
+
import { VictoryLabelProps } from "../victory-label/victory-label";
|
|
2
3
|
import * as Helpers from "./helpers";
|
|
3
4
|
import { defaults } from "lodash";
|
|
4
5
|
|
|
5
6
|
// Private Functions
|
|
6
7
|
|
|
7
|
-
function getVerticalAnchor(props, datum) {
|
|
8
|
-
datum = datum || {};
|
|
8
|
+
function getVerticalAnchor(props, datum: VictoryLabelProps["datum"] = {}) {
|
|
9
9
|
const sign = datum._y >= 0 ? 1 : -1;
|
|
10
10
|
const labelStyle = (props.style && props.style.labels) || {};
|
|
11
11
|
if (datum.verticalAnchor || labelStyle.verticalAnchor) {
|
|
@@ -16,8 +16,7 @@ function getVerticalAnchor(props, datum) {
|
|
|
16
16
|
return "middle";
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
function getTextAnchor(props, datum) {
|
|
20
|
-
datum = datum || {};
|
|
19
|
+
function getTextAnchor(props, datum: VictoryLabelProps["datum"] = {}) {
|
|
21
20
|
const { style, horizontal } = props;
|
|
22
21
|
const sign = datum._y >= 0 ? 1 : -1;
|
|
23
22
|
const labelStyle = (style && style.labels) || {};
|
|
@@ -29,14 +28,12 @@ function getTextAnchor(props, datum) {
|
|
|
29
28
|
return sign >= 0 ? "start" : "end";
|
|
30
29
|
}
|
|
31
30
|
|
|
32
|
-
function getAngle(props, datum) {
|
|
33
|
-
datum = datum || {};
|
|
31
|
+
function getAngle(props, datum: VictoryLabelProps["datum"] = {}) {
|
|
34
32
|
const labelStyle = (props.style && props.style.labels) || {};
|
|
35
33
|
return datum.angle === undefined ? labelStyle.angle : datum.angle;
|
|
36
34
|
}
|
|
37
35
|
|
|
38
|
-
function getPadding(props, datum) {
|
|
39
|
-
datum = datum || {};
|
|
36
|
+
function getPadding(props, datum: VictoryLabelProps["datum"] = {}) {
|
|
40
37
|
const { horizontal, style } = props;
|
|
41
38
|
const labelStyle = style.labels || {};
|
|
42
39
|
const defaultPadding = Helpers.evaluateProp(labelStyle.padding, props) || 0;
|
|
@@ -109,8 +106,7 @@ function getPolarOrientation(degrees) {
|
|
|
109
106
|
|
|
110
107
|
// Exported Functions
|
|
111
108
|
|
|
112
|
-
export function getText(props, datum, index) {
|
|
113
|
-
datum = datum || {};
|
|
109
|
+
export function getText(props, datum: VictoryLabelProps["datum"] = {}, index) {
|
|
114
110
|
if (datum.label !== undefined) {
|
|
115
111
|
return datum.label;
|
|
116
112
|
}
|
|
@@ -73,8 +73,9 @@ export function getSVGEventCoordinates(
|
|
|
73
73
|
const location = isReactTouchEvent(evt)
|
|
74
74
|
? evt.changedTouches[0]
|
|
75
75
|
: (evt as React.MouseEvent);
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
const matrix = getTransformationMatrix(
|
|
77
|
+
(svg as SVGGraphicsElement) || getParentSVG(location),
|
|
78
|
+
);
|
|
78
79
|
return {
|
|
79
80
|
x: transformTarget(location.clientX, matrix, "x"),
|
|
80
81
|
y: transformTarget(location.clientY, matrix, "y"),
|
|
@@ -47,11 +47,10 @@ export default class Timer {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
subscribe(callback: TimerCallback, duration: number) {
|
|
50
|
-
duration = this.shouldAnimate ? duration : 0;
|
|
51
50
|
const subscriptionID = this.subscribers.push({
|
|
52
51
|
startTime: now(),
|
|
53
52
|
callback,
|
|
54
|
-
duration,
|
|
53
|
+
duration: this.shouldAnimate ? duration : 0,
|
|
55
54
|
});
|
|
56
55
|
this.activeSubscriptions++;
|
|
57
56
|
this.start();
|
|
@@ -137,34 +137,39 @@ function getInitialChildProps(animate, data): TransitionProps {
|
|
|
137
137
|
|
|
138
138
|
// eslint-disable-next-line max-params
|
|
139
139
|
function getChildBeforeLoad(animate, child, data, cb): TransitionProps {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
const newAnimate = assign({}, animate, { onEnd: cb });
|
|
141
|
+
|
|
142
|
+
if (newAnimate && newAnimate.onLoad && !newAnimate.onLoad.duration) {
|
|
143
|
+
return { animate: newAnimate, data };
|
|
143
144
|
}
|
|
144
145
|
const before =
|
|
145
|
-
|
|
146
|
+
newAnimate.onLoad && newAnimate.onLoad.before
|
|
147
|
+
? newAnimate.onLoad.before
|
|
148
|
+
: identity;
|
|
146
149
|
// If nodes need to exit, transform them with the provided onLoad.before function.
|
|
147
|
-
|
|
150
|
+
const newData = data.map((datum, idx) => {
|
|
148
151
|
return assign({}, datum, before(datum, idx, data));
|
|
149
152
|
});
|
|
150
153
|
|
|
151
|
-
return { animate, data, clipWidth: 0 };
|
|
154
|
+
return { animate: newAnimate, data: newData, clipWidth: 0 };
|
|
152
155
|
}
|
|
153
156
|
|
|
154
157
|
// eslint-disable-next-line max-params
|
|
155
158
|
function getChildOnLoad(animate, data, cb): TransitionProps {
|
|
156
|
-
|
|
157
|
-
|
|
159
|
+
const newAnimate = assign({}, animate, { onEnd: cb });
|
|
160
|
+
let newData = data;
|
|
161
|
+
|
|
162
|
+
if (newAnimate && newAnimate.onLoad && !newAnimate.onLoad.duration) {
|
|
158
163
|
return { animate, data };
|
|
159
164
|
}
|
|
160
165
|
const after =
|
|
161
166
|
animate.onLoad && animate.onLoad.after ? animate.onLoad.after : identity;
|
|
162
167
|
// If nodes need to exit, transform them with the provided onLoad.after function.
|
|
163
|
-
|
|
168
|
+
newData = data.map((datum, idx) => {
|
|
164
169
|
return assign({}, datum, after(datum, idx, data));
|
|
165
170
|
});
|
|
166
171
|
|
|
167
|
-
return { animate, data };
|
|
172
|
+
return { animate: newAnimate, data: newData };
|
|
168
173
|
}
|
|
169
174
|
|
|
170
175
|
// eslint-disable-next-line max-params, max-len
|
|
@@ -178,7 +183,8 @@ function getChildPropsOnExit(
|
|
|
178
183
|
// Whether or not _this_ child has exiting nodes, we want the exit-
|
|
179
184
|
// transition for all children to have the same duration, delay, etc.
|
|
180
185
|
const onExit = animate && animate.onExit;
|
|
181
|
-
|
|
186
|
+
const newAnimate = assign({}, animate, onExit);
|
|
187
|
+
let newData = data;
|
|
182
188
|
|
|
183
189
|
if (exitingNodes) {
|
|
184
190
|
// After the exit transition occurs, trigger the animations for
|
|
@@ -189,7 +195,7 @@ function getChildPropsOnExit(
|
|
|
189
195
|
? animate.onExit.before
|
|
190
196
|
: identity;
|
|
191
197
|
// If nodes need to exit, transform them with the provided onExit.before function.
|
|
192
|
-
|
|
198
|
+
newData = data.map((datum, idx) => {
|
|
193
199
|
const key = (datum.key || idx).toString();
|
|
194
200
|
return exitingNodes[key]
|
|
195
201
|
? assign({}, datum, before(datum, idx, data))
|
|
@@ -197,7 +203,7 @@ function getChildPropsOnExit(
|
|
|
197
203
|
});
|
|
198
204
|
}
|
|
199
205
|
|
|
200
|
-
return { animate, data };
|
|
206
|
+
return { animate: newAnimate, data: newData };
|
|
201
207
|
}
|
|
202
208
|
|
|
203
209
|
// eslint-disable-next-line max-params,max-len
|
|
@@ -208,10 +214,12 @@ function getChildPropsBeforeEnter(
|
|
|
208
214
|
enteringNodes,
|
|
209
215
|
cb,
|
|
210
216
|
): TransitionProps {
|
|
217
|
+
let newAnimate = animate;
|
|
218
|
+
let newData = data;
|
|
211
219
|
if (enteringNodes) {
|
|
212
220
|
// Perform a normal animation here, except - when it finishes - trigger
|
|
213
221
|
// the transition for entering nodes.
|
|
214
|
-
|
|
222
|
+
newAnimate = assign({}, animate, { onEnd: cb });
|
|
215
223
|
const before =
|
|
216
224
|
animate.onEnter && animate.onEnter.before
|
|
217
225
|
? animate.onEnter.before
|
|
@@ -219,7 +227,7 @@ function getChildPropsBeforeEnter(
|
|
|
219
227
|
// We want the entering nodes to be included in the transition target
|
|
220
228
|
// domain. However, we may not want these nodes to be displayed initially,
|
|
221
229
|
// so perform the `onEnter.before` transformation on each node.
|
|
222
|
-
|
|
230
|
+
newData = data.map((datum, idx) => {
|
|
223
231
|
const key = (datum.key || idx).toString();
|
|
224
232
|
return enteringNodes[key]
|
|
225
233
|
? assign({}, datum, before(datum, idx, data))
|
|
@@ -227,7 +235,7 @@ function getChildPropsBeforeEnter(
|
|
|
227
235
|
});
|
|
228
236
|
}
|
|
229
237
|
|
|
230
|
-
return { animate, data };
|
|
238
|
+
return { animate: newAnimate, data: newData };
|
|
231
239
|
}
|
|
232
240
|
|
|
233
241
|
// eslint-disable-next-line max-params, max-len
|
|
@@ -240,25 +248,26 @@ function getChildPropsOnEnter(
|
|
|
240
248
|
// Whether or not _this_ child has entering nodes, we want the entering-
|
|
241
249
|
// transition for all children to have the same duration, delay, etc.
|
|
242
250
|
const onEnter = animate && animate.onEnter;
|
|
243
|
-
|
|
251
|
+
const newAnimate = assign({}, animate, onEnter);
|
|
252
|
+
let newData = data;
|
|
244
253
|
|
|
245
254
|
if (enteringNodes) {
|
|
246
255
|
// Old nodes have been transitioned to their new values, and the
|
|
247
256
|
// domain should encompass the nodes that will now enter. So perform
|
|
248
257
|
// the `onEnter.after` transformation on each node.
|
|
249
|
-
|
|
258
|
+
newAnimate.onEnd = cb;
|
|
250
259
|
const after =
|
|
251
|
-
|
|
252
|
-
?
|
|
260
|
+
newAnimate.onEnter && newAnimate.onEnter.after
|
|
261
|
+
? newAnimate.onEnter.after
|
|
253
262
|
: identity;
|
|
254
|
-
|
|
263
|
+
newData = data.map((datum, idx) => {
|
|
255
264
|
const key = getDatumKey(datum, idx);
|
|
256
265
|
return enteringNodes[key]
|
|
257
266
|
? assign({}, datum, after(datum, idx, data))
|
|
258
267
|
: datum;
|
|
259
268
|
});
|
|
260
269
|
}
|
|
261
|
-
return { animate, data };
|
|
270
|
+
return { animate: newAnimate, data: newData };
|
|
262
271
|
}
|
|
263
272
|
|
|
264
273
|
/**
|
|
@@ -55,6 +55,20 @@ const testIfSafeProp = (key: string): key is SafeAttribute => {
|
|
|
55
55
|
return false;
|
|
56
56
|
};
|
|
57
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Asserts that value is not null or undefined, throwing an error if it is.
|
|
60
|
+
* @param value The value to assert
|
|
61
|
+
* @param message The error message to throw
|
|
62
|
+
*/
|
|
63
|
+
export function assert<T>(
|
|
64
|
+
value: T,
|
|
65
|
+
message?: string,
|
|
66
|
+
): asserts value is NonNullable<T> {
|
|
67
|
+
if (value === undefined || value === null) {
|
|
68
|
+
throw new Error(message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
58
72
|
/**
|
|
59
73
|
* getSafeUserProps - function that takes in a props object and removes any
|
|
60
74
|
* key-value entries that do not match filter strings in the USER_PROPS_SAFELIST
|