source: node_modules/recharts/lib/chart/Sankey.js@ ba17441

Last change on this file since ba17441 was a762898, checked in by istevanoska <ilinastevanoska@…>, 5 months ago

Added visualizations

  • Property mode set to 100644
File size: 30.6 KB
RevLine 
[a762898]1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Sankey = Sankey;
7exports.sankeyPayloadSearcher = exports.sankeyDefaultProps = void 0;
8var _react = _interopRequireWildcard(require("react"));
9var React = _react;
10var _maxBy2 = _interopRequireDefault(require("es-toolkit/compat/maxBy"));
11var _sumBy = _interopRequireDefault(require("es-toolkit/compat/sumBy"));
12var _get = _interopRequireDefault(require("es-toolkit/compat/get"));
13var _Surface = require("../container/Surface");
14var _Layer = require("../container/Layer");
15var _Rectangle = require("../shape/Rectangle");
16var _ChartUtils = require("../util/ChartUtils");
17var _chartLayoutContext = require("../context/chartLayoutContext");
18var _tooltipPortalContext = require("../context/tooltipPortalContext");
19var _RechartsWrapper = require("./RechartsWrapper");
20var _RechartsStoreProvider = require("../state/RechartsStoreProvider");
21var _hooks = require("../state/hooks");
22var _tooltipSlice = require("../state/tooltipSlice");
23var _SetTooltipEntrySettings = require("../state/SetTooltipEntrySettings");
24var _chartDataContext = require("../context/chartDataContext");
25var _svgPropertiesNoEvents = require("../util/svgPropertiesNoEvents");
26var _resolveDefaultProps = require("../util/resolveDefaultProps");
27var _isWellBehavedNumber = require("../util/isWellBehavedNumber");
28var _DataUtils = require("../util/DataUtils");
29var _RegisterGraphicalItemId = require("../context/RegisterGraphicalItemId");
30var _excluded = ["sourceX", "sourceY", "sourceControlX", "targetX", "targetY", "targetControlX", "linkWidth"],
31 _excluded2 = ["className", "style", "children", "id"];
32function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
33function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
34function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
35function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
36function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
37function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
38function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
39function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
40function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
41function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
42var interpolationGenerator = (a, b) => {
43 var ka = +a;
44 var kb = b - ka;
45 return t => ka + kb * t;
46};
47var centerY = node => node.y + node.dy / 2;
48
49// TODO why is this not reading dataKey?
50var getValue = entry => entry && entry.value || 0;
51var getSumOfIds = (links, ids) => ids.reduce((result, id) => result + getValue(links[id]), 0);
52var getSumWithWeightedSource = (tree, links, ids) => ids.reduce((result, id) => {
53 var link = links[id];
54 if (link == null) {
55 return result;
56 }
57 var sourceNode = tree[link.source];
58 if (sourceNode == null) {
59 return result;
60 }
61 return result + centerY(sourceNode) * getValue(links[id]);
62}, 0);
63var getSumWithWeightedTarget = (tree, links, ids) => ids.reduce((result, id) => {
64 var link = links[id];
65 if (link == null) {
66 return result;
67 }
68 var targetNode = tree[link.target];
69 if (targetNode == null) {
70 return result;
71 }
72 return result + centerY(targetNode) * getValue(links[id]);
73}, 0);
74var ascendingY = (a, b) => a.y - b.y;
75var searchTargetsAndSources = (links, id) => {
76 var sourceNodes = [];
77 var sourceLinks = [];
78 var targetNodes = [];
79 var targetLinks = [];
80 for (var i = 0, len = links.length; i < len; i++) {
81 var link = links[i];
82 if ((link === null || link === void 0 ? void 0 : link.source) === id) {
83 targetNodes.push(link.target);
84 targetLinks.push(i);
85 }
86 if ((link === null || link === void 0 ? void 0 : link.target) === id) {
87 sourceNodes.push(link.source);
88 sourceLinks.push(i);
89 }
90 }
91 return {
92 sourceNodes,
93 sourceLinks,
94 targetLinks,
95 targetNodes
96 };
97};
98var updateDepthOfTargets = (tree, curNode) => {
99 var {
100 targetNodes
101 } = curNode;
102 for (var i = 0, len = targetNodes.length; i < len; i++) {
103 var targetNode = targetNodes[i];
104 if (targetNode == null) {
105 continue;
106 }
107 var target = tree[targetNode];
108 if (target) {
109 target.depth = Math.max(curNode.depth + 1, target.depth);
110 updateDepthOfTargets(tree, target);
111 }
112 }
113};
114var getNodesTree = (_ref, width, nodeWidth, align) => {
115 var _maxBy$depth, _maxBy;
116 var {
117 nodes,
118 links
119 } = _ref;
120 var tree = nodes.map((entry, index) => {
121 var result = searchTargetsAndSources(links, index);
122 return _objectSpread(_objectSpread(_objectSpread({}, entry), result), {}, {
123 value: Math.max(getSumOfIds(links, result.sourceLinks), getSumOfIds(links, result.targetLinks)),
124 depth: 0
125 });
126 });
127 for (var i = 0, len = tree.length; i < len; i++) {
128 var node = tree[i];
129 if (node != null && !node.sourceNodes.length) {
130 updateDepthOfTargets(tree, node);
131 }
132 }
133 var maxDepth = (_maxBy$depth = (_maxBy = (0, _maxBy2.default)(tree, entry => entry.depth)) === null || _maxBy === void 0 ? void 0 : _maxBy.depth) !== null && _maxBy$depth !== void 0 ? _maxBy$depth : 0;
134 if (maxDepth >= 1) {
135 var childWidth = (width - nodeWidth) / maxDepth;
136 for (var _i = 0, _len = tree.length; _i < _len; _i++) {
137 var _node = tree[_i];
138 if (_node == null) {
139 continue;
140 }
141 if (!_node.targetNodes.length) {
142 if (align === 'justify') {
143 _node.depth = maxDepth;
144 }
145 }
146 _node.x = _node.depth * childWidth;
147 _node.dx = nodeWidth;
148 }
149 }
150 return {
151 tree,
152 maxDepth
153 };
154};
155var getDepthTree = tree => {
156 var result = [];
157 for (var i = 0, len = tree.length; i < len; i++) {
158 var _result$node$depth;
159 var node = tree[i];
160 if (node == null) {
161 continue;
162 }
163 if (!result[node.depth]) {
164 result[node.depth] = [];
165 }
166 (_result$node$depth = result[node.depth]) === null || _result$node$depth === void 0 || _result$node$depth.push(node);
167 }
168 return result;
169};
170var updateYOfTree = (depthTree, height, nodePadding, links, verticalAlign) => {
171 var yRatio = Math.min(...depthTree.map(nodes => (height - (nodes.length - 1) * nodePadding) / (0, _sumBy.default)(nodes, getValue)));
172 for (var d = 0, maxDepth = depthTree.length; d < maxDepth; d++) {
173 var nodes = depthTree[d];
174 if (nodes == null) {
175 continue;
176 }
177 if (verticalAlign === 'top') {
178 var currentY = 0;
179 for (var i = 0, len = nodes.length; i < len; i++) {
180 var node = nodes[i];
181 if (node == null) {
182 continue;
183 }
184 node.dy = node.value * yRatio;
185 node.y = currentY;
186 currentY += node.dy + nodePadding;
187 }
188 } else {
189 for (var _i2 = 0, _len2 = nodes.length; _i2 < _len2; _i2++) {
190 var _node2 = nodes[_i2];
191 if (_node2 == null) {
192 continue;
193 }
194 _node2.y = _i2;
195 _node2.dy = _node2.value * yRatio;
196 }
197 }
198 }
199 return links.map(link => _objectSpread(_objectSpread({}, link), {}, {
200 dy: getValue(link) * yRatio
201 }));
202};
203var resolveCollisions = function resolveCollisions(depthTree, height, nodePadding) {
204 var sort = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
205 for (var i = 0, len = depthTree.length; i < len; i++) {
206 var nodes = depthTree[i];
207 if (nodes == null) {
208 continue;
209 }
210 var n = nodes.length;
211
212 // Sort by the value of y
213 if (sort) {
214 nodes.sort(ascendingY);
215 }
216 var y0 = 0;
217 for (var j = 0; j < n; j++) {
218 var node = nodes[j];
219 if (node == null) {
220 continue;
221 }
222 var dy = y0 - node.y;
223 if (dy > 0) {
224 node.y += dy;
225 }
226 y0 = node.y + node.dy + nodePadding;
227 }
228 y0 = height + nodePadding;
229 for (var _j = n - 1; _j >= 0; _j--) {
230 var _node3 = nodes[_j];
231 if (_node3 == null) {
232 continue;
233 }
234 var _dy = _node3.y + _node3.dy + nodePadding - y0;
235 if (_dy > 0) {
236 _node3.y -= _dy;
237 y0 = _node3.y;
238 } else {
239 break;
240 }
241 }
242 }
243};
244var relaxLeftToRight = (tree, depthTree, links, alpha) => {
245 for (var i = 0, maxDepth = depthTree.length; i < maxDepth; i++) {
246 var nodes = depthTree[i];
247 if (nodes == null) {
248 continue;
249 }
250 for (var j = 0, len = nodes.length; j < len; j++) {
251 var node = nodes[j];
252 if (node == null) {
253 continue;
254 }
255 if (node.sourceLinks.length) {
256 var sourceSum = getSumOfIds(links, node.sourceLinks);
257 var weightedSum = getSumWithWeightedSource(tree, links, node.sourceLinks);
258 var y = weightedSum / sourceSum;
259 node.y += (y - centerY(node)) * alpha;
260 }
261 }
262 }
263};
264var relaxRightToLeft = (tree, depthTree, links, alpha) => {
265 for (var i = depthTree.length - 1; i >= 0; i--) {
266 var nodes = depthTree[i];
267 if (nodes == null) {
268 continue;
269 }
270 for (var j = 0, len = nodes.length; j < len; j++) {
271 var node = nodes[j];
272 if (node == null) {
273 continue;
274 }
275 if (node.targetLinks.length) {
276 var targetSum = getSumOfIds(links, node.targetLinks);
277 var weightedSum = getSumWithWeightedTarget(tree, links, node.targetLinks);
278 var y = weightedSum / targetSum;
279 node.y += (y - centerY(node)) * alpha;
280 }
281 }
282 }
283};
284var updateYOfLinks = (tree, links) => {
285 for (var i = 0, len = tree.length; i < len; i++) {
286 var node = tree[i];
287 if (node == null) {
288 continue;
289 }
290 var sy = 0;
291 var ty = 0;
292 node.targetLinks.sort((a, b) => {
293 var _links$a, _links$b, _tree$targetA, _tree$targetB;
294 var targetA = (_links$a = links[a]) === null || _links$a === void 0 ? void 0 : _links$a.target;
295 var targetB = (_links$b = links[b]) === null || _links$b === void 0 ? void 0 : _links$b.target;
296 if (targetA == null || targetB == null) {
297 return 0;
298 }
299 var yA = (_tree$targetA = tree[targetA]) === null || _tree$targetA === void 0 ? void 0 : _tree$targetA.y;
300 var yB = (_tree$targetB = tree[targetB]) === null || _tree$targetB === void 0 ? void 0 : _tree$targetB.y;
301 if (yA == null || yB == null) {
302 return 0;
303 }
304 return yA - yB;
305 });
306 node.sourceLinks.sort((a, b) => {
307 var _links$a2, _links$b2, _tree$sourceA, _tree$sourceB;
308 var sourceA = (_links$a2 = links[a]) === null || _links$a2 === void 0 ? void 0 : _links$a2.source;
309 var sourceB = (_links$b2 = links[b]) === null || _links$b2 === void 0 ? void 0 : _links$b2.source;
310 if (sourceA == null || sourceB == null) {
311 return 0;
312 }
313 var yA = (_tree$sourceA = tree[sourceA]) === null || _tree$sourceA === void 0 ? void 0 : _tree$sourceA.y;
314 var yB = (_tree$sourceB = tree[sourceB]) === null || _tree$sourceB === void 0 ? void 0 : _tree$sourceB.y;
315 if (yA == null || yB == null) {
316 return 0;
317 }
318 return yA - yB;
319 });
320 for (var j = 0, tLen = node.targetLinks.length; j < tLen; j++) {
321 var targetLink = node.targetLinks[j];
322 if (targetLink == null) {
323 continue;
324 }
325 var link = links[targetLink];
326 if (link) {
327 // @ts-expect-error we should refactor this to immutable
328 link.sy = sy;
329 sy += link.dy;
330 }
331 }
332 for (var _j2 = 0, sLen = node.sourceLinks.length; _j2 < sLen; _j2++) {
333 var sourceLink = node.sourceLinks[_j2];
334 if (sourceLink == null) {
335 continue;
336 }
337 var _link = links[sourceLink];
338 if (_link) {
339 // @ts-expect-error we should refactor this to immutable
340 _link.ty = ty;
341 ty += _link.dy;
342 }
343 }
344 }
345};
346var computeData = _ref2 => {
347 var {
348 data,
349 width,
350 height,
351 iterations,
352 nodeWidth,
353 nodePadding,
354 sort,
355 verticalAlign,
356 align
357 } = _ref2;
358 var {
359 links
360 } = data;
361 var {
362 tree
363 } = getNodesTree(data, width, nodeWidth, align);
364 var depthTree = getDepthTree(tree);
365 var linksWithDy = updateYOfTree(depthTree, height, nodePadding, links, verticalAlign);
366 resolveCollisions(depthTree, height, nodePadding, sort);
367 if (verticalAlign === 'justify') {
368 var alpha = 1;
369 for (var i = 1; i <= iterations; i++) {
370 relaxRightToLeft(tree, depthTree, linksWithDy, alpha *= 0.99);
371 resolveCollisions(depthTree, height, nodePadding, sort);
372 relaxLeftToRight(tree, depthTree, linksWithDy, alpha);
373 resolveCollisions(depthTree, height, nodePadding, sort);
374 }
375 }
376 updateYOfLinks(tree, linksWithDy);
377 // @ts-expect-error updateYOfLinks modifies the links array to add sy and ty in place
378 var newLinks = linksWithDy;
379 return {
380 nodes: tree,
381 links: newLinks
382 };
383};
384var getNodeCoordinateOfTooltip = item => {
385 return {
386 x: +item.x + +item.width / 2,
387 y: +item.y + +item.height / 2
388 };
389};
390var getLinkCoordinateOfTooltip = item => {
391 return 'sourceX' in item ? {
392 x: (item.sourceX + item.targetX) / 2,
393 y: (item.sourceY + item.targetY) / 2
394 } : undefined;
395};
396var getPayloadOfTooltip = (item, type, nameKey) => {
397 var {
398 payload
399 } = item;
400 if (type === 'node') {
401 return {
402 payload,
403 name: (0, _ChartUtils.getValueByDataKey)(payload, nameKey, ''),
404 value: (0, _ChartUtils.getValueByDataKey)(payload, 'value')
405 };
406 }
407 if ('source' in payload && payload.source && payload.target) {
408 var sourceName = (0, _ChartUtils.getValueByDataKey)(payload.source, nameKey, '');
409 var targetName = (0, _ChartUtils.getValueByDataKey)(payload.target, nameKey, '');
410 return {
411 payload,
412 name: "".concat(sourceName, " - ").concat(targetName),
413 value: (0, _ChartUtils.getValueByDataKey)(payload, 'value')
414 };
415 }
416 return undefined;
417};
418var sankeyPayloadSearcher = (_, activeIndex, computedData, nameKey) => {
419 if (activeIndex == null || typeof activeIndex !== 'string') {
420 return undefined;
421 }
422 if (computedData == null || typeof computedData !== 'object') {
423 return undefined;
424 }
425 var splitIndex = activeIndex.split('-');
426 var [targetType, index] = splitIndex;
427 var item = (0, _get.default)(computedData, "".concat(targetType, "s[").concat(index, "]"));
428 if (item) {
429 var payload = getPayloadOfTooltip(item, targetType, nameKey);
430 return payload;
431 }
432 return undefined;
433};
434exports.sankeyPayloadSearcher = sankeyPayloadSearcher;
435var options = {
436 chartName: 'Sankey',
437 defaultTooltipEventType: 'item',
438 validateTooltipEventTypes: ['item'],
439 tooltipPayloadSearcher: sankeyPayloadSearcher,
440 eventEmitter: undefined
441};
442var SetSankeyTooltipEntrySettings = /*#__PURE__*/React.memo(_ref3 => {
443 var {
444 dataKey,
445 nameKey,
446 stroke,
447 strokeWidth,
448 fill,
449 name,
450 data,
451 id
452 } = _ref3;
453 var tooltipEntrySettings = {
454 dataDefinedOnItem: data,
455 getPosition: _DataUtils.noop,
456 settings: {
457 stroke,
458 strokeWidth,
459 fill,
460 dataKey,
461 name,
462 nameKey,
463 hide: false,
464 type: undefined,
465 color: fill,
466 unit: '',
467 graphicalItemId: id
468 }
469 };
470 return /*#__PURE__*/React.createElement(_SetTooltipEntrySettings.SetTooltipEntrySettings, {
471 tooltipEntrySettings: tooltipEntrySettings
472 });
473});
474
475// TODO: improve types - NodeOptions uses SankeyNode, LinkOptions uses LinkProps. Standardize.
476
477function renderLinkItem(option, props) {
478 if (/*#__PURE__*/React.isValidElement(option)) {
479 return /*#__PURE__*/React.cloneElement(option, props);
480 }
481 if (typeof option === 'function') {
482 return option(props);
483 }
484 var {
485 sourceX,
486 sourceY,
487 sourceControlX,
488 targetX,
489 targetY,
490 targetControlX,
491 linkWidth
492 } = props,
493 others = _objectWithoutProperties(props, _excluded);
494 return /*#__PURE__*/React.createElement("path", _extends({
495 className: "recharts-sankey-link",
496 d: "\n M".concat(sourceX, ",").concat(sourceY, "\n C").concat(sourceControlX, ",").concat(sourceY, " ").concat(targetControlX, ",").concat(targetY, " ").concat(targetX, ",").concat(targetY, "\n "),
497 fill: "none",
498 stroke: "#333",
499 strokeWidth: linkWidth,
500 strokeOpacity: "0.2"
501 }, (0, _svgPropertiesNoEvents.svgPropertiesNoEvents)(others)));
502}
503var buildLinkProps = _ref4 => {
504 var {
505 link,
506 nodes,
507 left,
508 top,
509 i,
510 linkContent,
511 linkCurvature
512 } = _ref4;
513 var {
514 sy: sourceRelativeY,
515 ty: targetRelativeY,
516 dy: linkWidth
517 } = link;
518 var sourceNode = nodes[link.source];
519 var targetNode = nodes[link.target];
520 if (sourceNode == null || targetNode == null) {
521 return undefined;
522 }
523 var sourceX = sourceNode.x + sourceNode.dx + left;
524 var targetX = targetNode.x + left;
525 var interpolationFunc = interpolationGenerator(sourceX, targetX);
526 var sourceControlX = interpolationFunc(linkCurvature);
527 var targetControlX = interpolationFunc(1 - linkCurvature);
528 var sourceY = sourceNode.y + sourceRelativeY + linkWidth / 2 + top;
529 var targetY = targetNode.y + targetRelativeY + linkWidth / 2 + top;
530 var linkProps = _objectSpread({
531 sourceX,
532 // @ts-expect-error the linkContent from below is contributing unknown props
533 targetX,
534 sourceY,
535 // @ts-expect-error the linkContent from below is contributing unknown props
536 targetY,
537 sourceControlX,
538 targetControlX,
539 sourceRelativeY,
540 targetRelativeY,
541 linkWidth,
542 index: i,
543 payload: _objectSpread(_objectSpread({}, link), {}, {
544 source: sourceNode,
545 target: targetNode
546 })
547 }, (0, _svgPropertiesNoEvents.svgPropertiesNoEventsFromUnknown)(linkContent));
548 return linkProps;
549};
550function SankeyLinkElement(_ref5) {
551 var {
552 graphicalItemId,
553 props,
554 i,
555 linkContent,
556 onMouseEnter: _onMouseEnter,
557 onMouseLeave: _onMouseLeave,
558 onClick: _onClick,
559 dataKey
560 } = _ref5;
561 var activeCoordinate = getLinkCoordinateOfTooltip(props);
562 var activeIndex = "link-".concat(i);
563 var dispatch = (0, _hooks.useAppDispatch)();
564 var events = {
565 onMouseEnter: e => {
566 dispatch((0, _tooltipSlice.setActiveMouseOverItemIndex)({
567 activeIndex,
568 activeDataKey: dataKey,
569 activeCoordinate,
570 activeGraphicalItemId: graphicalItemId
571 }));
572 _onMouseEnter(props, e);
573 },
574 onMouseLeave: e => {
575 dispatch((0, _tooltipSlice.mouseLeaveItem)());
576 _onMouseLeave(props, e);
577 },
578 onClick: e => {
579 dispatch((0, _tooltipSlice.setActiveClickItemIndex)({
580 activeIndex,
581 activeDataKey: dataKey,
582 activeCoordinate,
583 activeGraphicalItemId: graphicalItemId
584 }));
585 _onClick(props, e);
586 }
587 };
588 return /*#__PURE__*/React.createElement(_Layer.Layer, events, renderLinkItem(linkContent, props));
589}
590function AllSankeyLinkElements(_ref6) {
591 var {
592 graphicalItemId,
593 modifiedLinks,
594 links,
595 linkContent,
596 onMouseEnter,
597 onMouseLeave,
598 onClick,
599 dataKey
600 } = _ref6;
601 return /*#__PURE__*/React.createElement(_Layer.Layer, {
602 className: "recharts-sankey-links",
603 key: "recharts-sankey-links"
604 }, links.map((link, i) => {
605 var linkProps = modifiedLinks[i];
606 if (linkProps == null) {
607 return null;
608 }
609 return /*#__PURE__*/React.createElement(SankeyLinkElement, {
610 graphicalItemId: graphicalItemId,
611 key: "link-".concat(link.source, "-").concat(link.target, "-").concat(link.value),
612 props: linkProps,
613 linkContent: linkContent,
614 i: i,
615 onMouseEnter: onMouseEnter,
616 onMouseLeave: onMouseLeave,
617 onClick: onClick,
618 dataKey: dataKey
619 });
620 }));
621}
622function renderNodeItem(option, props) {
623 if (/*#__PURE__*/React.isValidElement(option)) {
624 return /*#__PURE__*/React.cloneElement(option, props);
625 }
626 if (typeof option === 'function') {
627 return option(props);
628 }
629 return (
630 /*#__PURE__*/
631 // @ts-expect-error recharts radius is not compatible with SVG radius
632 React.createElement(_Rectangle.Rectangle, _extends({
633 className: "recharts-sankey-node",
634 fill: "#0088fe",
635 fillOpacity: "0.8"
636 }, (0, _svgPropertiesNoEvents.svgPropertiesNoEvents)(props)))
637 );
638}
639var buildNodeProps = _ref7 => {
640 var {
641 node,
642 nodeContent,
643 top,
644 left,
645 i
646 } = _ref7;
647 var {
648 x,
649 y,
650 dx,
651 dy
652 } = node;
653 // @ts-expect-error nodeContent is passing in unknown props
654 var nodeProps = _objectSpread(_objectSpread({}, (0, _svgPropertiesNoEvents.svgPropertiesNoEventsFromUnknown)(nodeContent)), {}, {
655 x: x + left,
656 y: y + top,
657 width: dx,
658 height: dy,
659 index: i,
660 payload: node
661 });
662 return nodeProps;
663};
664function NodeElement(_ref8) {
665 var {
666 graphicalItemId,
667 props,
668 nodeContent,
669 i,
670 onMouseEnter: _onMouseEnter2,
671 onMouseLeave: _onMouseLeave2,
672 onClick: _onClick2,
673 dataKey
674 } = _ref8;
675 var dispatch = (0, _hooks.useAppDispatch)();
676 var activeCoordinate = getNodeCoordinateOfTooltip(props);
677 var activeIndex = "node-".concat(i);
678 var events = {
679 onMouseEnter: e => {
680 dispatch((0, _tooltipSlice.setActiveMouseOverItemIndex)({
681 activeIndex,
682 activeDataKey: dataKey,
683 activeCoordinate,
684 activeGraphicalItemId: graphicalItemId
685 }));
686 _onMouseEnter2(props, e);
687 },
688 onMouseLeave: e => {
689 dispatch((0, _tooltipSlice.mouseLeaveItem)());
690 _onMouseLeave2(props, e);
691 },
692 onClick: e => {
693 dispatch((0, _tooltipSlice.setActiveClickItemIndex)({
694 activeIndex,
695 activeDataKey: dataKey,
696 activeCoordinate,
697 activeGraphicalItemId: graphicalItemId
698 }));
699 _onClick2(props, e);
700 }
701 };
702 return /*#__PURE__*/React.createElement(_Layer.Layer, events, renderNodeItem(nodeContent, props));
703}
704function AllNodeElements(_ref9) {
705 var {
706 graphicalItemId,
707 modifiedNodes,
708 nodeContent,
709 onMouseEnter,
710 onMouseLeave,
711 onClick,
712 dataKey
713 } = _ref9;
714 return /*#__PURE__*/React.createElement(_Layer.Layer, {
715 className: "recharts-sankey-nodes",
716 key: "recharts-sankey-nodes"
717 }, modifiedNodes.map((modifiedNode, i) => {
718 return /*#__PURE__*/React.createElement(NodeElement, {
719 graphicalItemId: graphicalItemId,
720 key: "node-".concat(modifiedNode.index, "-").concat(modifiedNode.x, "-").concat(modifiedNode.y),
721 props: modifiedNode,
722 nodeContent: nodeContent,
723 i: i,
724 onMouseEnter: onMouseEnter,
725 onMouseLeave: onMouseLeave,
726 onClick: onClick,
727 dataKey: dataKey
728 });
729 }));
730}
731var sankeyDefaultProps = exports.sankeyDefaultProps = {
732 align: 'justify',
733 dataKey: 'value',
734 iterations: 32,
735 linkCurvature: 0.5,
736 margin: {
737 top: 5,
738 right: 5,
739 bottom: 5,
740 left: 5
741 },
742 nameKey: 'name',
743 nodePadding: 10,
744 nodeWidth: 10,
745 sort: true,
746 verticalAlign: 'justify'
747};
748function SankeyImpl(props) {
749 var {
750 className,
751 style,
752 children,
753 id
754 } = props,
755 others = _objectWithoutProperties(props, _excluded2);
756 var {
757 link,
758 dataKey,
759 node,
760 onMouseEnter,
761 onMouseLeave,
762 onClick,
763 data,
764 iterations,
765 nodeWidth,
766 nodePadding,
767 sort,
768 linkCurvature,
769 margin,
770 verticalAlign,
771 align
772 } = props;
773 var attrs = (0, _svgPropertiesNoEvents.svgPropertiesNoEvents)(others);
774 var width = (0, _chartLayoutContext.useChartWidth)();
775 var height = (0, _chartLayoutContext.useChartHeight)();
776 var {
777 links,
778 modifiedLinks,
779 modifiedNodes
780 } = (0, _react.useMemo)(() => {
781 var _margin$left, _margin$right, _margin$top, _margin$bottom;
782 if (!data || !width || !height || width <= 0 || height <= 0) {
783 return {
784 nodes: [],
785 links: [],
786 modifiedLinks: [],
787 modifiedNodes: []
788 };
789 }
790 var contentWidth = width - ((_margin$left = margin.left) !== null && _margin$left !== void 0 ? _margin$left : 0) - ((_margin$right = margin.right) !== null && _margin$right !== void 0 ? _margin$right : 0);
791 var contentHeight = height - ((_margin$top = margin.top) !== null && _margin$top !== void 0 ? _margin$top : 0) - ((_margin$bottom = margin.bottom) !== null && _margin$bottom !== void 0 ? _margin$bottom : 0);
792 var computed = computeData({
793 data,
794 width: contentWidth,
795 height: contentHeight,
796 iterations,
797 nodeWidth,
798 nodePadding,
799 sort,
800 verticalAlign,
801 align
802 });
803 var top = margin.top || 0;
804 var left = margin.left || 0;
805 var newModifiedLinks = computed.links.map((l, i) => {
806 return buildLinkProps({
807 link: l,
808 nodes: computed.nodes,
809 i,
810 top,
811 left,
812 linkContent: link,
813 linkCurvature
814 });
815 }).filter(_DataUtils.isNotNil);
816 var newModifiedNodes = computed.nodes.map((n, i) => {
817 return buildNodeProps({
818 node: n,
819 nodeContent: node,
820 i,
821 top,
822 left
823 });
824 });
825 return {
826 nodes: computed.nodes,
827 links: computed.links,
828 modifiedLinks: newModifiedLinks,
829 modifiedNodes: newModifiedNodes
830 };
831 }, [data, width, height, margin, iterations, nodeWidth, nodePadding, sort, link, node, linkCurvature, align, verticalAlign]);
832 var handleMouseEnter = (0, _react.useCallback)((item, type, e) => {
833 if (onMouseEnter) {
834 onMouseEnter(item, type, e);
835 }
836 }, [onMouseEnter]);
837 var handleMouseLeave = (0, _react.useCallback)((item, type, e) => {
838 if (onMouseLeave) {
839 onMouseLeave(item, type, e);
840 }
841 }, [onMouseLeave]);
842 var handleClick = (0, _react.useCallback)((item, type, e) => {
843 if (onClick) {
844 onClick(item, type, e);
845 }
846 }, [onClick]);
847 if (!(0, _isWellBehavedNumber.isPositiveNumber)(width) || !(0, _isWellBehavedNumber.isPositiveNumber)(height) || !data || !data.links || !data.nodes) {
848 return null;
849 }
850 return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_chartDataContext.SetComputedData, {
851 computedData: {
852 links: modifiedLinks,
853 nodes: modifiedNodes
854 }
855 }), /*#__PURE__*/React.createElement(_Surface.Surface, _extends({}, attrs, {
856 width: width,
857 height: height
858 }), children, /*#__PURE__*/React.createElement(AllSankeyLinkElements, {
859 graphicalItemId: id,
860 links: links,
861 modifiedLinks: modifiedLinks,
862 linkContent: link,
863 dataKey: dataKey,
864 onMouseEnter: (linkProps, e) => handleMouseEnter(linkProps, 'link', e),
865 onMouseLeave: (linkProps, e) => handleMouseLeave(linkProps, 'link', e),
866 onClick: (linkProps, e) => handleClick(linkProps, 'link', e)
867 }), /*#__PURE__*/React.createElement(AllNodeElements, {
868 graphicalItemId: id,
869 modifiedNodes: modifiedNodes,
870 nodeContent: node,
871 dataKey: dataKey,
872 onMouseEnter: (nodeProps, e) => handleMouseEnter(nodeProps, 'node', e),
873 onMouseLeave: (nodeProps, e) => handleMouseLeave(nodeProps, 'node', e),
874 onClick: (nodeProps, e) => handleClick(nodeProps, 'node', e)
875 })));
876}
877
878/**
879 * Flow diagram in which the width of the arrows is proportional to the flow rate.
880 * It is typically used to visualize energy or material or cost transfers between processes.
881 *
882 * @consumes ResponsiveContainerContext
883 * @provides TooltipEntrySettings
884 */
885function Sankey(outsideProps) {
886 var props = (0, _resolveDefaultProps.resolveDefaultProps)(outsideProps, sankeyDefaultProps);
887 var {
888 width,
889 height,
890 style,
891 className,
892 id: externalId
893 } = props;
894 var [tooltipPortal, setTooltipPortal] = (0, _react.useState)(null);
895 return /*#__PURE__*/React.createElement(_RechartsStoreProvider.RechartsStoreProvider, {
896 preloadedState: {
897 options
898 },
899 reduxStoreName: className !== null && className !== void 0 ? className : 'Sankey'
900 }, /*#__PURE__*/React.createElement(_chartLayoutContext.ReportChartSize, {
901 width: width,
902 height: height
903 }), /*#__PURE__*/React.createElement(_chartLayoutContext.ReportChartMargin, {
904 margin: props.margin
905 }), /*#__PURE__*/React.createElement(_RechartsWrapper.RechartsWrapper, {
906 className: className,
907 style: style,
908 width: width,
909 height: height
910 /*
911 * Sankey, same as Treemap, suffers from overfilling the container
912 * and causing infinite render loops where the chart keeps growing.
913 */,
914 responsive: false,
915 ref: node => {
916 if (node && !tooltipPortal) {
917 setTooltipPortal(node);
918 }
919 },
920 onMouseEnter: undefined,
921 onMouseLeave: undefined,
922 onClick: undefined,
923 onMouseMove: undefined,
924 onMouseDown: undefined,
925 onMouseUp: undefined,
926 onContextMenu: undefined,
927 onDoubleClick: undefined,
928 onTouchStart: undefined,
929 onTouchMove: undefined,
930 onTouchEnd: undefined
931 }, /*#__PURE__*/React.createElement(_tooltipPortalContext.TooltipPortalContext.Provider, {
932 value: tooltipPortal
933 }, /*#__PURE__*/React.createElement(_RegisterGraphicalItemId.RegisterGraphicalItemId, {
934 id: externalId,
935 type: "sankey"
936 }, id => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(SetSankeyTooltipEntrySettings, {
937 dataKey: props.dataKey,
938 nameKey: props.nameKey,
939 stroke: props.stroke,
940 strokeWidth: props.strokeWidth,
941 fill: props.fill,
942 name: props.name,
943 data: props.data,
944 id: id
945 }), /*#__PURE__*/React.createElement(SankeyImpl, _extends({}, props, {
946 id: id
947 })))))));
948}
949Sankey.displayName = 'Sankey';
Note: See TracBrowser for help on using the repository browser.