@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.
@@ -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(), unit && /*#__PURE__*/_react["default"].createElement(Unit, {
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
- controlEl.current.style.transform = "translate(".concat(moveLen, "px,0)"); //计算出当前位移的百分比
246
+ setControlInfo(function (pre) {
247
+ return _objectSpread(_objectSpread({}, pre), {}, {
248
+ cBarX: moveLen
249
+ });
250
+ });
251
+ };
233
252
 
234
- var percent = moveLen / (cWidth - cBarWidth);
235
- var translateX = -(controlEnd + start / cPercent - chartWidth) * percent;
236
- curControlPercent.current = percent;
237
- seriesEl.current.style.transform = "translate(".concat(translateX, "px,").concat(marginTop, "px)");
238
- axisElList.current[2].style.transform = "translate(".concat(translateX, "px,", 0, "px)");
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
- setControlInfo: setControlInfo
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
  }
@@ -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
- setControlInfo = _props$actions.setControlInfo,
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
- _props$props$control$ = _props$props$control.drag,
36
- dragColor = _props$props$control$.color,
37
- dragWidth = _props$props$control$.width,
38
- _props$props$control$2 = _props$props$control.margin,
39
- left = _props$props$control$2.left,
40
- right = _props$props$control$2.right,
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: barWidth * dragWidth / 100,
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: barWidth,
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
 
@@ -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,
@@ -429,7 +429,7 @@ var _default = function _default(_ref) {
429
429
  });
430
430
  tmp.get("x") && (tmp.get("x").positions = xAxisPositions);
431
431
  return tmp;
432
- }, [axes]);
432
+ }, [axes, controlInfo]);
433
433
 
434
434
  return _axes;
435
435
  };
@@ -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,
@@ -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,
@@ -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.reduceConfig = reduceConfig;
916
+ exports.mathR = mathR;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easyv/charts",
3
- "version": "1.4.39",
3
+ "version": "1.5.0",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -37,12 +37,13 @@ const defaultFormatter: (
37
37
  const getAxesPath: (
38
38
  orientation: Orientation,
39
39
  { width, height }: Context,
40
- cHeight:number
41
- ) => string = (orientation, { width, height }, cHeight) => {
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
- controlEl.current.style.transform = `translate(${moveLen}px,0)`;
207
- //计算出当前位移的百分比
208
- const percent = moveLen / (cWidth - cBarWidth);
209
- const translateX = -(controlEnd + start/cPercent - chartWidth) * percent;
210
- curControlPercent.current = percent;
211
- seriesEl.current.style.transform = `translate(${translateX}px,${marginTop}px)`;
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
- setControlInfo
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
  }}
@@ -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, setControlInfo },
7
+ actions:{ setX, setWorking, setControlWidth },
7
8
  props: {
8
- control:{ height, color, drag:{ color:dragColor, width:dragWidth }, margin:{ left, right } }, axes, series, width, top, bandLength
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:barWidth*dragWidth/100,
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
- // const rightDown=()=>{
58
-
59
- // const move=(e)=>{
60
-
61
- // }
62
- // const up=()=>{
63
-
64
- // }
65
- // document.addEventListener()
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: barWidth,
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
- {/* <div style={{...controllerStyle,transform:"translateX(-6px)"}}></div> */}
143
+ <div style={{...controllerStyle,transform:"translateX(-6px)"}} onMouseDown={leftDown}></div>
101
144
  <div style={dragStyle} onMouseDown={down} ref={barRef}></div>
102
- {/* <div style={{...controllerStyle,transform:`translateX(6px)`}} onMouseDown={rightDown}></div> */}
145
+ <div style={{...controllerStyle,transform:`translateX(6px)`}} onMouseDown={rightDown}></div>
103
146
  </div>
104
147
  </div>
105
148
  );
@@ -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}
@@ -430,6 +430,6 @@ export default ({
430
430
  });
431
431
  tmp.get("x") && (tmp.get("x").positions = xAxisPositions);
432
432
  return tmp;
433
- }, [axes]);
433
+ }, [axes, controlInfo]);
434
434
  return _axes;
435
435
  };
@@ -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;
@@ -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,
@@ -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
  };