@easyv/charts 1.4.39 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/Axis.js +23 -9
- package/lib/components/CartesianChart.js +53 -18
- package/lib/components/Chart.js +24 -2
- package/lib/components/Control.js +86 -19
- package/lib/components/Line.js +5 -1
- package/lib/hooks/useAxes.js +1 -1
- package/lib/hooks/useCarouselAxisX.js +3 -3
- package/lib/hooks/useTooltip.js +5 -3
- package/lib/utils/index.js +13 -2
- package/package.json +1 -1
- package/src/components/Axis.tsx +23 -10
- package/src/components/CartesianChart.js +43 -17
- package/src/components/Chart.js +18 -2
- package/src/components/Control.jsx +61 -18
- package/src/components/Line.js +3 -2
- package/src/hooks/useAxes.js +1 -1
- package/src/hooks/useCarouselAxisX.js +4 -3
- package/src/hooks/useTooltip.ts +5 -2
- package/src/utils/index.js +7 -0
package/lib/components/Axis.js
CHANGED
|
@@ -54,14 +54,14 @@ var defaultFormatter = function defaultFormatter(d, _ref) {
|
|
|
54
54
|
return d + suffix;
|
|
55
55
|
};
|
|
56
56
|
|
|
57
|
-
var getAxesPath = function getAxesPath(orientation, _ref2, cHeight) {
|
|
57
|
+
var getAxesPath = function getAxesPath(orientation, _ref2, cHeight, cPercent) {
|
|
58
58
|
var width = _ref2.width,
|
|
59
59
|
height = _ref2.height;
|
|
60
60
|
|
|
61
61
|
switch (orientation) {
|
|
62
62
|
case "top":
|
|
63
63
|
case "bottom":
|
|
64
|
-
return "M-0.5, 0H" + width;
|
|
64
|
+
return "M-0.5, 0H" + width / cPercent;
|
|
65
65
|
|
|
66
66
|
case "left":
|
|
67
67
|
case "right":
|
|
@@ -123,7 +123,9 @@ var AxisLine = function AxisLine(_ref3) {
|
|
|
123
123
|
_ref3$isClipAxis = _ref3.isClipAxis,
|
|
124
124
|
isClipAxis = _ref3$isClipAxis === void 0 ? false : _ref3$isClipAxis,
|
|
125
125
|
_ref3$clipAxisRange = _ref3.clipAxisRange,
|
|
126
|
-
clipAxisRange = _ref3$clipAxisRange === void 0 ? [] : _ref3$clipAxisRange
|
|
126
|
+
clipAxisRange = _ref3$clipAxisRange === void 0 ? [] : _ref3$clipAxisRange,
|
|
127
|
+
_ref3$cPercent = _ref3.cPercent,
|
|
128
|
+
cPercent = _ref3$cPercent === void 0 ? 1 : _ref3$cPercent;
|
|
127
129
|
if (!show) return null;
|
|
128
130
|
var context = (0, _react.useContext)(_context.chartContext);
|
|
129
131
|
|
|
@@ -138,7 +140,7 @@ var AxisLine = function AxisLine(_ref3) {
|
|
|
138
140
|
}));
|
|
139
141
|
} else {
|
|
140
142
|
return /*#__PURE__*/_react["default"].createElement("path", {
|
|
141
|
-
d: getAxesPath(orientation, context, cHeight),
|
|
143
|
+
d: getAxesPath(orientation, context, cHeight, cPercent),
|
|
142
144
|
stroke: color,
|
|
143
145
|
strokeWidth: lineWidth
|
|
144
146
|
});
|
|
@@ -278,7 +280,8 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
278
280
|
height = _useContext.height;
|
|
279
281
|
|
|
280
282
|
var cHeight = controlInfo.cHeight,
|
|
281
|
-
isC = controlInfo.isC
|
|
283
|
+
isC = controlInfo.isC,
|
|
284
|
+
cPercent = controlInfo.cPercent;
|
|
282
285
|
var x = orientation == "right" ? width : 0;
|
|
283
286
|
var y = orientation == "bottom" ? height - cHeight : 0;
|
|
284
287
|
|
|
@@ -297,7 +300,7 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
297
300
|
});
|
|
298
301
|
var x1 = gridCoord.x1;
|
|
299
302
|
var y1 = gridCoord.y1;
|
|
300
|
-
return !(orientation == "bottom" && (x1 < 0 || x1 > xLineRange) || y1 < 0 || y1 > yLineRange) && /*#__PURE__*/_react["default"].createElement(_element.Line, (0, _extends2["default"])({
|
|
303
|
+
return !(orientation == "bottom" && !isC && (x1 < 0 || x1 > xLineRange) || y1 < 0 || y1 > yLineRange) && /*#__PURE__*/_react["default"].createElement(_element.Line, (0, _extends2["default"])({
|
|
301
304
|
className: "__easyv-tickLine",
|
|
302
305
|
key: index,
|
|
303
306
|
config: tickLine
|
|
@@ -313,6 +316,8 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
313
316
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, ticks.map(function (ticks, index) {
|
|
314
317
|
return draw(ticks, scaler[index]);
|
|
315
318
|
}));
|
|
319
|
+
} else if (isC && orientation == "bottom") {
|
|
320
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, draw(rawTicks, scaler));
|
|
316
321
|
} else {
|
|
317
322
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, draw(ticks, scaler));
|
|
318
323
|
}
|
|
@@ -363,7 +368,7 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
363
368
|
}
|
|
364
369
|
}
|
|
365
370
|
|
|
366
|
-
return /*#__PURE__*/_react["default"].createElement("g", null, axisLine && tickLine && /*#__PURE__*/_react["default"].createElement("g", null, axisLine && (positions && positions.length ? positions.map(function (_ref7, index) {
|
|
371
|
+
return /*#__PURE__*/_react["default"].createElement("g", null, axisLine && tickLine && !isC && /*#__PURE__*/_react["default"].createElement("g", null, axisLine && (positions && positions.length ? positions.map(function (_ref7, index) {
|
|
367
372
|
var x = _ref7.x,
|
|
368
373
|
y = _ref7.y;
|
|
369
374
|
return /*#__PURE__*/_react["default"].createElement("g", {
|
|
@@ -406,7 +411,8 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
406
411
|
cHeight: cHeight
|
|
407
412
|
}),
|
|
408
413
|
isClipAxis: isClipAxis,
|
|
409
|
-
clipAxisRange: clipAxisRange
|
|
414
|
+
clipAxisRange: clipAxisRange,
|
|
415
|
+
cPercent: cPercent
|
|
410
416
|
}), tickLine && drawAxisTickLine()))), /*#__PURE__*/_react["default"].createElement("svg", {
|
|
411
417
|
width: width,
|
|
412
418
|
style: {
|
|
@@ -416,7 +422,15 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
416
422
|
transform: "translate(" + x + ", " + y + ")"
|
|
417
423
|
}, /*#__PURE__*/_react["default"].createElement("g", {
|
|
418
424
|
ref: ref
|
|
419
|
-
}, label && gridLine && drawLabel(),
|
|
425
|
+
}, label && gridLine && drawLabel(), isC && /*#__PURE__*/_react["default"].createElement(AxisLine, {
|
|
426
|
+
orientation: orientation,
|
|
427
|
+
config: _objectSpread(_objectSpread({}, axisLine), {}, {
|
|
428
|
+
cHeight: cHeight
|
|
429
|
+
}),
|
|
430
|
+
isClipAxis: isClipAxis,
|
|
431
|
+
clipAxisRange: clipAxisRange,
|
|
432
|
+
cPercent: cPercent
|
|
433
|
+
}), isC && tickLine && drawAxisTickLine(), unit && /*#__PURE__*/_react["default"].createElement(Unit, {
|
|
420
434
|
config: unit
|
|
421
435
|
})))));
|
|
422
436
|
}));
|
|
@@ -15,6 +15,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
15
15
|
|
|
16
16
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
17
17
|
|
|
18
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
19
|
+
|
|
18
20
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
19
21
|
|
|
20
22
|
var _react = _interopRequireWildcard(require("react"));
|
|
@@ -32,6 +34,10 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
32
34
|
|
|
33
35
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
34
36
|
|
|
37
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
38
|
+
|
|
39
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
40
|
+
|
|
35
41
|
var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
36
42
|
var _ref$config = _ref.config,
|
|
37
43
|
axesConfig = _ref$config.axes,
|
|
@@ -70,6 +76,7 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
70
76
|
brush = _ref$config.brush,
|
|
71
77
|
_ref$config$control = _ref$config.control,
|
|
72
78
|
control = _ref$config$control === void 0 ? null : _ref$config$control,
|
|
79
|
+
active = _ref.active,
|
|
73
80
|
style = _ref.style,
|
|
74
81
|
originData = _ref.originData,
|
|
75
82
|
filterData = _ref.filterData,
|
|
@@ -113,7 +120,8 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
113
120
|
cWidth: controlWidth,
|
|
114
121
|
cHeight: controlHeight,
|
|
115
122
|
cBarWidth: controlBarWidth,
|
|
116
|
-
cPercent: dragPercent
|
|
123
|
+
cPercent: dragPercent,
|
|
124
|
+
cBarX: 0
|
|
117
125
|
}),
|
|
118
126
|
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
119
127
|
controlInfo = _useState4[0],
|
|
@@ -122,7 +130,8 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
122
130
|
var cWidth = controlInfo.cWidth,
|
|
123
131
|
cHeight = controlInfo.cHeight,
|
|
124
132
|
cBarWidth = controlInfo.cBarWidth,
|
|
125
|
-
cPercent = controlInfo.cPercent
|
|
133
|
+
cPercent = controlInfo.cPercent,
|
|
134
|
+
cBarX = controlInfo.cBarX;
|
|
126
135
|
yLineRange -= cHeight;
|
|
127
136
|
(0, _react.useEffect)(function () {
|
|
128
137
|
setControlInfo({
|
|
@@ -130,7 +139,8 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
130
139
|
cWidth: controlWidth,
|
|
131
140
|
cHeight: controlHeight,
|
|
132
141
|
cBarWidth: controlBarWidth,
|
|
133
|
-
cPercent: dragPercent
|
|
142
|
+
cPercent: dragPercent,
|
|
143
|
+
cBarX: 0
|
|
134
144
|
});
|
|
135
145
|
}, [JSON.stringify(control)]);
|
|
136
146
|
var svg = (0, _react.useRef)();
|
|
@@ -140,7 +150,7 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
140
150
|
controlInfo: controlInfo
|
|
141
151
|
});
|
|
142
152
|
var aiData = aiFormatter ? aiFormatter(originData, axes, series) : (0, _hooks.useAiData)(originData, axes, series);
|
|
143
|
-
var axisX = (0, _hooks.useCarouselAxisX)(axes.get("x"), animation, isHover, controlInfo);
|
|
153
|
+
var axisX = (0, _hooks.useCarouselAxisX)(axes.get("x"), animation, isHover, controlInfo, active);
|
|
144
154
|
(0, _react.useEffect)(function () {
|
|
145
155
|
if (aiData.length) {
|
|
146
156
|
if (!window.aiData) {
|
|
@@ -167,7 +177,8 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
167
177
|
height: yLineRange,
|
|
168
178
|
axisX: axisX,
|
|
169
179
|
isHover: isHover,
|
|
170
|
-
config: tooltipConfig
|
|
180
|
+
config: tooltipConfig,
|
|
181
|
+
active: active
|
|
171
182
|
}),
|
|
172
183
|
tooltipX = _useTooltip.x,
|
|
173
184
|
tickName = _useTooltip.name,
|
|
@@ -214,34 +225,58 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
214
225
|
|
|
215
226
|
var isWorking = (0, _react.useRef)(false); //控制条是否正在进行各种操作
|
|
216
227
|
|
|
217
|
-
var range = function range(num) {
|
|
228
|
+
var range = function range(num, ignoreMax) {
|
|
218
229
|
var _num = num;
|
|
219
230
|
var min = 0;
|
|
220
231
|
var max = cWidth - cBarWidth;
|
|
221
232
|
_num = Math.max(_num, min);
|
|
233
|
+
|
|
234
|
+
if (ignoreMax) {
|
|
235
|
+
return _num;
|
|
236
|
+
}
|
|
237
|
+
|
|
222
238
|
_num = Math.min(_num, max);
|
|
223
239
|
return _num;
|
|
224
240
|
}; //设置滑块和图表主体的偏移值
|
|
225
241
|
|
|
226
242
|
|
|
227
243
|
var setControlTranslate = function setControlTranslate(x, needSave) {
|
|
228
|
-
var controlEnd = axisX.controlEnd,
|
|
229
|
-
start = axisX.start;
|
|
230
244
|
var moveLen = range(x);
|
|
231
245
|
if (needSave) ctlBarX.current = moveLen;
|
|
232
|
-
|
|
246
|
+
setControlInfo(function (pre) {
|
|
247
|
+
return _objectSpread(_objectSpread({}, pre), {}, {
|
|
248
|
+
cBarX: moveLen
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
};
|
|
233
252
|
|
|
234
|
-
|
|
235
|
-
var
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
253
|
+
var setControlWidth = function setControlWidth(fn) {
|
|
254
|
+
var ignoreMax = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
255
|
+
setControlInfo(function (pre) {
|
|
256
|
+
var x = pre.cBarX;
|
|
257
|
+
var moveLen = range(x, ignoreMax);
|
|
258
|
+
ctlBarX.current = moveLen;
|
|
259
|
+
return fn(pre);
|
|
260
|
+
});
|
|
239
261
|
}; //设置控制条是否正在进行拖拽/缩放操作
|
|
240
262
|
|
|
241
263
|
|
|
242
264
|
var setWorking = function setWorking(bool) {
|
|
243
265
|
isWorking.current = bool;
|
|
244
|
-
};
|
|
266
|
+
}; //cBarX变化后,修改图表的偏移值
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
(0, _react.useLayoutEffect)(function () {
|
|
270
|
+
var controlEnd = axisX.controlEnd,
|
|
271
|
+
start = axisX.start;
|
|
272
|
+
controlEl.current.style.transform = "translate(".concat(cBarX, "px,0)"); //计算出当前位移的百分比
|
|
273
|
+
|
|
274
|
+
var percent = cBarX / (cWidth - cBarWidth);
|
|
275
|
+
var translateX = -(controlEnd + start / cPercent - chartWidth) * percent;
|
|
276
|
+
curControlPercent.current = percent;
|
|
277
|
+
seriesEl.current.style.transform = "translate(".concat(translateX, "px,").concat(marginTop, "px)");
|
|
278
|
+
axisElList.current[2].style.transform = "translate(".concat(translateX, "px,", 0, "px)");
|
|
279
|
+
}, [controlInfo]); //控制条轮播动画
|
|
245
280
|
|
|
246
281
|
(0, _react.useEffect)(function () {
|
|
247
282
|
if (controlEl.current && control) {
|
|
@@ -341,7 +376,7 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
341
376
|
cancelAnimationFrame(controlTimer.current);
|
|
342
377
|
};
|
|
343
378
|
}
|
|
344
|
-
}, [JSON.stringify(animation), control]); //初始化控制图提示框状态的函数
|
|
379
|
+
}, [JSON.stringify(animation), control, controlInfo]); //初始化控制图提示框状态的函数
|
|
345
380
|
|
|
346
381
|
var initCtlTip = function initCtlTip() {
|
|
347
382
|
return {
|
|
@@ -490,13 +525,13 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
|
|
|
490
525
|
actions: {
|
|
491
526
|
setX: setControlTranslate,
|
|
492
527
|
setWorking: setWorking,
|
|
493
|
-
|
|
528
|
+
setControlWidth: setControlWidth
|
|
494
529
|
},
|
|
495
530
|
props: {
|
|
496
531
|
control: control,
|
|
532
|
+
controlInfo: controlInfo,
|
|
497
533
|
axes: axes,
|
|
498
534
|
series: series,
|
|
499
|
-
width: width,
|
|
500
535
|
top: chartHeight + marginTop,
|
|
501
536
|
bandLength: bandLength
|
|
502
537
|
}
|
package/lib/components/Chart.js
CHANGED
|
@@ -13,6 +13,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
13
13
|
|
|
14
14
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
15
15
|
|
|
16
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
17
|
+
|
|
16
18
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
17
19
|
|
|
18
20
|
var _react = _interopRequireWildcard(require("react"));
|
|
@@ -71,6 +73,12 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
|
|
|
71
73
|
var svg = /*#__PURE__*/(0, _react.createRef)();
|
|
72
74
|
var chartWidth = width - marginLeft - marginRight;
|
|
73
75
|
var chartHeight = height - marginTop - marginBottom;
|
|
76
|
+
|
|
77
|
+
var _useState = (0, _react.useState)(true),
|
|
78
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
79
|
+
active = _useState2[0],
|
|
80
|
+
setActive = _useState2[1];
|
|
81
|
+
|
|
74
82
|
var triggerOnRelative = (0, _react.useCallback)(function (action, data) {
|
|
75
83
|
if (!interaction) return;
|
|
76
84
|
var callbacks = interaction.callbacks,
|
|
@@ -106,7 +114,20 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
|
|
|
106
114
|
svg: svg,
|
|
107
115
|
onEmit: onEmit
|
|
108
116
|
};
|
|
109
|
-
}, [id, chartWidth, chartHeight, triggerOnRelative, svg, onEmit]);
|
|
117
|
+
}, [id, chartWidth, chartHeight, triggerOnRelative, svg, onEmit]);
|
|
118
|
+
(0, _react.useEffect)(function () {
|
|
119
|
+
var activeHandler = function activeHandler(e) {
|
|
120
|
+
var _e$dynamicData = e.dynamicData,
|
|
121
|
+
dynamicData = _e$dynamicData === void 0 ? true : _e$dynamicData; // console.log("当前组件(id="+id+")状态:",dynamicData?"唤醒":"休眠");
|
|
122
|
+
|
|
123
|
+
setActive(dynamicData);
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
document.addEventListener("switchActive_".concat(id), activeHandler);
|
|
127
|
+
return function () {
|
|
128
|
+
document.removeEventListener("switchActive_".concat(id), activeHandler);
|
|
129
|
+
};
|
|
130
|
+
}, []); //对轴类图表进行
|
|
110
131
|
|
|
111
132
|
var data = originData;
|
|
112
133
|
|
|
@@ -142,7 +163,8 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
|
|
|
142
163
|
}, props)) : /*#__PURE__*/_react["default"].createElement(_.CartesianChart, (0, _extends2["default"])({
|
|
143
164
|
id: id,
|
|
144
165
|
config: config,
|
|
145
|
-
data: data
|
|
166
|
+
data: data,
|
|
167
|
+
active: active
|
|
146
168
|
}, props)));
|
|
147
169
|
});
|
|
148
170
|
var _default = Chart;
|
|
@@ -13,43 +13,49 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
13
13
|
|
|
14
14
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
15
15
|
|
|
16
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
17
|
+
|
|
16
18
|
var _react = _interopRequireWildcard(require("react"));
|
|
17
19
|
|
|
18
20
|
var _d3Scale = require("d3-scale");
|
|
19
21
|
|
|
22
|
+
var _utils = require("../utils");
|
|
23
|
+
|
|
20
24
|
var _excluded = ["Component", "yOrZ"];
|
|
21
25
|
|
|
22
26
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
23
27
|
|
|
24
28
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
25
29
|
|
|
30
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
31
|
+
|
|
32
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
33
|
+
|
|
26
34
|
var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
27
35
|
var _props$actions = props.actions,
|
|
28
36
|
setX = _props$actions.setX,
|
|
29
37
|
setWorking = _props$actions.setWorking,
|
|
30
|
-
|
|
38
|
+
setControlWidth = _props$actions.setControlWidth,
|
|
31
39
|
_props$props = props.props,
|
|
32
40
|
_props$props$control = _props$props.control,
|
|
33
41
|
height = _props$props$control.height,
|
|
34
42
|
color = _props$props$control.color,
|
|
35
|
-
|
|
36
|
-
dragColor = _props$props$control
|
|
37
|
-
|
|
38
|
-
_props$props$
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
gap = _props$props$control.gap,
|
|
44
|
+
dragColor = _props$props$control.drag.color,
|
|
45
|
+
left = _props$props$control.margin.left,
|
|
46
|
+
_props$props$controlI = _props$props.controlInfo,
|
|
47
|
+
cWidth = _props$props$controlI.cWidth,
|
|
48
|
+
cBarWidth = _props$props$controlI.cBarWidth,
|
|
41
49
|
axes = _props$props.axes,
|
|
42
50
|
series = _props$props.series,
|
|
43
|
-
width = _props$props.width,
|
|
44
51
|
top = _props$props.top,
|
|
45
52
|
bandLength = _props$props.bandLength;
|
|
46
|
-
var barWidth = width - left - right;
|
|
47
53
|
var xAxis = axes.get("x");
|
|
48
54
|
var barRef = (0, _react.useRef)();
|
|
49
55
|
var barStyle = {
|
|
50
56
|
position: "absolute",
|
|
51
57
|
top: 0,
|
|
52
|
-
width:
|
|
58
|
+
width: cBarWidth,
|
|
53
59
|
display: "flex",
|
|
54
60
|
justifyContent: "space-between",
|
|
55
61
|
background: dragColor
|
|
@@ -67,8 +73,39 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
67
73
|
cursor: "col-resize",
|
|
68
74
|
background: "rgb(2, 176, 249)",
|
|
69
75
|
WebkitBackgroundClip: "content-box"
|
|
76
|
+
}; //左手柄的鼠标按下逻辑
|
|
77
|
+
|
|
78
|
+
var leftDown = function leftDown() {
|
|
79
|
+
var transform = ref.current.style.transform;
|
|
80
|
+
var initX = 0;
|
|
81
|
+
var rawTranslateX = parseFloat(transform ? transform.match(/\d+\.*\d*/)[0] : 0);
|
|
82
|
+
var rightX = rawTranslateX + cBarWidth;
|
|
83
|
+
|
|
84
|
+
var move = function move(e) {
|
|
85
|
+
var movementX = e.movementX;
|
|
86
|
+
initX = (0, _utils.mathR)(initX + movementX, [-rawTranslateX, rightX - rawTranslateX]);
|
|
87
|
+
setControlWidth(function (pre) {
|
|
88
|
+
var cWidth = pre.cWidth,
|
|
89
|
+
cBarWidth = pre.cBarWidth;
|
|
90
|
+
var nextBarWidth = (0, _utils.mathR)(cBarWidth - movementX, [1, rightX]);
|
|
91
|
+
return _objectSpread(_objectSpread({}, pre), {}, {
|
|
92
|
+
cBarWidth: nextBarWidth,
|
|
93
|
+
cPercent: nextBarWidth / cWidth,
|
|
94
|
+
cBarX: initX + rawTranslateX
|
|
95
|
+
});
|
|
96
|
+
}, true);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
var up = function up() {
|
|
100
|
+
document.removeEventListener("mousemove", move);
|
|
101
|
+
document.removeEventListener("mouseup", up);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
document.addEventListener("mousemove", move);
|
|
105
|
+
document.addEventListener("mouseup", up);
|
|
70
106
|
}; //滑块的鼠标按下操作
|
|
71
107
|
|
|
108
|
+
|
|
72
109
|
var down = function down() {
|
|
73
110
|
var transform = ref.current.style.transform;
|
|
74
111
|
var movementX = 0;
|
|
@@ -90,21 +127,41 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
90
127
|
document.addEventListener("mouseup", mouseUpHandle);
|
|
91
128
|
setWorking(true);
|
|
92
129
|
}; // //右手柄的鼠标按下逻辑
|
|
93
|
-
// const rightDown=()=>{
|
|
94
|
-
// const move=(e)=>{
|
|
95
|
-
// }
|
|
96
|
-
// const up=()=>{
|
|
97
|
-
// }
|
|
98
|
-
// document.addEventListener()
|
|
99
|
-
// }
|
|
100
130
|
|
|
101
131
|
|
|
132
|
+
var rightDown = function rightDown() {
|
|
133
|
+
var transform = ref.current.style.transform;
|
|
134
|
+
var rawTranslateX = parseFloat(transform ? transform.match(/\d+\.*\d*/)[0] : 0);
|
|
135
|
+
|
|
136
|
+
var move = function move(e) {
|
|
137
|
+
var movementX = e.movementX;
|
|
138
|
+
setControlWidth(function (pre) {
|
|
139
|
+
var cWidth = pre.cWidth,
|
|
140
|
+
cBarWidth = pre.cBarWidth;
|
|
141
|
+
var maxWidth = cWidth - rawTranslateX;
|
|
142
|
+
var nextBarWidth = (0, _utils.mathR)(cBarWidth + movementX, [1, maxWidth]);
|
|
143
|
+
return _objectSpread(_objectSpread({}, pre), {}, {
|
|
144
|
+
cBarWidth: nextBarWidth,
|
|
145
|
+
cPercent: nextBarWidth / cWidth
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
var up = function up() {
|
|
151
|
+
document.removeEventListener("mousemove", move);
|
|
152
|
+
document.removeEventListener("mouseup", up);
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
document.addEventListener("mousemove", move);
|
|
156
|
+
document.addEventListener("mouseup", up);
|
|
157
|
+
};
|
|
158
|
+
|
|
102
159
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
103
160
|
style: {
|
|
104
|
-
width:
|
|
161
|
+
width: cWidth,
|
|
105
162
|
height: height,
|
|
106
163
|
backgroundColor: color,
|
|
107
|
-
transform: "translate(".concat(left, "px,").concat(top, "px)")
|
|
164
|
+
transform: "translate(".concat(left, "px,").concat(top - height + gap, "px)")
|
|
108
165
|
}
|
|
109
166
|
}, /*#__PURE__*/_react["default"].createElement("svg", {
|
|
110
167
|
width: "100%",
|
|
@@ -128,9 +185,19 @@ var _default = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _react.forwardRef
|
|
|
128
185
|
ref: ref,
|
|
129
186
|
style: barStyle
|
|
130
187
|
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
188
|
+
style: _objectSpread(_objectSpread({}, controllerStyle), {}, {
|
|
189
|
+
transform: "translateX(-6px)"
|
|
190
|
+
}),
|
|
191
|
+
onMouseDown: leftDown
|
|
192
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
131
193
|
style: dragStyle,
|
|
132
194
|
onMouseDown: down,
|
|
133
195
|
ref: barRef
|
|
196
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
197
|
+
style: _objectSpread(_objectSpread({}, controllerStyle), {}, {
|
|
198
|
+
transform: "translateX(6px)"
|
|
199
|
+
}),
|
|
200
|
+
onMouseDown: rightDown
|
|
134
201
|
})));
|
|
135
202
|
}));
|
|
136
203
|
|
package/lib/components/Line.js
CHANGED
|
@@ -93,6 +93,9 @@ var Area = function Area(_ref2) {
|
|
|
93
93
|
}, [xScaler, yScaler, curve, tension]);
|
|
94
94
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("path", {
|
|
95
95
|
d: areaGen(data),
|
|
96
|
+
style: {
|
|
97
|
+
pointerEvents: "none"
|
|
98
|
+
},
|
|
96
99
|
stroke: "none",
|
|
97
100
|
fill: 'url(#' + id + ')'
|
|
98
101
|
}), /*#__PURE__*/_react["default"].createElement("defs", null, type && type == 'pattern' ? /*#__PURE__*/_react["default"].createElement("pattern", {
|
|
@@ -178,7 +181,8 @@ var _default = /*#__PURE__*/(0, _react.memo)(function (_ref6) {
|
|
|
178
181
|
d: path,
|
|
179
182
|
stroke: stroke,
|
|
180
183
|
style: {
|
|
181
|
-
filter: show ? "drop-shadow(".concat(shadow.hShadow, "px ").concat(shadow.vShadow, "px ").concat(shadow.blur, "px ").concat(shadow.color, ")") : "none"
|
|
184
|
+
filter: show ? "drop-shadow(".concat(shadow.hShadow, "px ").concat(shadow.vShadow, "px ").concat(shadow.blur, "px ").concat(shadow.color, ")") : "none",
|
|
185
|
+
pointerEvents: "none"
|
|
182
186
|
},
|
|
183
187
|
fill: "none",
|
|
184
188
|
strokeDasharray: lineType === 'dash' ? '3 3' : null,
|
package/lib/hooks/useAxes.js
CHANGED
|
@@ -33,7 +33,7 @@ var initialState = {
|
|
|
33
33
|
* @returns {Map} 返回经过改变后的x轴,主要是ticks和scaler的range发生了改变
|
|
34
34
|
*/
|
|
35
35
|
|
|
36
|
-
var _default = function _default(axis, config, isHover, controlInfo) {
|
|
36
|
+
var _default = function _default(axis, config, isHover, controlInfo, active) {
|
|
37
37
|
var show = config.show,
|
|
38
38
|
interval = config.interval,
|
|
39
39
|
duration = config.duration,
|
|
@@ -84,7 +84,7 @@ var _default = function _default(axis, config, isHover, controlInfo) {
|
|
|
84
84
|
(0, _react.useEffect)(function () {
|
|
85
85
|
var handler;
|
|
86
86
|
|
|
87
|
-
if (!(hover && isHover) && show && time && tickLength > tickCount) {
|
|
87
|
+
if (!(hover && isHover) && show && time && tickLength > tickCount && active) {
|
|
88
88
|
handler = setInterval(function () {
|
|
89
89
|
setStatus(function (_ref) {
|
|
90
90
|
var currentIndex = _ref.currentIndex;
|
|
@@ -100,7 +100,7 @@ var _default = function _default(axis, config, isHover, controlInfo) {
|
|
|
100
100
|
return function () {
|
|
101
101
|
handler && clearInterval(handler);
|
|
102
102
|
};
|
|
103
|
-
}, [show, time, tickCount, tickLength, hover, isHover]);
|
|
103
|
+
}, [show, time, tickCount, tickLength, hover, isHover, active]);
|
|
104
104
|
(0, _react.useEffect)(function () {
|
|
105
105
|
var animation;
|
|
106
106
|
var currentIndex = status.currentIndex,
|
package/lib/hooks/useTooltip.js
CHANGED
|
@@ -23,6 +23,7 @@ var callback = function callback() {};
|
|
|
23
23
|
* @param {Number} height 高
|
|
24
24
|
* @param {Number} axisX 类目轴
|
|
25
25
|
* @param {Object} config 轮播动画参数
|
|
26
|
+
* @param {Boolean} active 组件是否处于活跃状态
|
|
26
27
|
* @returns {Object} 返回被选中的名称,坐标,选中方法
|
|
27
28
|
*/
|
|
28
29
|
|
|
@@ -40,7 +41,8 @@ var _default = function _default(_ref) {
|
|
|
40
41
|
var auto = _ref$config.auto,
|
|
41
42
|
_ref$config$interval = _ref$config.interval,
|
|
42
43
|
interval = _ref$config$interval === void 0 ? 0 : _ref$config$interval,
|
|
43
|
-
manual = _ref$config.manual
|
|
44
|
+
manual = _ref$config.manual,
|
|
45
|
+
active = _ref.active;
|
|
44
46
|
|
|
45
47
|
var _useState = (0, _react.useState)(null),
|
|
46
48
|
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
@@ -90,7 +92,7 @@ var _default = function _default(_ref) {
|
|
|
90
92
|
}
|
|
91
93
|
}, [svg, marginLeft, axisX, auto]);
|
|
92
94
|
(0, _react.useEffect)(function () {
|
|
93
|
-
var on = auto && tickLength && !isHover; // if (!!on) setCurrentIndex(0);
|
|
95
|
+
var on = auto && tickLength && !isHover && active; // if (!!on) setCurrentIndex(0);
|
|
94
96
|
|
|
95
97
|
var intervalHandler = on ? setInterval(function () {
|
|
96
98
|
setCurrentIndex(function (index) {
|
|
@@ -107,7 +109,7 @@ var _default = function _default(_ref) {
|
|
|
107
109
|
return function () {
|
|
108
110
|
intervalHandler && clearInterval(intervalHandler);
|
|
109
111
|
};
|
|
110
|
-
}, [auto, tickLength, interval, isHover]);
|
|
112
|
+
}, [auto, tickLength, interval, isHover, active]);
|
|
111
113
|
var name = currentIndex === null ? null : axisX.allTicks[currentIndex];
|
|
112
114
|
return {
|
|
113
115
|
name: name,
|
package/lib/utils/index.js
CHANGED
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.band = band;
|
|
9
|
-
exports.sortPie = exports.seriesYOrZ = exports.resetStacks = exports.reduceConfig = exports.isValidHttpUrl = exports.identity = exports.getTranslate3d = exports.getTranslate2d = exports.getTicksOfAxis = exports.getTickCoord = exports.getStacks = exports.getSeriesInfo = exports.getMousePos = exports.getMargin = exports.getIcon = exports.getGridCoord = exports.getFontStyle = exports.getDomPath = exports.getDataWithPercent = exports.getCurrentStack = exports.getColorList = exports.getChildren = exports.getBreakWord = exports.getBandwidth = exports.getBandSeriesStepAndWidth = exports.getBandBackground = exports.filterChildren = exports.dateFormat = exports.dataYOrZ = void 0;
|
|
9
|
+
exports.sortPie = exports.seriesYOrZ = exports.resetStacks = exports.reduceConfig = exports.mathR = exports.isValidHttpUrl = exports.identity = exports.getTranslate3d = exports.getTranslate2d = exports.getTicksOfAxis = exports.getTickCoord = exports.getStacks = exports.getSeriesInfo = exports.getMousePos = exports.getMargin = exports.getIcon = exports.getGridCoord = exports.getFontStyle = exports.getDomPath = exports.getDataWithPercent = exports.getCurrentStack = exports.getColorList = exports.getChildren = exports.getBreakWord = exports.getBandwidth = exports.getBandSeriesStepAndWidth = exports.getBandBackground = exports.filterChildren = exports.dateFormat = exports.dataYOrZ = void 0;
|
|
10
10
|
|
|
11
11
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
12
12
|
|
|
@@ -900,6 +900,17 @@ var reduceConfig = function reduceConfig() {
|
|
|
900
900
|
}
|
|
901
901
|
|
|
902
902
|
return output;
|
|
903
|
+
}; //限制value的值在min和max之间
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
exports.reduceConfig = reduceConfig;
|
|
907
|
+
|
|
908
|
+
var mathR = function mathR(value, range) {
|
|
909
|
+
var _range = (0, _slicedToArray2["default"])(range, 2),
|
|
910
|
+
min = _range[0],
|
|
911
|
+
max = _range[1];
|
|
912
|
+
|
|
913
|
+
return Math.max(min, Math.min(value, max));
|
|
903
914
|
};
|
|
904
915
|
|
|
905
|
-
exports.
|
|
916
|
+
exports.mathR = mathR;
|
package/package.json
CHANGED
package/src/components/Axis.tsx
CHANGED
|
@@ -37,12 +37,13 @@ const defaultFormatter: (
|
|
|
37
37
|
const getAxesPath: (
|
|
38
38
|
orientation: Orientation,
|
|
39
39
|
{ width, height }: Context,
|
|
40
|
-
cHeight:number
|
|
41
|
-
|
|
40
|
+
cHeight:number,
|
|
41
|
+
cPercent:number
|
|
42
|
+
) => string = (orientation, { width, height }, cHeight, cPercent) => {
|
|
42
43
|
switch (orientation) {
|
|
43
44
|
case "top":
|
|
44
45
|
case "bottom":
|
|
45
|
-
return "M-0.5, 0H" + width;
|
|
46
|
+
return "M-0.5, 0H" + width/cPercent;
|
|
46
47
|
case "left":
|
|
47
48
|
case "right":
|
|
48
49
|
return "M0, -0.5V" + (height + 0.5 - cHeight);
|
|
@@ -98,11 +99,13 @@ const AxisLine: ({
|
|
|
98
99
|
config,
|
|
99
100
|
isClipAxis,
|
|
100
101
|
clipAxisRange,
|
|
102
|
+
cPercent
|
|
101
103
|
}: any) => ReactComponentElement<ComponentType> | null = ({
|
|
102
104
|
orientation = defaultOrientation,
|
|
103
105
|
config: { show, color, lineWidth, cHeight },
|
|
104
106
|
isClipAxis = false,
|
|
105
107
|
clipAxisRange = [],
|
|
108
|
+
cPercent = 1
|
|
106
109
|
}) => {
|
|
107
110
|
if (!show) return null;
|
|
108
111
|
const context: Context = useContext(chartContext);
|
|
@@ -124,7 +127,7 @@ const AxisLine: ({
|
|
|
124
127
|
} else {
|
|
125
128
|
return (
|
|
126
129
|
<path
|
|
127
|
-
d={getAxesPath(orientation, context, cHeight)}
|
|
130
|
+
d={getAxesPath(orientation, context, cHeight, cPercent)}
|
|
128
131
|
stroke={color}
|
|
129
132
|
strokeWidth={lineWidth}
|
|
130
133
|
/>
|
|
@@ -279,7 +282,7 @@ export default memo(
|
|
|
279
282
|
) => {
|
|
280
283
|
if (!(on && ticks.length > 0)) return null;
|
|
281
284
|
const { width, height } = useContext(chartContext);
|
|
282
|
-
const { cHeight, isC } = controlInfo;
|
|
285
|
+
const { cHeight, isC, cPercent } = controlInfo;
|
|
283
286
|
const x = orientation == "right" ? width : 0;
|
|
284
287
|
const y = orientation == "bottom" ? height-cHeight : 0;
|
|
285
288
|
|
|
@@ -302,7 +305,7 @@ export default memo(
|
|
|
302
305
|
const y1 = gridCoord.y1;
|
|
303
306
|
return (
|
|
304
307
|
!(
|
|
305
|
-
(orientation == "bottom" && (x1 < 0 || x1 > xLineRange)) ||
|
|
308
|
+
(orientation == "bottom" && !isC && (x1 < 0 || x1 > xLineRange)) ||
|
|
306
309
|
y1 < 0 ||
|
|
307
310
|
y1 > yLineRange
|
|
308
311
|
) && (
|
|
@@ -320,7 +323,7 @@ export default memo(
|
|
|
320
323
|
);
|
|
321
324
|
});
|
|
322
325
|
};
|
|
323
|
-
|
|
326
|
+
|
|
324
327
|
if (isClipAxis) {
|
|
325
328
|
return (
|
|
326
329
|
<>
|
|
@@ -329,11 +332,12 @@ export default memo(
|
|
|
329
332
|
})}
|
|
330
333
|
</>
|
|
331
334
|
);
|
|
332
|
-
} else {
|
|
335
|
+
} else if (isC && orientation == "bottom") {
|
|
336
|
+
return <>{draw(rawTicks, scaler)}</>;
|
|
337
|
+
}else {
|
|
333
338
|
return <>{draw(ticks, scaler)}</>;
|
|
334
339
|
}
|
|
335
340
|
}
|
|
336
|
-
|
|
337
341
|
function drawLabel() {
|
|
338
342
|
const draw = (ticks: any, scaler: any) => {
|
|
339
343
|
return ticks.map((tick: string, index: number) => {
|
|
@@ -400,7 +404,7 @@ export default memo(
|
|
|
400
404
|
return (
|
|
401
405
|
<g>
|
|
402
406
|
{/* 绘制轴线和刻度 */}
|
|
403
|
-
{axisLine && tickLine && (
|
|
407
|
+
{axisLine && tickLine && !isC && (
|
|
404
408
|
<g>
|
|
405
409
|
{axisLine &&
|
|
406
410
|
(positions && positions.length ? (
|
|
@@ -458,6 +462,7 @@ export default memo(
|
|
|
458
462
|
config={{...axisLine,cHeight}}
|
|
459
463
|
isClipAxis={isClipAxis}
|
|
460
464
|
clipAxisRange={clipAxisRange}
|
|
465
|
+
cPercent={cPercent}
|
|
461
466
|
/>
|
|
462
467
|
{tickLine && drawAxisTickLine()}
|
|
463
468
|
</g>
|
|
@@ -476,6 +481,14 @@ export default memo(
|
|
|
476
481
|
{/* 用于控制图 */}
|
|
477
482
|
<g ref={ref as any}>
|
|
478
483
|
{label && gridLine && drawLabel()}
|
|
484
|
+
{isC && <AxisLine
|
|
485
|
+
orientation={orientation}
|
|
486
|
+
config={{...axisLine,cHeight}}
|
|
487
|
+
isClipAxis={isClipAxis}
|
|
488
|
+
clipAxisRange={clipAxisRange}
|
|
489
|
+
cPercent={cPercent}
|
|
490
|
+
/>}
|
|
491
|
+
{isC && tickLine && drawAxisTickLine()}
|
|
479
492
|
{unit && <Unit config={unit} />}
|
|
480
493
|
</g>
|
|
481
494
|
</g>
|
|
@@ -8,7 +8,8 @@ import React, {
|
|
|
8
8
|
useRef,
|
|
9
9
|
useContext,
|
|
10
10
|
useCallback,
|
|
11
|
-
useEffect
|
|
11
|
+
useEffect,
|
|
12
|
+
useLayoutEffect
|
|
12
13
|
} from "react";
|
|
13
14
|
import { useAxes, useTooltip, useCarouselAxisX, useAiData } from "../hooks";
|
|
14
15
|
import { chartContext } from "../context";
|
|
@@ -58,6 +59,7 @@ const Chart = memo(
|
|
|
58
59
|
brush,
|
|
59
60
|
control = null,
|
|
60
61
|
},
|
|
62
|
+
active,
|
|
61
63
|
style,
|
|
62
64
|
originData,
|
|
63
65
|
filterData,
|
|
@@ -88,8 +90,8 @@ const Chart = memo(
|
|
|
88
90
|
dragPercent = dragWidth/100;
|
|
89
91
|
controlBarWidth = controlWidth*dragPercent;
|
|
90
92
|
}
|
|
91
|
-
const [controlInfo, setControlInfo] = useState({ isC:isControl, cWidth:controlWidth, cHeight:controlHeight, cBarWidth:controlBarWidth, cPercent:dragPercent });
|
|
92
|
-
const { cWidth, cHeight, cBarWidth, cPercent } = controlInfo;
|
|
93
|
+
const [controlInfo, setControlInfo] = useState({ isC:isControl, cWidth:controlWidth, cHeight:controlHeight, cBarWidth:controlBarWidth, cPercent:dragPercent, cBarX:0 });
|
|
94
|
+
const { cWidth, cHeight, cBarWidth, cPercent, cBarX } = controlInfo;
|
|
93
95
|
yLineRange -= cHeight;
|
|
94
96
|
useEffect(()=>{
|
|
95
97
|
setControlInfo({
|
|
@@ -97,7 +99,8 @@ const Chart = memo(
|
|
|
97
99
|
cWidth:controlWidth,
|
|
98
100
|
cHeight:controlHeight,
|
|
99
101
|
cBarWidth:controlBarWidth,
|
|
100
|
-
cPercent:dragPercent
|
|
102
|
+
cPercent:dragPercent,
|
|
103
|
+
cBarX:0
|
|
101
104
|
});
|
|
102
105
|
},[JSON.stringify(control)]);
|
|
103
106
|
|
|
@@ -112,7 +115,8 @@ const Chart = memo(
|
|
|
112
115
|
axes.get("x"),
|
|
113
116
|
animation,
|
|
114
117
|
isHover,
|
|
115
|
-
controlInfo
|
|
118
|
+
controlInfo,
|
|
119
|
+
active
|
|
116
120
|
);
|
|
117
121
|
useEffect(()=>{
|
|
118
122
|
if(aiData.length){
|
|
@@ -143,6 +147,7 @@ const Chart = memo(
|
|
|
143
147
|
axisX,
|
|
144
148
|
isHover,
|
|
145
149
|
config: tooltipConfig,
|
|
150
|
+
active
|
|
146
151
|
});
|
|
147
152
|
const tooltipData = useMemo(
|
|
148
153
|
() =>
|
|
@@ -190,31 +195,52 @@ const Chart = memo(
|
|
|
190
195
|
const ctlBarX = useRef(0); //控制条的滑块偏移值
|
|
191
196
|
const isWorking = useRef(false); //控制条是否正在进行各种操作
|
|
192
197
|
|
|
193
|
-
const range = (num) => {
|
|
198
|
+
const range = (num, ignoreMax) => {
|
|
194
199
|
let _num = num;
|
|
195
200
|
const min = 0;
|
|
196
201
|
const max = cWidth - cBarWidth;
|
|
197
202
|
_num = Math.max(_num, min);
|
|
203
|
+
if(ignoreMax){
|
|
204
|
+
return _num;
|
|
205
|
+
}
|
|
198
206
|
_num = Math.min(_num, max);
|
|
199
207
|
return _num;
|
|
200
208
|
};
|
|
201
209
|
//设置滑块和图表主体的偏移值
|
|
202
210
|
const setControlTranslate = (x, needSave) => {
|
|
203
|
-
const { controlEnd, start } = axisX;
|
|
204
211
|
const moveLen = range(x);
|
|
205
212
|
if(needSave) ctlBarX.current = moveLen;
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
axisElList.current[2].style.transform = `translate(${translateX}px,${0}px)`;
|
|
213
|
+
setControlInfo(pre=>{
|
|
214
|
+
return {
|
|
215
|
+
...pre,
|
|
216
|
+
cBarX:moveLen
|
|
217
|
+
}
|
|
218
|
+
});
|
|
213
219
|
};
|
|
220
|
+
const setControlWidth = (fn,ignoreMax=false)=>{
|
|
221
|
+
setControlInfo(pre=>{
|
|
222
|
+
const x = pre.cBarX;
|
|
223
|
+
const moveLen = range(x, ignoreMax);
|
|
224
|
+
ctlBarX.current = moveLen;
|
|
225
|
+
return fn(pre);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
214
228
|
//设置控制条是否正在进行拖拽/缩放操作
|
|
215
229
|
const setWorking=(bool)=>{
|
|
216
230
|
isWorking.current = bool;
|
|
217
231
|
}
|
|
232
|
+
//cBarX变化后,修改图表的偏移值
|
|
233
|
+
useLayoutEffect(()=>{
|
|
234
|
+
const { controlEnd, start } = axisX;
|
|
235
|
+
controlEl.current.style.transform = `translate(${cBarX}px,0)`;
|
|
236
|
+
//计算出当前位移的百分比
|
|
237
|
+
const percent = cBarX / (cWidth - cBarWidth);
|
|
238
|
+
const translateX = -(controlEnd + start/cPercent - chartWidth) * percent;
|
|
239
|
+
curControlPercent.current = percent;
|
|
240
|
+
seriesEl.current.style.transform = `translate(${translateX}px,${marginTop}px)`;
|
|
241
|
+
axisElList.current[2].style.transform = `translate(${translateX}px,${0}px)`;
|
|
242
|
+
},[controlInfo]);
|
|
243
|
+
//控制条轮播动画
|
|
218
244
|
useEffect(() => {
|
|
219
245
|
if (controlEl.current && control) {
|
|
220
246
|
let isEnter = false; //控制条轮播动画是否处于暂停状态
|
|
@@ -291,7 +317,7 @@ const Chart = memo(
|
|
|
291
317
|
cancelAnimationFrame(controlTimer.current);
|
|
292
318
|
};
|
|
293
319
|
}
|
|
294
|
-
}, [JSON.stringify(animation), control]);
|
|
320
|
+
}, [JSON.stringify(animation), control, controlInfo]);
|
|
295
321
|
//初始化控制图提示框状态的函数
|
|
296
322
|
const initCtlTip = ()=>{
|
|
297
323
|
return {
|
|
@@ -484,13 +510,13 @@ const Chart = memo(
|
|
|
484
510
|
actions={{
|
|
485
511
|
setX:setControlTranslate,
|
|
486
512
|
setWorking,
|
|
487
|
-
|
|
513
|
+
setControlWidth
|
|
488
514
|
}}
|
|
489
515
|
props={{
|
|
490
516
|
control,
|
|
517
|
+
controlInfo,
|
|
491
518
|
axes,
|
|
492
519
|
series,
|
|
493
|
-
width,
|
|
494
520
|
top:chartHeight+marginTop,
|
|
495
521
|
bandLength,
|
|
496
522
|
}}
|
package/src/components/Chart.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 总入口,通过外面传进来的type来确定渲染哪种图表,饼环图表为“pie”,否则为轴类图表
|
|
3
3
|
*/
|
|
4
|
-
import React, { memo, useMemo, createRef, useCallback } from 'react';
|
|
4
|
+
import React, { memo, useMemo, createRef, useState, useEffect, useCallback } from 'react';
|
|
5
5
|
import { chartContext } from '../context';
|
|
6
6
|
import { PieChart, CartesianChart } from '.';
|
|
7
7
|
import { group } from 'd3v7';
|
|
@@ -43,6 +43,8 @@ const Chart = memo(
|
|
|
43
43
|
const chartWidth = width - marginLeft - marginRight;
|
|
44
44
|
const chartHeight = height - marginTop - marginBottom;
|
|
45
45
|
|
|
46
|
+
const [active, setActive] = useState(true);
|
|
47
|
+
|
|
46
48
|
const triggerOnRelative = useCallback(
|
|
47
49
|
(action,data) => {
|
|
48
50
|
if (!interaction) return;
|
|
@@ -87,6 +89,20 @@ const Chart = memo(
|
|
|
87
89
|
}),
|
|
88
90
|
[id, chartWidth, chartHeight, triggerOnRelative, svg, onEmit]
|
|
89
91
|
);
|
|
92
|
+
|
|
93
|
+
useEffect(()=>{
|
|
94
|
+
const activeHandler=(e)=>{
|
|
95
|
+
const { dynamicData = true } = e;
|
|
96
|
+
// console.log("当前组件(id="+id+")状态:",dynamicData?"唤醒":"休眠");
|
|
97
|
+
setActive(dynamicData);
|
|
98
|
+
}
|
|
99
|
+
document.addEventListener(`switchActive_${id}`,activeHandler);
|
|
100
|
+
return ()=>{
|
|
101
|
+
document.removeEventListener(`switchActive_${id}`,activeHandler);
|
|
102
|
+
}
|
|
103
|
+
},[]);
|
|
104
|
+
|
|
105
|
+
|
|
90
106
|
//对轴类图表进行
|
|
91
107
|
let data = originData;
|
|
92
108
|
if(axes){
|
|
@@ -107,7 +123,7 @@ const Chart = memo(
|
|
|
107
123
|
{type == 'pie' ? (
|
|
108
124
|
<PieChart id={id} config={config} data={data} {...props} />
|
|
109
125
|
) : (
|
|
110
|
-
<CartesianChart id={id} config={config} data={data} {...props} />
|
|
126
|
+
<CartesianChart id={id} config={config} data={data} active={active} {...props} />
|
|
111
127
|
)}
|
|
112
128
|
</chartContext.Provider>
|
|
113
129
|
);
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import React, { forwardRef, memo, useRef } from "react";
|
|
2
2
|
import { scaleLinear } from "d3-scale";
|
|
3
|
+
import { mathR } from "../utils";
|
|
3
4
|
|
|
4
5
|
export default memo(forwardRef((props, ref) => {
|
|
5
6
|
const {
|
|
6
|
-
actions:{ setX, setWorking,
|
|
7
|
+
actions:{ setX, setWorking, setControlWidth },
|
|
7
8
|
props: {
|
|
8
|
-
control:{ height, color, drag:{ color:dragColor
|
|
9
|
+
control:{ height, color, gap, drag:{ color:dragColor }, margin:{ left } },
|
|
10
|
+
controlInfo:{ cWidth, cBarWidth },
|
|
11
|
+
axes, series, top, bandLength
|
|
9
12
|
}
|
|
10
13
|
} = props;
|
|
11
|
-
const barWidth = width-left-right;
|
|
12
14
|
const xAxis = axes.get("x");
|
|
13
15
|
const barRef = useRef();
|
|
14
16
|
|
|
15
17
|
const barStyle={
|
|
16
18
|
position:"absolute",
|
|
17
19
|
top:0,
|
|
18
|
-
width:
|
|
20
|
+
width:cBarWidth,
|
|
19
21
|
display:"flex",
|
|
20
22
|
justifyContent:"space-between",
|
|
21
23
|
background:dragColor
|
|
@@ -34,6 +36,34 @@ export default memo(forwardRef((props, ref) => {
|
|
|
34
36
|
background:"rgb(2, 176, 249)",
|
|
35
37
|
WebkitBackgroundClip:"content-box",
|
|
36
38
|
}
|
|
39
|
+
|
|
40
|
+
//左手柄的鼠标按下逻辑
|
|
41
|
+
const leftDown=()=>{
|
|
42
|
+
const transform = ref.current.style.transform;
|
|
43
|
+
let initX = 0;
|
|
44
|
+
let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
|
|
45
|
+
const rightX = rawTranslateX+cBarWidth;
|
|
46
|
+
const move=(e)=>{
|
|
47
|
+
const { movementX } = e;
|
|
48
|
+
initX = mathR(initX+movementX,[-rawTranslateX, rightX-rawTranslateX]);
|
|
49
|
+
setControlWidth((pre)=>{
|
|
50
|
+
const { cWidth, cBarWidth } = pre;
|
|
51
|
+
const nextBarWidth = mathR(cBarWidth-movementX,[1,rightX]);
|
|
52
|
+
return {
|
|
53
|
+
...pre,
|
|
54
|
+
cBarWidth:nextBarWidth,
|
|
55
|
+
cPercent:nextBarWidth/cWidth,
|
|
56
|
+
cBarX:initX+rawTranslateX
|
|
57
|
+
}
|
|
58
|
+
}, true);
|
|
59
|
+
}
|
|
60
|
+
const up=()=>{
|
|
61
|
+
document.removeEventListener("mousemove",move);
|
|
62
|
+
document.removeEventListener("mouseup",up);
|
|
63
|
+
}
|
|
64
|
+
document.addEventListener("mousemove",move);
|
|
65
|
+
document.addEventListener("mouseup",up);
|
|
66
|
+
}
|
|
37
67
|
//滑块的鼠标按下操作
|
|
38
68
|
const down=()=>{
|
|
39
69
|
const transform = ref.current.style.transform;
|
|
@@ -54,23 +84,36 @@ export default memo(forwardRef((props, ref) => {
|
|
|
54
84
|
setWorking(true);
|
|
55
85
|
}
|
|
56
86
|
// //右手柄的鼠标按下逻辑
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
87
|
+
const rightDown=()=>{
|
|
88
|
+
const transform = ref.current.style.transform;
|
|
89
|
+
let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
|
|
90
|
+
const move=(e)=>{
|
|
91
|
+
const { movementX } = e;
|
|
92
|
+
setControlWidth((pre)=>{
|
|
93
|
+
const { cWidth, cBarWidth } = pre;
|
|
94
|
+
const maxWidth = cWidth-rawTranslateX;
|
|
95
|
+
const nextBarWidth = mathR(cBarWidth+movementX,[1,maxWidth]);
|
|
96
|
+
return {
|
|
97
|
+
...pre,
|
|
98
|
+
cBarWidth:nextBarWidth,
|
|
99
|
+
cPercent:nextBarWidth/cWidth
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const up=()=>{
|
|
104
|
+
document.removeEventListener("mousemove",move);
|
|
105
|
+
document.removeEventListener("mouseup",up);
|
|
106
|
+
}
|
|
107
|
+
document.addEventListener("mousemove",move);
|
|
108
|
+
document.addEventListener("mouseup",up);
|
|
109
|
+
}
|
|
67
110
|
return (
|
|
68
111
|
<div
|
|
69
112
|
style={{
|
|
70
|
-
width:
|
|
113
|
+
width:cWidth,
|
|
71
114
|
height: height,
|
|
72
115
|
backgroundColor: color,
|
|
73
|
-
transform: `translate(${left}px,${top}px)`,
|
|
116
|
+
transform: `translate(${left}px,${top-height+gap}px)`,
|
|
74
117
|
}}
|
|
75
118
|
>
|
|
76
119
|
<svg width="100%" height="100%">
|
|
@@ -97,9 +140,9 @@ export default memo(forwardRef((props, ref) => {
|
|
|
97
140
|
</svg>
|
|
98
141
|
{/* 控制条 */}
|
|
99
142
|
<div ref={ref} style={barStyle}>
|
|
100
|
-
|
|
143
|
+
<div style={{...controllerStyle,transform:"translateX(-6px)"}} onMouseDown={leftDown}></div>
|
|
101
144
|
<div style={dragStyle} onMouseDown={down} ref={barRef}></div>
|
|
102
|
-
|
|
145
|
+
<div style={{...controllerStyle,transform:`translateX(6px)`}} onMouseDown={rightDown}></div>
|
|
103
146
|
</div>
|
|
104
147
|
</div>
|
|
105
148
|
);
|
package/src/components/Line.js
CHANGED
|
@@ -48,7 +48,7 @@ const Area = ({
|
|
|
48
48
|
|
|
49
49
|
return (
|
|
50
50
|
<>
|
|
51
|
-
<path d={areaGen(data)} stroke='none' fill={'url(#' + id + ')'} />
|
|
51
|
+
<path d={areaGen(data)} style={{pointerEvents:"none"}} stroke='none' fill={'url(#' + id + ')'} />
|
|
52
52
|
<defs>
|
|
53
53
|
{type && type == 'pattern' ? (
|
|
54
54
|
<pattern id={id} patternUnits="userSpaceOnUse" width={patternW} height={patternH}>
|
|
@@ -129,7 +129,8 @@ export default memo(
|
|
|
129
129
|
d={path}
|
|
130
130
|
stroke={stroke}
|
|
131
131
|
style={{
|
|
132
|
-
filter:show?`drop-shadow(${shadow.hShadow}px ${shadow.vShadow}px ${shadow.blur}px ${shadow.color})`:"none"
|
|
132
|
+
filter:show?`drop-shadow(${shadow.hShadow}px ${shadow.vShadow}px ${shadow.blur}px ${shadow.color})`:"none",
|
|
133
|
+
pointerEvents:"none"
|
|
133
134
|
}}
|
|
134
135
|
fill='none'
|
|
135
136
|
strokeDasharray={lineType === 'dash' ? '3 3' : null}
|
package/src/hooks/useAxes.js
CHANGED
|
@@ -17,7 +17,8 @@ export default (
|
|
|
17
17
|
axis,
|
|
18
18
|
config,
|
|
19
19
|
isHover,
|
|
20
|
-
controlInfo
|
|
20
|
+
controlInfo,
|
|
21
|
+
active
|
|
21
22
|
) => {
|
|
22
23
|
const { show, interval, duration, hover } = config;
|
|
23
24
|
const { isC, cPercent } = controlInfo;
|
|
@@ -59,7 +60,7 @@ export default (
|
|
|
59
60
|
}, [show, time, tickCount, tickLength]);
|
|
60
61
|
useEffect(() => {
|
|
61
62
|
let handler;
|
|
62
|
-
if (!(hover && isHover) && show && time && tickLength > tickCount) {
|
|
63
|
+
if (!(hover && isHover) && show && time && tickLength > tickCount && active) {
|
|
63
64
|
handler = setInterval(() => {
|
|
64
65
|
setStatus(({ currentIndex }) => {
|
|
65
66
|
const tmp = +currentIndex + 1;
|
|
@@ -73,7 +74,7 @@ export default (
|
|
|
73
74
|
return () => {
|
|
74
75
|
handler && clearInterval(handler);
|
|
75
76
|
};
|
|
76
|
-
}, [show, time, tickCount, tickLength, hover, isHover]);
|
|
77
|
+
}, [show, time, tickCount, tickLength, hover, isHover, active]);
|
|
77
78
|
|
|
78
79
|
useEffect(() => {
|
|
79
80
|
let animation;
|
package/src/hooks/useTooltip.ts
CHANGED
|
@@ -11,6 +11,7 @@ const callback = () => {};
|
|
|
11
11
|
* @param {Number} height 高
|
|
12
12
|
* @param {Number} axisX 类目轴
|
|
13
13
|
* @param {Object} config 轮播动画参数
|
|
14
|
+
* @param {Boolean} active 组件是否处于活跃状态
|
|
14
15
|
* @returns {Object} 返回被选中的名称,坐标,选中方法
|
|
15
16
|
*/
|
|
16
17
|
type Props = {
|
|
@@ -22,6 +23,7 @@ type Props = {
|
|
|
22
23
|
axisX: any;
|
|
23
24
|
isHover: boolean;
|
|
24
25
|
config: { auto?: boolean; interval?: number; manual?: boolean };
|
|
26
|
+
active:boolean
|
|
25
27
|
};
|
|
26
28
|
|
|
27
29
|
export default ({
|
|
@@ -33,6 +35,7 @@ export default ({
|
|
|
33
35
|
axisX,
|
|
34
36
|
isHover,
|
|
35
37
|
config: { auto, interval = 0, manual } = {},
|
|
38
|
+
active
|
|
36
39
|
}: Props) => {
|
|
37
40
|
const [currentIndex, setCurrentIndex] = useState<number | null>(null);
|
|
38
41
|
const tickLength = axisX.allTicks.length;
|
|
@@ -73,7 +76,7 @@ export default ({
|
|
|
73
76
|
[svg, marginLeft, axisX, auto]
|
|
74
77
|
);
|
|
75
78
|
useEffect(() => {
|
|
76
|
-
const on = auto && tickLength && !isHover;
|
|
79
|
+
const on = auto && tickLength && !isHover && active;
|
|
77
80
|
// if (!!on) setCurrentIndex(0);
|
|
78
81
|
const intervalHandler = on
|
|
79
82
|
? setInterval(() => {
|
|
@@ -90,7 +93,7 @@ export default ({
|
|
|
90
93
|
return () => {
|
|
91
94
|
intervalHandler && clearInterval(intervalHandler);
|
|
92
95
|
};
|
|
93
|
-
}, [auto, tickLength, interval, isHover]);
|
|
96
|
+
}, [auto, tickLength, interval, isHover, active]);
|
|
94
97
|
const name = currentIndex === null ? null : axisX.allTicks[currentIndex];
|
|
95
98
|
return {
|
|
96
99
|
name,
|
package/src/utils/index.js
CHANGED
|
@@ -723,6 +723,12 @@ const reduceConfig = (config = []) => {
|
|
|
723
723
|
return output;
|
|
724
724
|
};
|
|
725
725
|
|
|
726
|
+
//限制value的值在min和max之间
|
|
727
|
+
const mathR=(value, range)=>{
|
|
728
|
+
const [min,max] = range;
|
|
729
|
+
return Math.max(min,Math.min(value,max));
|
|
730
|
+
}
|
|
731
|
+
|
|
726
732
|
export {
|
|
727
733
|
dateFormat,
|
|
728
734
|
getBreakWord,
|
|
@@ -754,4 +760,5 @@ export {
|
|
|
754
760
|
getDataWithPercent,
|
|
755
761
|
reduceConfig,
|
|
756
762
|
getSeriesInfo,
|
|
763
|
+
mathR
|
|
757
764
|
};
|