@easyv/charts 1.9.12 → 1.9.14

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.
@@ -23,7 +23,7 @@ var _default = exports["default"] = function _default(_ref) {
23
23
  paddingInner = _ref$config.seriesIntervalWidth,
24
24
  paddingOuter = _ref$config.paddingInner,
25
25
  length = _ref.length;
26
- var isVertical = direction === 'vertical';
26
+ var isVertical = direction === "vertical";
27
27
  var _getSeriesInfo = (0, _utils.getSeriesInfo)({
28
28
  step: step,
29
29
  bandLength: bandLength,
@@ -52,11 +52,12 @@ var getAttr = function getAttr(_ref) {
52
52
  seriesWidth = _ref.seriesWidth,
53
53
  length = _ref.length,
54
54
  x = _ref.x,
55
- y = _ref.y;
55
+ y = _ref.y,
56
+ maxWidth = _ref.maxWidth;
56
57
  var len = length ? length : 0.1; //柱子长度
57
58
  if (isVertical) {
58
59
  return {
59
- width: Math.max(0, len),
60
+ width: maxWidth ? Math.min(Math.max(0, len), maxWidth) : Math.max(0, len),
60
61
  height: Math.max(0, seriesWidth),
61
62
  x: y,
62
63
  y: x,
@@ -69,9 +70,9 @@ var getAttr = function getAttr(_ref) {
69
70
  };
70
71
  } else {
71
72
  return {
72
- x: x,
73
+ x: maxWidth ? seriesWidth > maxWidth ? x + (seriesWidth - maxWidth) / 2 : x : x,
73
74
  y: y,
74
- width: seriesWidth,
75
+ width: maxWidth ? Math.min(seriesWidth, maxWidth) : seriesWidth,
75
76
  height: len,
76
77
  bgAttr: {
77
78
  x: x,
@@ -95,6 +96,8 @@ var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(function (_ref
95
96
  isControlChart = _ref3$isControlChart === void 0 ? false : _ref3$isControlChart,
96
97
  setCtlTip = _ref3.setCtlTip,
97
98
  isXRepeat = _ref3.isXRepeat,
99
+ maxWidth1 = _ref3.maxWidth,
100
+ config = _ref3.config,
98
101
  _ref3$config = _ref3.config,
99
102
  _ref3$config$pattern = _ref3$config.pattern,
100
103
  pattern = _ref3$config$pattern === void 0 ? {} : _ref3$config$pattern,
@@ -125,6 +128,7 @@ var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(function (_ref
125
128
  isClipAxis = _ref3$yAxis.isClipAxis,
126
129
  clipValue = _ref3$yAxis.clipValue,
127
130
  reverse = _ref3$yAxis.reverse;
131
+ var maxWidth = maxWidth1 ? maxWidth1 : config.maxWidth;
128
132
  if (!data.length) return null;
129
133
  var selectConfig = other;
130
134
  if (selectStyle) {
@@ -237,7 +241,8 @@ var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(function (_ref
237
241
  x: positionX,
238
242
  y: positionY,
239
243
  length: Math.abs(y1 - y2),
240
- seriesWidth: seriesWidth
244
+ seriesWidth: seriesWidth,
245
+ maxWidth: maxWidth
241
246
  }),
242
247
  bgAttr = _getAttr.bgAttr,
243
248
  attr = (0, _objectWithoutProperties2["default"])(_getAttr, _excluded3);
@@ -33,6 +33,7 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
33
33
  _ref$config = _ref.config,
34
34
  axesConfig = _ref$config.axes,
35
35
  background = _ref$config.background,
36
+ chart = _ref$config.chart,
36
37
  _ref$config$chart = _ref$config.chart,
37
38
  _ref$config$chart$mar = _ref$config$chart.margin,
38
39
  marginLeft = _ref$config$chart$mar.marginLeft,
@@ -42,6 +43,7 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
42
43
  animation = _ref$config$chart.animation,
43
44
  legend = _ref$config$chart.legend,
44
45
  selectStyle = _ref$config$chart.selectStyle,
46
+ bar = _ref$config$chart.bar,
45
47
  series = _ref$config.series,
46
48
  bandLength = _ref$config.bandLength,
47
49
  tooltip = _ref$config.tooltip,
@@ -71,6 +73,8 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
71
73
  filterData = _ref.filterData,
72
74
  aiFormatter = _ref.aiFormatter,
73
75
  id = _ref.id;
76
+ console.log("chart", chart);
77
+ console.log("bar", bar);
74
78
  var context = (0, _react.useContext)(_context.chartContext);
75
79
  var _useState = (0, _react.useState)(false),
76
80
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
@@ -625,7 +629,8 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref) {
625
629
  indicatorWidth: indicatorWidth,
626
630
  triggerEvents: onInteraction,
627
631
  setCtlTip: setCtlTip,
628
- isXRepeat: isXRepeat
632
+ isXRepeat: isXRepeat,
633
+ maxWidth: bar ? bar.maxWidth : 0
629
634
  }));
630
635
  }), series.map(function (_ref3, index) {
631
636
  var Component = _ref3.Component,
@@ -53,6 +53,7 @@ var Chart = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
53
53
  emit = _ref2.emit,
54
54
  emitEvent = _ref2.emitEvent,
55
55
  props = (0, _objectWithoutProperties2["default"])(_ref2, _excluded);
56
+ console.log("hhh");
56
57
  var width = props.width,
57
58
  height = props.height;
58
59
  var isIOS = (0, _react.useRef)(/iPad|iPhone|iPod|iOS/i.test(navigator.userAgent) || /Mac OS X/i.test(navigator.userAgent) && !/Chrome/i.test(navigator.userAgent));
@@ -229,6 +229,7 @@ var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(/*#__PURE__*/(
229
229
  });
230
230
  document.addEventListener("touchend", _up4);
231
231
  };
232
+ console.log("series", series);
232
233
  return /*#__PURE__*/_react["default"].createElement("div", {
233
234
  style: {
234
235
  width: cWidth,
@@ -21,22 +21,22 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
21
21
  */
22
22
  var getHighlightData = function getHighlightData(data, extent) {
23
23
  switch (extent) {
24
- case 'min':
24
+ case "min":
25
25
  var minData = (0, _d3v.min)(data, function (d) {
26
26
  return d.data.y;
27
27
  });
28
28
  return data.map(function (item) {
29
29
  return _objectSpread(_objectSpread({}, item), {}, {
30
- flag: minData == item.data.y ? 'min' : ''
30
+ flag: minData == item.data.y ? "min" : ""
31
31
  });
32
32
  });
33
- case 'max':
33
+ case "max":
34
34
  var maxData = (0, _d3v.max)(data, function (d) {
35
35
  return d.data.y;
36
36
  });
37
37
  return data.map(function (item) {
38
38
  return _objectSpread(_objectSpread({}, item), {}, {
39
- flag: maxData == item.data.y ? 'max' : ''
39
+ flag: maxData == item.data.y ? "max" : ""
40
40
  });
41
41
  });
42
42
  default:
@@ -48,17 +48,18 @@ var getAttr = function getAttr(_ref) {
48
48
  seriesWidth = _ref.seriesWidth,
49
49
  length = _ref.length,
50
50
  x = _ref.x,
51
- y = _ref.y;
51
+ y = _ref.y,
52
+ maxWidth = _ref.maxWidth;
52
53
  if (isVertical) return {
53
- width: length,
54
+ width: maxWidth ? Math.min(Math.max(0, length), maxWidth) : Math.max(0, length),
54
55
  height: seriesWidth,
55
56
  x: y,
56
57
  y: x
57
58
  };
58
59
  return {
59
- x: x,
60
+ x: maxWidth ? seriesWidth > maxWidth ? x + (seriesWidth - maxWidth) / 2 : x : x,
60
61
  y: y,
61
- width: seriesWidth,
62
+ width: maxWidth ? Math.min(seriesWidth, maxWidth) : seriesWidth,
62
63
  height: length
63
64
  };
64
65
  };
@@ -66,10 +67,12 @@ var getBorderRadius = function getBorderRadius(_ref2) {
66
67
  var isVertical = _ref2.isVertical,
67
68
  positive = _ref2.positive,
68
69
  seriesWidth = _ref2.seriesWidth;
69
- return isVertical ? positive ? '0px ' + seriesWidth + 'px ' + seriesWidth + 'px 0' : seriesWidth + 'px 0 0 ' + seriesWidth + 'px' : positive ? seriesWidth / 2 + 'px ' + seriesWidth / 2 + 'px 0 0' : '0 0 ' + seriesWidth / 2 + 'px ' + seriesWidth / 2 + 'px';
70
+ return isVertical ? positive ? "0px " + seriesWidth + "px " + seriesWidth + "px 0" : seriesWidth + "px 0 0 " + seriesWidth + "px" : positive ? seriesWidth / 2 + "px " + seriesWidth / 2 + "px 0 0" : "0 0 " + seriesWidth / 2 + "px " + seriesWidth / 2 + "px";
70
71
  };
71
72
  var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(function (_ref3) {
72
73
  var triggerClick = _ref3.triggerClick,
74
+ maxWidth1 = _ref3.maxWidth,
75
+ config = _ref3.config,
73
76
  _ref3$config = _ref3.config,
74
77
  _ref3$config$pattern = _ref3$config.pattern,
75
78
  pattern = _ref3$config$pattern === void 0 ? {} : _ref3$config$pattern,
@@ -93,6 +96,9 @@ var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(function (_ref
93
96
  direction = _ref3$xAxis.direction,
94
97
  yScaler = _ref3.yAxis.scaler,
95
98
  name = _ref3.name;
99
+ console.log("config", BarProp);
100
+ var maxWidth = maxWidth1 ? maxWidth1 : config.maxWidth;
101
+ console.log("maxWidth", maxWidth);
96
102
  if (!data.length) return null;
97
103
  var _getSeriesInfo = (0, _utils.getSeriesInfo)({
98
104
  step: step,
@@ -104,9 +110,9 @@ var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(function (_ref
104
110
  seriesStep = _getSeriesInfo.seriesStep,
105
111
  seriesStart = _getSeriesInfo.seriesStart;
106
112
  var _data = showHighlight ? getHighlightData(data, extent) : data;
107
- var isVertical = direction === 'vertical';
108
- var highlightColor = parseMultiColorToSVG(highlightFill, 'highlight_gradient_' + id + '_' + name);
109
- var color = parseMultiColorToSVG(fill, 'gradient_' + id + '_' + name);
113
+ var isVertical = direction === "vertical";
114
+ var highlightColor = parseMultiColorToSVG(highlightFill, "highlight_gradient_" + id + "_" + name);
115
+ var color = parseMultiColorToSVG(fill, "gradient_" + id + "_" + name);
110
116
  return /*#__PURE__*/_react["default"].createElement("g", {
111
117
  className: "__easyv-band"
112
118
  }, /*#__PURE__*/_react["default"].createElement("defs", null, /*#__PURE__*/_react["default"].createElement("filter", {
@@ -152,8 +158,10 @@ var _default = exports["default"] = /*#__PURE__*/(0, _react.memo)(function (_ref
152
158
  x: positionX,
153
159
  y: positionY,
154
160
  length: Math.abs(y1 - y2),
155
- seriesWidth: seriesWidth
161
+ seriesWidth: seriesWidth,
162
+ maxWidth: maxWidth
156
163
  });
164
+ console.log("attr", attr);
157
165
  return /*#__PURE__*/_react["default"].createElement("g", {
158
166
  key: i,
159
167
  onClick: triggerClick,
@@ -195,7 +203,7 @@ var Column3DSkin = function Column3DSkin(props) {
195
203
  fill: color.fill,
196
204
  style: {
197
205
  transformOrigin: "".concat(x + width / 2, "px ").concat(y + height / 2, "px"),
198
- transform: 'skew(0deg, -45deg)'
206
+ transform: "skew(0deg, -45deg)"
199
207
  }
200
208
  }), /*#__PURE__*/_react["default"].createElement("rect", {
201
209
  width: width / 2,
@@ -227,7 +235,7 @@ function deg2rad(deg) {
227
235
  return deg / AngleTransfromRatio;
228
236
  }
229
237
  function deepCopy(obj) {
230
- if ((0, _typeof2["default"])(obj) == 'object') {
238
+ if ((0, _typeof2["default"])(obj) == "object") {
231
239
  var o;
232
240
  if (Array.isArray(obj)) {
233
241
  o = [];
@@ -247,7 +255,7 @@ function deepCopy(obj) {
247
255
  }
248
256
  }
249
257
  function parseMultiColorToSVG(config, id) {
250
- if (config.type == 'linear') {
258
+ if (config.type == "linear") {
251
259
  var _config$linear = config.linear,
252
260
  stops = _config$linear.stops,
253
261
  opacity = _config$linear.opacity;
@@ -265,14 +273,14 @@ function parseMultiColorToSVG(config, id) {
265
273
  }); //必须排序才能渲染出来
266
274
  return {
267
275
  fill: "url(#".concat(id, ")"),
268
- def: /*#__PURE__*/_react["default"].createElement('linearGradient', {
276
+ def: /*#__PURE__*/_react["default"].createElement("linearGradient", {
269
277
  id: id,
270
278
  x2: start[0],
271
279
  y2: start[1],
272
280
  x1: end[0],
273
281
  y1: end[1]
274
282
  }, _stops.map(function (e) {
275
- return /*#__PURE__*/_react["default"].createElement('stop', {
283
+ return /*#__PURE__*/_react["default"].createElement("stop", {
276
284
  key: e.offset,
277
285
  offset: e.offset / 100,
278
286
  stopColor: e.color,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easyv/charts",
3
- "version": "1.9.12",
3
+ "version": "1.9.14",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * 轴类图背景
3
3
  */
4
- import React from 'react';
5
- import { getSeriesInfo } from '../utils';
4
+ import React from "react";
5
+ import { getSeriesInfo } from "../utils";
6
6
 
7
7
  export default ({
8
8
  axis: { ticks, scaler, step, direction },
@@ -28,7 +28,7 @@ export default ({
28
28
  };
29
29
  length: number;
30
30
  }) => {
31
- const isVertical: boolean = direction === 'vertical';
31
+ const isVertical: boolean = direction === "vertical";
32
32
 
33
33
  const { width: bandwidth } = getSeriesInfo({
34
34
  step,
@@ -54,7 +54,7 @@ export default ({
54
54
  x={isVertical ? 0 : scaler(tick) - bandwidth / 2}
55
55
  y={isVertical ? scaler(tick) - bandwidth / 2 : 0}
56
56
  fill={background}
57
- stroke='none'
57
+ stroke="none"
58
58
  />
59
59
  );
60
60
  });
@@ -30,17 +30,19 @@ const getAttr = ({
30
30
  length,
31
31
  x,
32
32
  y,
33
+ maxWidth,
33
34
  }: {
34
35
  isVertical: boolean;
35
36
  seriesWidth: number;
36
37
  length: number;
37
38
  x: number;
38
39
  y: number;
40
+ maxWidth: number;
39
41
  }) => {
40
42
  const len = length ? length : 0.1; //柱子长度
41
43
  if (isVertical) {
42
44
  return {
43
- width: Math.max(0, len),
45
+ width: maxWidth ? Math.min(Math.max(0, len), maxWidth) : Math.max(0, len),
44
46
  height: Math.max(0, seriesWidth),
45
47
  x: y,
46
48
  y: x,
@@ -53,9 +55,13 @@ const getAttr = ({
53
55
  };
54
56
  } else {
55
57
  return {
56
- x,
58
+ x: maxWidth
59
+ ? seriesWidth > maxWidth
60
+ ? x + (seriesWidth - maxWidth) / 2
61
+ : x
62
+ : x,
57
63
  y,
58
- width: seriesWidth,
64
+ width: maxWidth ? Math.min(seriesWidth, maxWidth) : seriesWidth,
59
65
  height: len,
60
66
  bgAttr: {
61
67
  x,
@@ -93,6 +99,8 @@ export default memo(
93
99
  isControlChart = false,
94
100
  setCtlTip,
95
101
  isXRepeat,
102
+ maxWidth: maxWidth1,
103
+ config,
96
104
  config: {
97
105
  pattern = {},
98
106
  seriesIntervalWidth: paddingInner = 0,
@@ -114,6 +122,7 @@ export default memo(
114
122
  },
115
123
  yAxis: { scaler: yScaler, isClipAxis, clipValue, reverse },
116
124
  }: any) => {
125
+ const maxWidth = maxWidth1 ? maxWidth1 : config.maxWidth;
117
126
  if (!data.length) return null;
118
127
  let selectConfig = other;
119
128
  if (selectStyle) {
@@ -229,6 +238,7 @@ export default memo(
229
238
  y: positionY,
230
239
  length: Math.abs(y1 - y2),
231
240
  seriesWidth,
241
+ maxWidth,
232
242
  });
233
243
  return (
234
244
  <Fragment key={i}>
@@ -39,11 +39,14 @@ const Chart = memo(
39
39
  config: {
40
40
  axes: axesConfig,
41
41
  background,
42
+ chart,
42
43
  chart: {
43
44
  margin: { marginLeft, marginTop, marginRight, marginBottom },
44
45
  animation,
45
46
  legend,
46
47
  selectStyle,
48
+ bar,
49
+ // bar: { maxWidth = 0 },
47
50
  },
48
51
  series,
49
52
  bandLength,
@@ -638,6 +641,7 @@ const Chart = memo(
638
641
  triggerEvents={onInteraction}
639
642
  setCtlTip={setCtlTip}
640
643
  isXRepeat={isXRepeat}
644
+ maxWidth={bar ? bar.maxWidth : 0}
641
645
  />
642
646
  )
643
647
  );
@@ -3,240 +3,288 @@ import { chartContext } from "../context";
3
3
  import { scaleLinear } from "d3-scale";
4
4
  import { mathR } from "../utils";
5
5
 
6
- export default memo(forwardRef((props, ref) => {
7
- const {
8
- actions:{ setX, setWorking, setControlWidth },
9
- props: {
10
- control:{thumbnail, height, color, gap, drag:{ color:dragColor }, margin:{ left } },
11
- controlInfo:{ cWidth, cBarWidth },
12
- axes, series, top, bandLength
13
- }
14
- } = props;
15
- const context = useContext(chartContext);
16
- const scale = context.scale;
17
- const xAxis = axes.get("x");
18
- const barRef = useRef();
19
-
20
- const barStyle={
21
- position:"absolute",
22
- top:0,
23
- width:cBarWidth,
24
- display:"flex",
25
- justifyContent:"space-between",
26
- background:dragColor
27
- }
28
- const dragStyle={
29
- height,
30
- flex:1,
31
- cursor:"move"
32
- }
33
- const controllerStyle={
34
- position:"relative",
35
- width:12,
36
- height,
37
- padding:"0 5px",
38
- cursor:"col-resize",
39
- background:"rgb(2, 176, 249)",
40
- WebkitBackgroundClip:"content-box",
41
- }
42
-
43
- //左手柄的鼠标按下逻辑
44
- const leftDown=()=>{
45
- const transform = ref.current.style.transform;
46
- let initX = 0;
47
- let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
48
- const rightX = rawTranslateX+cBarWidth;
49
- const move=(e)=>{
50
- const { movementX:ex } = e;
51
- const movementX = ex * scale.current[0];
52
- initX = mathR(initX+movementX,[-rawTranslateX, rightX-rawTranslateX]);
53
- setControlWidth((pre)=>{
54
- const { cWidth, cBarWidth } = pre;
55
- const nextBarWidth = mathR(cBarWidth-movementX,[1,rightX]);
56
- return {
57
- ...pre,
58
- cBarWidth:nextBarWidth,
59
- cPercent:nextBarWidth/cWidth,
60
- cBarX:initX+rawTranslateX
61
- }
62
- }, true);
63
- }
64
- const up=()=>{
65
- document.removeEventListener("mousemove",move);
66
- document.removeEventListener("mouseup",up);
67
- }
68
- document.addEventListener("mousemove",move);
69
- document.addEventListener("mouseup",up);
70
- }
71
- //左手手柄的移动端适配
72
- const leftTouchStart = (e)=>{
73
- const transform = ref.current.style.transform;
74
- let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
75
- let initX = 0;
76
- const rightX = rawTranslateX+cBarWidth;
77
- let startX = e.touches[0].clientX;
78
- let currentX = 0;
79
- let movementX = 0;
80
- const move = (e)=>{
81
- e.preventDefault();
82
- currentX = e.touches[0].clientX;
83
- movementX = currentX - startX;
84
- startX = currentX;
85
- initX = mathR(initX+movementX,[-rawTranslateX, rightX-rawTranslateX]);
86
- setControlWidth((pre)=>{
87
- const { cWidth, cBarWidth } = pre;
88
- const nextBarWidth = mathR(cBarWidth-movementX,[1,rightX]);
89
- return {
90
- ...pre,
91
- cBarWidth:nextBarWidth,
92
- cPercent:nextBarWidth/cWidth,
93
- cBarX:initX+rawTranslateX
94
- }
95
- });
96
- }
97
- const up = (e) => {
98
- document.removeEventListener("touchmove", move);
99
- document.removeEventListener("touchend", up);
6
+ export default memo(
7
+ forwardRef((props, ref) => {
8
+ const {
9
+ actions: { setX, setWorking, setControlWidth },
10
+ props: {
11
+ control: {
12
+ thumbnail,
13
+ height,
14
+ color,
15
+ gap,
16
+ drag: { color: dragColor },
17
+ margin: { left },
18
+ },
19
+ controlInfo: { cWidth, cBarWidth },
20
+ axes,
21
+ series,
22
+ top,
23
+ bandLength,
24
+ },
25
+ } = props;
26
+ const context = useContext(chartContext);
27
+ const scale = context.scale;
28
+ const xAxis = axes.get("x");
29
+ const barRef = useRef();
30
+
31
+ const barStyle = {
32
+ position: "absolute",
33
+ top: 0,
34
+ width: cBarWidth,
35
+ display: "flex",
36
+ justifyContent: "space-between",
37
+ background: dragColor,
100
38
  };
101
- document.addEventListener("touchmove", move, {passive:false});
102
- document.addEventListener("touchend", up);
103
- }
104
- //滑块的鼠标按下操作
105
- const down=()=>{
106
- const transform = ref.current.style.transform;
107
- let movementX = 0;
108
- let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
109
- const mouseMoveHandle = (e) => {
110
- //当前位移的距离
111
- movementX += e.movementX * scale.current[0];
112
- setX(movementX + rawTranslateX,true);
39
+ const dragStyle = {
40
+ height,
41
+ flex: 1,
42
+ cursor: "move",
113
43
  };
114
- const mouseUpHandle = (e) => {
115
- setWorking(false);
116
- document.removeEventListener("mousemove", mouseMoveHandle);
117
- document.removeEventListener("mouseup", mouseUpHandle);
44
+ const controllerStyle = {
45
+ position: "relative",
46
+ width: 12,
47
+ height,
48
+ padding: "0 5px",
49
+ cursor: "col-resize",
50
+ background: "rgb(2, 176, 249)",
51
+ WebkitBackgroundClip: "content-box",
118
52
  };
119
- document.addEventListener("mousemove", mouseMoveHandle);
120
- document.addEventListener("mouseup", mouseUpHandle);
121
- setWorking(true);
122
- }
123
- //移动端适配
124
- const touchStart=(e)=>{
125
- const transform = ref.current.style.transform;
126
- let startX = e.touches[0].clientX;
127
- let currentX = 0;
128
- let movementX = 0;
129
- let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
130
- const mouseMoveHandle = (e)=>{
131
- e.preventDefault();
132
- currentX = e.touches[0].clientX;
133
- movementX += currentX - startX;
134
- startX = currentX;
135
- setX(movementX + rawTranslateX, true);
136
- }
137
- const mouseUpHandle = (e) => {
138
- setWorking(false);
139
- document.removeEventListener("touchmove", mouseMoveHandle);
140
- document.removeEventListener("touchend", mouseUpHandle);
53
+
54
+ //左手柄的鼠标按下逻辑
55
+ const leftDown = () => {
56
+ const transform = ref.current.style.transform;
57
+ let initX = 0;
58
+ let rawTranslateX = parseFloat(
59
+ transform ? transform.match(/\d+\.*\d*/)[0] : 0
60
+ );
61
+ const rightX = rawTranslateX + cBarWidth;
62
+ const move = (e) => {
63
+ const { movementX: ex } = e;
64
+ const movementX = ex * scale.current[0];
65
+ initX = mathR(initX + movementX, [
66
+ -rawTranslateX,
67
+ rightX - rawTranslateX,
68
+ ]);
69
+ setControlWidth((pre) => {
70
+ const { cWidth, cBarWidth } = pre;
71
+ const nextBarWidth = mathR(cBarWidth - movementX, [1, rightX]);
72
+ return {
73
+ ...pre,
74
+ cBarWidth: nextBarWidth,
75
+ cPercent: nextBarWidth / cWidth,
76
+ cBarX: initX + rawTranslateX,
77
+ };
78
+ }, true);
79
+ };
80
+ const up = () => {
81
+ document.removeEventListener("mousemove", move);
82
+ document.removeEventListener("mouseup", up);
83
+ };
84
+ document.addEventListener("mousemove", move);
85
+ document.addEventListener("mouseup", up);
141
86
  };
142
- document.addEventListener("touchmove", mouseMoveHandle, {passive:false});
143
- document.addEventListener("touchend", mouseUpHandle);
144
- setWorking(true);
145
- }
146
- //右手柄的鼠标按下逻辑
147
- const rightDown=()=>{
148
- const transform = ref.current.style.transform;
149
- let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
150
- const move=(e)=>{
151
- const { movementX:ex } = e;
152
- const movementX = ex * scale.current[0];
153
- setControlWidth((pre)=>{
154
- const { cWidth, cBarWidth } = pre;
155
- const maxWidth = cWidth-rawTranslateX;
156
- const nextBarWidth = mathR(cBarWidth+movementX,[1,maxWidth]);
157
- return {
158
- ...pre,
159
- cBarWidth:nextBarWidth,
160
- cPercent:nextBarWidth/cWidth
161
- }
162
- });
163
- }
164
- const up=()=>{
165
- document.removeEventListener("mousemove",move);
166
- document.removeEventListener("mouseup",up);
167
- }
168
- document.addEventListener("mousemove",move);
169
- document.addEventListener("mouseup",up);
170
- }
171
- //右手手柄的移动端适配
172
- const rightTouchStart = (e)=>{
173
- const transform = ref.current.style.transform;
174
- let startX = e.touches[0].clientX;
175
- let currentX = 0;
176
- let movementX = 0;
177
- let rawTranslateX = parseFloat(transform?transform.match(/\d+\.*\d*/)[0]:0);
178
- const move = (e)=>{
179
- e.preventDefault();
180
- currentX = e.touches[0].clientX;
181
- movementX = currentX - startX;
182
- startX = currentX;
183
- setControlWidth((pre)=>{
184
- const { cWidth, cBarWidth } = pre;
185
- const maxWidth = cWidth-rawTranslateX;
186
- const nextBarWidth = mathR(cBarWidth+movementX,[1,maxWidth]);
187
- return {
188
- ...pre,
189
- cBarWidth:nextBarWidth,
190
- cPercent:nextBarWidth/cWidth
191
- }
87
+ //左手手柄的移动端适配
88
+ const leftTouchStart = (e) => {
89
+ const transform = ref.current.style.transform;
90
+ let rawTranslateX = parseFloat(
91
+ transform ? transform.match(/\d+\.*\d*/)[0] : 0
92
+ );
93
+ let initX = 0;
94
+ const rightX = rawTranslateX + cBarWidth;
95
+ let startX = e.touches[0].clientX;
96
+ let currentX = 0;
97
+ let movementX = 0;
98
+ const move = (e) => {
99
+ e.preventDefault();
100
+ currentX = e.touches[0].clientX;
101
+ movementX = currentX - startX;
102
+ startX = currentX;
103
+ initX = mathR(initX + movementX, [
104
+ -rawTranslateX,
105
+ rightX - rawTranslateX,
106
+ ]);
107
+ setControlWidth((pre) => {
108
+ const { cWidth, cBarWidth } = pre;
109
+ const nextBarWidth = mathR(cBarWidth - movementX, [1, rightX]);
110
+ return {
111
+ ...pre,
112
+ cBarWidth: nextBarWidth,
113
+ cPercent: nextBarWidth / cWidth,
114
+ cBarX: initX + rawTranslateX,
115
+ };
116
+ });
117
+ };
118
+ const up = (e) => {
119
+ document.removeEventListener("touchmove", move);
120
+ document.removeEventListener("touchend", up);
121
+ };
122
+ document.addEventListener("touchmove", move, { passive: false });
123
+ document.addEventListener("touchend", up);
124
+ };
125
+ //滑块的鼠标按下操作
126
+ const down = () => {
127
+ const transform = ref.current.style.transform;
128
+ let movementX = 0;
129
+ let rawTranslateX = parseFloat(
130
+ transform ? transform.match(/\d+\.*\d*/)[0] : 0
131
+ );
132
+ const mouseMoveHandle = (e) => {
133
+ //当前位移的距离
134
+ movementX += e.movementX * scale.current[0];
135
+ setX(movementX + rawTranslateX, true);
136
+ };
137
+ const mouseUpHandle = (e) => {
138
+ setWorking(false);
139
+ document.removeEventListener("mousemove", mouseMoveHandle);
140
+ document.removeEventListener("mouseup", mouseUpHandle);
141
+ };
142
+ document.addEventListener("mousemove", mouseMoveHandle);
143
+ document.addEventListener("mouseup", mouseUpHandle);
144
+ setWorking(true);
145
+ };
146
+ //移动端适配
147
+ const touchStart = (e) => {
148
+ const transform = ref.current.style.transform;
149
+ let startX = e.touches[0].clientX;
150
+ let currentX = 0;
151
+ let movementX = 0;
152
+ let rawTranslateX = parseFloat(
153
+ transform ? transform.match(/\d+\.*\d*/)[0] : 0
154
+ );
155
+ const mouseMoveHandle = (e) => {
156
+ e.preventDefault();
157
+ currentX = e.touches[0].clientX;
158
+ movementX += currentX - startX;
159
+ startX = currentX;
160
+ setX(movementX + rawTranslateX, true);
161
+ };
162
+ const mouseUpHandle = (e) => {
163
+ setWorking(false);
164
+ document.removeEventListener("touchmove", mouseMoveHandle);
165
+ document.removeEventListener("touchend", mouseUpHandle);
166
+ };
167
+ document.addEventListener("touchmove", mouseMoveHandle, {
168
+ passive: false,
192
169
  });
193
- }
194
- const up = (e) => {
195
- document.removeEventListener("touchmove", move);
196
- document.removeEventListener("touchend", up);
170
+ document.addEventListener("touchend", mouseUpHandle);
171
+ setWorking(true);
172
+ };
173
+ //右手柄的鼠标按下逻辑
174
+ const rightDown = () => {
175
+ const transform = ref.current.style.transform;
176
+ let rawTranslateX = parseFloat(
177
+ transform ? transform.match(/\d+\.*\d*/)[0] : 0
178
+ );
179
+ const move = (e) => {
180
+ const { movementX: ex } = e;
181
+ const movementX = ex * scale.current[0];
182
+ setControlWidth((pre) => {
183
+ const { cWidth, cBarWidth } = pre;
184
+ const maxWidth = cWidth - rawTranslateX;
185
+ const nextBarWidth = mathR(cBarWidth + movementX, [1, maxWidth]);
186
+ return {
187
+ ...pre,
188
+ cBarWidth: nextBarWidth,
189
+ cPercent: nextBarWidth / cWidth,
190
+ };
191
+ });
192
+ };
193
+ const up = () => {
194
+ document.removeEventListener("mousemove", move);
195
+ document.removeEventListener("mouseup", up);
196
+ };
197
+ document.addEventListener("mousemove", move);
198
+ document.addEventListener("mouseup", up);
197
199
  };
198
- document.addEventListener("touchmove", move, {passive:false});
199
- document.addEventListener("touchend", up);
200
- }
201
- return (
202
- <div
203
- style={{
204
- width:cWidth,
205
- height: height,
206
- backgroundColor: color,
207
- transform: `translate(${left}px,${top-height+gap}px)`,
208
- }}
209
- >
210
- <svg width="100%" height="100%" style={{display:thumbnail?"block":"none"}} >
211
- {series.map(({ Component, yOrZ, ...config }, index) => {
212
- const yAxis = axes.get(yOrZ);
213
- const cloneYAxis = JSON.parse(JSON.stringify(yAxis));
214
- //todo range
215
- cloneYAxis.scaler = scaleLinear()
216
- .domain(yAxis.domain)
217
- .range([height, 0]);
218
- return (
219
- yAxis &&
220
- Component && (
221
- <Component
222
- key={index}
223
- {...config}
224
- bandLength={bandLength}
225
- xAxis={xAxis}
226
- yAxis={cloneYAxis}
227
- triggerClick={()=>{}}
228
- />
229
- )
230
- );
231
- })}
232
- </svg>
233
- {/* 控制条 */}
234
- <div ref={ref} style={barStyle}>
235
- <div style={{...controllerStyle,transform:"translateX(-6px)"}} onMouseDown={leftDown} onTouchStart={leftTouchStart}></div>
236
- <div style={dragStyle} onMouseDown={down} onTouchStart={touchStart} ref={barRef}></div>
237
- <div style={{...controllerStyle,transform:`translateX(6px)`}} onMouseDown={rightDown} onTouchStart={rightTouchStart}></div>
200
+ //右手手柄的移动端适配
201
+ const rightTouchStart = (e) => {
202
+ const transform = ref.current.style.transform;
203
+ let startX = e.touches[0].clientX;
204
+ let currentX = 0;
205
+ let movementX = 0;
206
+ let rawTranslateX = parseFloat(
207
+ transform ? transform.match(/\d+\.*\d*/)[0] : 0
208
+ );
209
+ const move = (e) => {
210
+ e.preventDefault();
211
+ currentX = e.touches[0].clientX;
212
+ movementX = currentX - startX;
213
+ startX = currentX;
214
+ setControlWidth((pre) => {
215
+ const { cWidth, cBarWidth } = pre;
216
+ const maxWidth = cWidth - rawTranslateX;
217
+ const nextBarWidth = mathR(cBarWidth + movementX, [1, maxWidth]);
218
+ return {
219
+ ...pre,
220
+ cBarWidth: nextBarWidth,
221
+ cPercent: nextBarWidth / cWidth,
222
+ };
223
+ });
224
+ };
225
+ const up = (e) => {
226
+ document.removeEventListener("touchmove", move);
227
+ document.removeEventListener("touchend", up);
228
+ };
229
+ document.addEventListener("touchmove", move, { passive: false });
230
+ document.addEventListener("touchend", up);
231
+ };
232
+ return (
233
+ <div
234
+ style={{
235
+ width: cWidth,
236
+ height: height,
237
+ backgroundColor: color,
238
+ transform: `translate(${left}px,${top - height + gap}px)`,
239
+ }}
240
+ >
241
+ <svg
242
+ width="100%"
243
+ height="100%"
244
+ style={{ display: thumbnail ? "block" : "none" }}
245
+ >
246
+ {series.map(({ Component, yOrZ, ...config }, index) => {
247
+ const yAxis = axes.get(yOrZ);
248
+ const cloneYAxis = JSON.parse(JSON.stringify(yAxis));
249
+ //todo range
250
+ cloneYAxis.scaler = scaleLinear()
251
+ .domain(yAxis.domain)
252
+ .range([height, 0]);
253
+ return (
254
+ yAxis &&
255
+ Component && (
256
+ <Component
257
+ key={index}
258
+ {...config}
259
+ bandLength={bandLength}
260
+ xAxis={xAxis}
261
+ yAxis={cloneYAxis}
262
+ triggerClick={() => {}}
263
+ />
264
+ )
265
+ );
266
+ })}
267
+ </svg>
268
+ {/* 控制条 */}
269
+ <div ref={ref} style={barStyle}>
270
+ <div
271
+ style={{ ...controllerStyle, transform: "translateX(-6px)" }}
272
+ onMouseDown={leftDown}
273
+ onTouchStart={leftTouchStart}
274
+ ></div>
275
+ <div
276
+ style={dragStyle}
277
+ onMouseDown={down}
278
+ onTouchStart={touchStart}
279
+ ref={barRef}
280
+ ></div>
281
+ <div
282
+ style={{ ...controllerStyle, transform: `translateX(6px)` }}
283
+ onMouseDown={rightDown}
284
+ onTouchStart={rightTouchStart}
285
+ ></div>
286
+ </div>
238
287
  </div>
239
- </div>
240
- );
241
- }))
242
-
288
+ );
289
+ })
290
+ );
@@ -1,23 +1,23 @@
1
1
  /**
2
2
  * 立体柱状图的柱子
3
3
  */
4
- import React, { memo } from 'react';
5
- import { min, max } from 'd3v7';
6
- import { getSeriesInfo } from '../utils';
4
+ import React, { memo } from "react";
5
+ import { min, max } from "d3v7";
6
+ import { getSeriesInfo } from "../utils";
7
7
 
8
8
  const getHighlightData = (data: Array<DataWithBoundType>, extent: string) => {
9
9
  switch (extent) {
10
- case 'min':
10
+ case "min":
11
11
  const minData = min(data, (d: DataWithBoundType) => d.data.y);
12
12
  return data.map((item) => ({
13
13
  ...item,
14
- flag: minData == item.data.y ? 'min' : '',
14
+ flag: minData == item.data.y ? "min" : "",
15
15
  }));
16
- case 'max':
16
+ case "max":
17
17
  const maxData = max(data, (d: DataWithBoundType) => d.data.y);
18
18
  return data.map((item) => ({
19
19
  ...item,
20
- flag: maxData == item.data.y ? 'max' : '',
20
+ flag: maxData == item.data.y ? "max" : "",
21
21
  }));
22
22
  default:
23
23
  return data;
@@ -30,18 +30,32 @@ const getAttr = ({
30
30
  length,
31
31
  x,
32
32
  y,
33
+ maxWidth,
33
34
  }: {
34
35
  isVertical: boolean;
35
36
  seriesWidth: number;
36
37
  length: number;
37
38
  x: number;
38
39
  y: number;
40
+ maxWidth: number;
39
41
  }) => {
40
- if (isVertical) return { width: length, height: seriesWidth, x: y, y: x };
42
+ if (isVertical)
43
+ return {
44
+ width: maxWidth
45
+ ? Math.min(Math.max(0, length), maxWidth)
46
+ : Math.max(0, length),
47
+ height: seriesWidth,
48
+ x: y,
49
+ y: x,
50
+ };
41
51
  return {
42
- x,
52
+ x: maxWidth
53
+ ? seriesWidth > maxWidth
54
+ ? x + (seriesWidth - maxWidth) / 2
55
+ : x
56
+ : x,
43
57
  y,
44
- width: seriesWidth,
58
+ width: maxWidth ? Math.min(seriesWidth, maxWidth) : seriesWidth,
45
59
  height: length,
46
60
  };
47
61
  };
@@ -57,16 +71,18 @@ const getBorderRadius = ({
57
71
  }) => {
58
72
  return isVertical
59
73
  ? positive
60
- ? '0px ' + seriesWidth + 'px ' + seriesWidth + 'px 0'
61
- : seriesWidth + 'px 0 0 ' + seriesWidth + 'px'
74
+ ? "0px " + seriesWidth + "px " + seriesWidth + "px 0"
75
+ : seriesWidth + "px 0 0 " + seriesWidth + "px"
62
76
  : positive
63
- ? seriesWidth / 2 + 'px ' + seriesWidth / 2 + 'px 0 0'
64
- : '0 0 ' + seriesWidth / 2 + 'px ' + seriesWidth / 2 + 'px';
77
+ ? seriesWidth / 2 + "px " + seriesWidth / 2 + "px 0 0"
78
+ : "0 0 " + seriesWidth / 2 + "px " + seriesWidth / 2 + "px";
65
79
  };
66
80
 
67
81
  export default memo(
68
82
  ({
69
83
  triggerClick,
84
+ maxWidth: maxWidth1,
85
+ config,
70
86
  config: {
71
87
  pattern = {},
72
88
  seriesIntervalWidth: paddingInner = 0,
@@ -80,8 +96,9 @@ export default memo(
80
96
  data,
81
97
  xAxis: { scaler: xScaler, step, direction },
82
98
  yAxis: { scaler: yScaler },
83
- name
99
+ name,
84
100
  }: any) => {
101
+ const maxWidth = maxWidth1 ? maxWidth1 : config.maxWidth;
85
102
  if (!data.length) return null;
86
103
  const { seriesWidth, seriesStep, seriesStart } = getSeriesInfo({
87
104
  step,
@@ -91,31 +108,28 @@ export default memo(
91
108
  });
92
109
  const _data = showHighlight ? getHighlightData(data, extent) : data;
93
110
 
94
- const isVertical = direction === 'vertical';
111
+ const isVertical = direction === "vertical";
95
112
 
96
113
  const highlightColor = parseMultiColorToSVG(
97
114
  highlightFill,
98
- 'highlight_gradient_' + id + '_' + name
99
- );
100
- const color = parseMultiColorToSVG(
101
- fill,
102
- 'gradient_' + id + '_' + name
115
+ "highlight_gradient_" + id + "_" + name
103
116
  );
117
+ const color = parseMultiColorToSVG(fill, "gradient_" + id + "_" + name);
104
118
  return (
105
- <g className='__easyv-band'>
119
+ <g className="__easyv-band">
106
120
  <defs>
107
121
  <filter id={`filter_front`}>
108
122
  <feComponentTransfer>
109
- <feFuncR type='linear' slope='0.5' />
110
- <feFuncG type='linear' slope='0.5' />
111
- <feFuncB type='linear' slope='0.5' />
123
+ <feFuncR type="linear" slope="0.5" />
124
+ <feFuncG type="linear" slope="0.5" />
125
+ <feFuncB type="linear" slope="0.5" />
112
126
  </feComponentTransfer>
113
127
  </filter>
114
128
  <filter id={`filter_side`}>
115
129
  <feComponentTransfer>
116
- <feFuncR type='linear' slope='0.7' />
117
- <feFuncG type='linear' slope='0.7' />
118
- <feFuncB type='linear' slope='0.7' />
130
+ <feFuncR type="linear" slope="0.7" />
131
+ <feFuncG type="linear" slope="0.7" />
132
+ <feFuncB type="linear" slope="0.7" />
119
133
  </feComponentTransfer>
120
134
  </filter>
121
135
  {highlightColor.def}
@@ -146,6 +160,7 @@ export default memo(
146
160
  y: positionY,
147
161
  length: Math.abs(y1 - y2),
148
162
  seriesWidth,
163
+ maxWidth,
149
164
  });
150
165
 
151
166
  return (
@@ -175,7 +190,7 @@ const Column3DSkin = function (props: any) {
175
190
  transform: `skew(0deg, 23deg)`,
176
191
  transformOrigin: `${x + width / 2}px ${y + height / 2}px`,
177
192
  opacity: opacity,
178
- cursor:"pointer"
193
+ cursor: "pointer",
179
194
  }}
180
195
  >
181
196
  {color.defs}
@@ -197,7 +212,7 @@ const Column3DSkin = function (props: any) {
197
212
  fill={color.fill}
198
213
  style={{
199
214
  transformOrigin: `${x + width / 2}px ${y + height / 2}px`,
200
- transform: 'skew(0deg, -45deg)',
215
+ transform: "skew(0deg, -45deg)",
201
216
  }}
202
217
  ></rect>
203
218
  {/* 顶部 */}
@@ -233,7 +248,7 @@ function deg2rad(deg: any) {
233
248
  return deg / AngleTransfromRatio;
234
249
  }
235
250
  function deepCopy(obj: any): any {
236
- if (typeof obj == 'object') {
251
+ if (typeof obj == "object") {
237
252
  let o: any;
238
253
  if (Array.isArray(obj)) {
239
254
  o = [];
@@ -252,7 +267,7 @@ function deepCopy(obj: any): any {
252
267
  }
253
268
  }
254
269
  function parseMultiColorToSVG(config: any, id: any) {
255
- if (config.type == 'linear') {
270
+ if (config.type == "linear") {
256
271
  const { stops, opacity } = config.linear;
257
272
  let start = [0, 0.5],
258
273
  end = [1, 0.5];
@@ -267,7 +282,7 @@ function parseMultiColorToSVG(config: any, id: any) {
267
282
  return {
268
283
  fill: `url(#${id})`,
269
284
  def: React.createElement(
270
- 'linearGradient',
285
+ "linearGradient",
271
286
  {
272
287
  id,
273
288
  x2: start[0],
@@ -276,7 +291,7 @@ function parseMultiColorToSVG(config: any, id: any) {
276
291
  y1: end[1],
277
292
  },
278
293
  _stops.map((e: any) => {
279
- return React.createElement('stop', {
294
+ return React.createElement("stop", {
280
295
  key: e.offset,
281
296
  offset: e.offset / 100,
282
297
  stopColor: e.color,