bi-sdk-react 0.0.77 → 0.0.79

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.
@@ -2,9 +2,14 @@ import {
2
2
  AlignCenterOutlined,
3
3
  AlignLeftOutlined,
4
4
  AlignRightOutlined,
5
+ BarChartOutlined,
6
+ DashboardOutlined,
7
+ DotChartOutlined,
5
8
  FontSizeOutlined,
6
9
  FullscreenOutlined,
7
10
  InfoCircleOutlined,
11
+ LineChartOutlined,
12
+ PieChartOutlined,
8
13
  VerticalAlignBottomOutlined,
9
14
  VerticalAlignMiddleOutlined,
10
15
  VerticalAlignTopOutlined,
@@ -22,6 +27,7 @@ import {
22
27
  Radio,
23
28
  Row,
24
29
  Select,
30
+ Slider,
25
31
  Space,
26
32
  Switch,
27
33
  Tooltip,
@@ -41,6 +47,38 @@ import * as ts from "typescript";
41
47
  import { PageContext } from "../../../context/PageContext";
42
48
  import { IconFont } from "../../../icon/IconFont";
43
49
  import type { PropEditorProps } from "./types";
50
+ import styled from "styled-components";
51
+
52
+ const ChartTypeRadio = styled(Radio.Group)`
53
+ display: flex;
54
+ flex-wrap: wrap;
55
+ gap: 8px;
56
+
57
+ .ant-radio-button-wrapper {
58
+ height: unset;
59
+ width: 68px;
60
+ height: 68px;
61
+ border-radius: 4px;
62
+
63
+ .ant-radio-button-label > .ant-flex {
64
+ flex-direction: column;
65
+ align-items: center;
66
+ justify-content: center;
67
+ padding: 8px;
68
+ gap: 4px;
69
+ font-size: 12px;
70
+
71
+ .anticon {
72
+ font-size: 28px;
73
+ color: var(--ant-color-primary);
74
+ }
75
+ }
76
+
77
+ &-checked .anticon {
78
+ color: #ffffff!important;
79
+ }
80
+ }
81
+ `;
44
82
 
45
83
  export type EchartsModel = { script: string; height?: number };
46
84
 
@@ -219,6 +257,8 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
219
257
  const fullRef = useRef<any>(null);
220
258
  const [fullScreen, setFullScreen] = useState(false);
221
259
 
260
+ const [selectSeries, setSelectSeries] = useState<number>(0);
261
+
222
262
  const setScript = (v?: string) =>
223
263
  onChange && onChange({ ...model, script: v || "" });
224
264
  const triggerModel = (key: keyof EchartsModel, value: any) =>
@@ -321,6 +361,34 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
321
361
  existingProp.name,
322
362
  mergedObj,
323
363
  );
364
+ } else if (
365
+ key === "series" &&
366
+ typeof value === "object" &&
367
+ value !== null &&
368
+ !Array.isArray(value) &&
369
+ ts.isArrayLiteralExpression(existingProp.initializer)
370
+ ) {
371
+ // 特殊处理 series:如果现有节点是数组,且补丁是对象,则更新 selectSeries 指定的项
372
+ const elements = [...existingProp.initializer.elements];
373
+ if (selectSeries < elements.length) {
374
+ const existingElement = elements[selectSeries];
375
+ if (ts.isObjectLiteralExpression(existingElement)) {
376
+ elements[selectSeries] = mergeObjectAST(
377
+ existingElement,
378
+ value as any,
379
+ );
380
+ } else {
381
+ elements[selectSeries] = convertToAST(value);
382
+ }
383
+ } else {
384
+ // 如果索引超出范围,添加新元素
385
+ elements[selectSeries] = convertToAST(value);
386
+ }
387
+ properties[existingIndex] = ts.factory.updatePropertyAssignment(
388
+ existingProp,
389
+ existingProp.name,
390
+ ts.factory.createArrayLiteralExpression(elements, true),
391
+ );
324
392
  } else {
325
393
  // 否则直接替换
326
394
  properties[existingIndex] = ts.factory.createPropertyAssignment(
@@ -727,6 +795,7 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
727
795
  title: { textStyle: { color: v.toHexString() } },
728
796
  })
729
797
  }
798
+ allowClear={true}
730
799
  />
731
800
  </Space.Compact>
732
801
  <Space.Compact size="small" style={{ width: "100%" }}>
@@ -775,6 +844,7 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
775
844
  title: { subtextStyle: { color: v.toHexString() } },
776
845
  })
777
846
  }
847
+ allowClear={true}
778
848
  />
779
849
  </Space.Compact>
780
850
  {positionRender("title")}
@@ -808,7 +878,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
808
878
  optionType="button"
809
879
  buttonStyle="solid"
810
880
  value={parseConfig?.legend?.orient || "horizontal"}
811
- onChange={(e) => transformReturn({ legend: { orient: e.target.value } })}
881
+ onChange={(e) =>
882
+ transformReturn({ legend: { orient: e.target.value } })
883
+ }
812
884
  options={[
813
885
  { label: "水平", value: "horizontal" },
814
886
  { label: "垂直", value: "vertical" },
@@ -825,7 +897,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
825
897
  optionType="button"
826
898
  buttonStyle="solid"
827
899
  value={parseConfig?.legend?.align || "auto"}
828
- onChange={(e) => transformReturn({ legend: { align: e.target.value } })}
900
+ onChange={(e) =>
901
+ transformReturn({ legend: { align: e.target.value } })
902
+ }
829
903
  options={[
830
904
  { label: "自动", value: "auto" },
831
905
  { label: "左侧", value: "left" },
@@ -843,7 +917,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
843
917
  value={parseConfig?.legend?.itemGap}
844
918
  min={0}
845
919
  suffix="px"
846
- onChange={(v) => transformReturn({ legend: { itemGap: v } })}
920
+ onChange={(v) =>
921
+ transformReturn({ legend: { itemGap: v } })
922
+ }
847
923
  />
848
924
  </Form.Item>
849
925
  <Form.Item
@@ -856,7 +932,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
856
932
  value={parseConfig?.legend?.itemWidth}
857
933
  min={0}
858
934
  suffix="px"
859
- onChange={(v) => transformReturn({ legend: { itemWidth: v } })}
935
+ onChange={(v) =>
936
+ transformReturn({ legend: { itemWidth: v } })
937
+ }
860
938
  />
861
939
  </Form.Item>
862
940
  <Form.Item
@@ -869,7 +947,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
869
947
  value={parseConfig?.legend?.itemHeight}
870
948
  min={0}
871
949
  suffix="px"
872
- onChange={(v) => transformReturn({ legend: { itemHeight: v } })}
950
+ onChange={(v) =>
951
+ transformReturn({ legend: { itemHeight: v } })
952
+ }
873
953
  />
874
954
  </Form.Item>
875
955
  <Form.Item
@@ -879,7 +959,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
879
959
  >
880
960
  <Input.TextArea
881
961
  value={parseConfig?.legend?.formatter}
882
- onChange={(e) => transformReturn({ legend: { formatter: e.target.value } })}
962
+ onChange={(e) =>
963
+ transformReturn({ legend: { formatter: e.target.value } })
964
+ }
883
965
  />
884
966
  </Form.Item>
885
967
  {positionRender("legend")}
@@ -893,7 +975,7 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
893
975
  extra: (
894
976
  <Switch
895
977
  size="small"
896
- value={!!parseConfig.grid.show}
978
+ value={!!parseConfig?.grid?.show}
897
979
  onChange={(v) => transformReturn({ grid: { show: v } })}
898
980
  />
899
981
  ),
@@ -909,7 +991,11 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
909
991
  optionType="button"
910
992
  buttonStyle="solid"
911
993
  value={parseConfig?.grid?.outerBoundsMode || "auto"}
912
- onChange={(e) => transformReturn({ grid: { outerBoundsMode: e.target.value } })}
994
+ onChange={(e) =>
995
+ transformReturn({
996
+ grid: { outerBoundsMode: e.target.value },
997
+ })
998
+ }
913
999
  options={[
914
1000
  { label: "auto", value: "auto" },
915
1001
  { label: "none", value: "none" },
@@ -925,7 +1011,12 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
925
1011
  <ColorPicker
926
1012
  size="small"
927
1013
  value={parseConfig?.grid?.backgroundColor || "auto"}
928
- onChange={(e) => transformReturn({ grid: { backgroundColor: e.toHexString() } })}
1014
+ onChange={(e) =>
1015
+ transformReturn({
1016
+ grid: { backgroundColor: e.toHexString() },
1017
+ })
1018
+ }
1019
+ allowClear={true}
929
1020
  />
930
1021
  </Form.Item>
931
1022
  <Form.Item
@@ -936,7 +1027,12 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
936
1027
  <ColorPicker
937
1028
  size="small"
938
1029
  value={parseConfig?.grid?.borderColor || "auto"}
939
- onChange={(e) => transformReturn({ grid: { borderColor: e.toHexString() } })}
1030
+ onChange={(e) =>
1031
+ transformReturn({
1032
+ grid: { borderColor: e.toHexString() },
1033
+ })
1034
+ }
1035
+ allowClear={true}
940
1036
  />
941
1037
  </Form.Item>
942
1038
  <Form.Item
@@ -949,7 +1045,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
949
1045
  value={parseConfig?.grid?.borderWidth}
950
1046
  min={0}
951
1047
  suffix="px"
952
- onChange={(v) => transformReturn({ grid: { borderWidth: v } })}
1048
+ onChange={(v) =>
1049
+ transformReturn({ grid: { borderWidth: v } })
1050
+ }
953
1051
  />
954
1052
  </Form.Item>
955
1053
  {positionRender("grid")}
@@ -972,7 +1070,7 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
972
1070
  />
973
1071
  ),
974
1072
  children: (
975
- <Space vertical style={{width: "100%"}}>
1073
+ <Space vertical style={{ width: "100%" }}>
976
1074
  <Form.Item
977
1075
  label="坐标轴名称"
978
1076
  labelCol={{ span: 12 }}
@@ -981,7 +1079,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
981
1079
  <Input
982
1080
  size="small"
983
1081
  value={parseConfig?.xAxis?.name || ""}
984
- onChange={(e) => transformReturn({ xAxis: { name: e.target.value } })}
1082
+ onChange={(e) =>
1083
+ transformReturn({ xAxis: { name: e.target.value } })
1084
+ }
985
1085
  />
986
1086
  </Form.Item>
987
1087
  <Form.Item
@@ -994,7 +1094,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
994
1094
  optionType="button"
995
1095
  buttonStyle="solid"
996
1096
  value={parseConfig?.xAxis?.position || "auto"}
997
- onChange={(e) => transformReturn({ xAxis: { position: e.target.value } })}
1097
+ onChange={(e) =>
1098
+ transformReturn({ xAxis: { position: e.target.value } })
1099
+ }
998
1100
  options={[
999
1101
  { label: "top", value: "top" },
1000
1102
  { label: "bottom", value: "bottom" },
@@ -1011,7 +1113,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1011
1113
  optionType="button"
1012
1114
  buttonStyle="solid"
1013
1115
  value={parseConfig?.xAxis?.type || "category"}
1014
- onChange={(e) => transformReturn({ xAxis: { type: e.target.value } })}
1116
+ onChange={(e) =>
1117
+ transformReturn({ xAxis: { type: e.target.value } })
1118
+ }
1015
1119
  options={[
1016
1120
  { label: "类目轴", value: "category" },
1017
1121
  { label: "数值轴", value: "value" },
@@ -1055,7 +1159,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1055
1159
  size="small"
1056
1160
  value={parseConfig?.xAxis?.nameRotate || 0}
1057
1161
  min={0}
1058
- onChange={(v) => transformReturn({ xAxis: { nameRotate: v } })}
1162
+ onChange={(v) =>
1163
+ transformReturn({ xAxis: { nameRotate: v } })
1164
+ }
1059
1165
  />
1060
1166
  </Form.Item>
1061
1167
  <Form.Item
@@ -1091,7 +1197,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1091
1197
  size="small"
1092
1198
  value={parseConfig?.xAxis?.splitNumber || 5}
1093
1199
  min={0}
1094
- onChange={(v) => transformReturn({ xAxis: { splitNumber: v } })}
1200
+ onChange={(v) =>
1201
+ transformReturn({ xAxis: { splitNumber: v } })
1202
+ }
1095
1203
  />
1096
1204
  </Form.Item>
1097
1205
  <Form.Item
@@ -1103,7 +1211,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1103
1211
  size="small"
1104
1212
  value={parseConfig?.xAxis?.startValue}
1105
1213
  min={0}
1106
- onChange={(v) => transformReturn({ xAxis: { startValue: v } })}
1214
+ onChange={(v) =>
1215
+ transformReturn({ xAxis: { startValue: v } })
1216
+ }
1107
1217
  />
1108
1218
  </Form.Item>
1109
1219
  </Space>
@@ -1125,7 +1235,7 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1125
1235
  />
1126
1236
  ),
1127
1237
  children: (
1128
- <Space vertical style={{width: "100%"}}>
1238
+ <Space vertical style={{ width: "100%" }}>
1129
1239
  <Form.Item
1130
1240
  label="坐标轴名称"
1131
1241
  labelCol={{ span: 12 }}
@@ -1134,7 +1244,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1134
1244
  <Input
1135
1245
  size="small"
1136
1246
  value={parseConfig?.yAxis?.name || ""}
1137
- onChange={(e) => transformReturn({ yAxis: { name: e.target.value } })}
1247
+ onChange={(e) =>
1248
+ transformReturn({ yAxis: { name: e.target.value } })
1249
+ }
1138
1250
  />
1139
1251
  </Form.Item>
1140
1252
  <Form.Item
@@ -1147,7 +1259,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1147
1259
  optionType="button"
1148
1260
  buttonStyle="solid"
1149
1261
  value={parseConfig?.yAxis?.position || "auto"}
1150
- onChange={(e) => transformReturn({ yAxis: { position: e.target.value } })}
1262
+ onChange={(e) =>
1263
+ transformReturn({ yAxis: { position: e.target.value } })
1264
+ }
1151
1265
  options={[
1152
1266
  { label: "left", value: "left" },
1153
1267
  { label: "right", value: "right" },
@@ -1164,7 +1278,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1164
1278
  optionType="button"
1165
1279
  buttonStyle="solid"
1166
1280
  value={parseConfig?.yAxis?.type || "category"}
1167
- onChange={(e) => transformReturn({ yAxis: { type: e.target.value } })}
1281
+ onChange={(e) =>
1282
+ transformReturn({ yAxis: { type: e.target.value } })
1283
+ }
1168
1284
  options={[
1169
1285
  { label: "类目轴", value: "category" },
1170
1286
  { label: "数值轴", value: "value" },
@@ -1208,7 +1324,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1208
1324
  size="small"
1209
1325
  value={parseConfig?.yAxis?.nameRotate || 0}
1210
1326
  min={0}
1211
- onChange={(v) => transformReturn({ yAxis: { nameRotate: v } })}
1327
+ onChange={(v) =>
1328
+ transformReturn({ yAxis: { nameRotate: v } })
1329
+ }
1212
1330
  />
1213
1331
  </Form.Item>
1214
1332
  <Form.Item
@@ -1244,7 +1362,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1244
1362
  size="small"
1245
1363
  value={parseConfig?.yAxis?.splitNumber || 5}
1246
1364
  min={0}
1247
- onChange={(v) => transformReturn({ yAxis: { splitNumber: v } })}
1365
+ onChange={(v) =>
1366
+ transformReturn({ yAxis: { splitNumber: v } })
1367
+ }
1248
1368
  />
1249
1369
  </Form.Item>
1250
1370
  <Form.Item
@@ -1256,7 +1376,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1256
1376
  size="small"
1257
1377
  value={parseConfig?.yAxis?.startValue}
1258
1378
  min={0}
1259
- onChange={(v) => transformReturn({ yAxis: { startValue: v } })}
1379
+ onChange={(v) =>
1380
+ transformReturn({ yAxis: { startValue: v } })
1381
+ }
1260
1382
  />
1261
1383
  </Form.Item>
1262
1384
  </Space>
@@ -1278,7 +1400,7 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1278
1400
  />
1279
1401
  ),
1280
1402
  children: (
1281
- <Space vertical style={{width: "100%"}}>
1403
+ <Space vertical style={{ width: "100%" }}>
1282
1404
  <Form.Item
1283
1405
  label="触发类型"
1284
1406
  labelCol={{ span: 6 }}
@@ -1289,7 +1411,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1289
1411
  optionType="button"
1290
1412
  buttonStyle="solid"
1291
1413
  value={parseConfig?.tooltip?.trigger || "item"}
1292
- onChange={(e) => transformReturn({ tooltip: { trigger: e.target.value } })}
1414
+ onChange={(e) =>
1415
+ transformReturn({ tooltip: { trigger: e.target.value } })
1416
+ }
1293
1417
  options={[
1294
1418
  { label: "item", value: "item" },
1295
1419
  { label: "axis", value: "axis" },
@@ -1307,7 +1431,11 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1307
1431
  optionType="button"
1308
1432
  buttonStyle="solid"
1309
1433
  value={parseConfig?.tooltip?.triggerOn || "item"}
1310
- onChange={(e) => transformReturn({ tooltip: { triggerOn: e.target.value } })}
1434
+ onChange={(e) =>
1435
+ transformReturn({
1436
+ tooltip: { triggerOn: e.target.value },
1437
+ })
1438
+ }
1311
1439
  options={[
1312
1440
  { label: "移动", value: "mousemove" },
1313
1441
  { label: "点击", value: "click" },
@@ -1324,7 +1452,12 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1324
1452
  <ColorPicker
1325
1453
  size="small"
1326
1454
  value={parseConfig?.tooltip?.backgroundColor}
1327
- onChange={(v) => transformReturn({ tooltip: { backgroundColor: v.toHexString() } })}
1455
+ onChange={(v) =>
1456
+ transformReturn({
1457
+ tooltip: { backgroundColor: v.toHexString() },
1458
+ })
1459
+ }
1460
+ allowClear={true}
1328
1461
  />
1329
1462
  </Form.Item>
1330
1463
  <Form.Item
@@ -1335,7 +1468,12 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1335
1468
  <ColorPicker
1336
1469
  size="small"
1337
1470
  value={parseConfig?.tooltip?.borderColor}
1338
- onChange={(v) => transformReturn({ tooltip: { borderColor: v.toHexString() } })}
1471
+ onChange={(v) =>
1472
+ transformReturn({
1473
+ tooltip: { borderColor: v.toHexString() },
1474
+ })
1475
+ }
1476
+ allowClear={true}
1339
1477
  />
1340
1478
  </Form.Item>
1341
1479
  <Form.Item
@@ -1348,7 +1486,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1348
1486
  value={parseConfig?.tooltip?.borderWidth || 0}
1349
1487
  min={0}
1350
1488
  suffix="px"
1351
- onChange={(v) => transformReturn({ tooltip: { borderWidth: v } })}
1489
+ onChange={(v) =>
1490
+ transformReturn({ tooltip: { borderWidth: v } })
1491
+ }
1352
1492
  />
1353
1493
  </Form.Item>
1354
1494
  <Form.Item
@@ -1361,7 +1501,9 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1361
1501
  value={parseConfig?.tooltip?.padding || 5}
1362
1502
  min={0}
1363
1503
  suffix="px"
1364
- onChange={(v) => transformReturn({ tooltip: { padding: v } })}
1504
+ onChange={(v) =>
1505
+ transformReturn({ tooltip: { padding: v } })
1506
+ }
1365
1507
  />
1366
1508
  </Form.Item>
1367
1509
  <Form.Item
@@ -1381,12 +1523,656 @@ export const EchartsProps: React.FC<PropEditorProps<EchartsModel>> = ({
1381
1523
  >
1382
1524
  <Input.TextArea
1383
1525
  value={parseConfig?.tooltip?.formatter}
1384
- onChange={(e) => transformReturn({ tooltip: { formatter: e.target.value } })}
1526
+ onChange={(e) =>
1527
+ transformReturn({
1528
+ tooltip: { formatter: e.target.value },
1529
+ })
1530
+ }
1385
1531
  />
1386
1532
  </Form.Item>
1387
1533
  </Space>
1388
1534
  ),
1389
1535
  },
1536
+ {
1537
+ key: "series",
1538
+ label: "系列",
1539
+ collapsible: "icon",
1540
+ extra: (
1541
+ <Select
1542
+ size="small"
1543
+ options={(parseConfig?.series || []).map(
1544
+ (item: any, index: number) => ({
1545
+ label: item.name || `系列 ${index + 1}`,
1546
+ value: index,
1547
+ }),
1548
+ )}
1549
+ value={selectSeries}
1550
+ onChange={(v) => setSelectSeries(v)}
1551
+ style={{ width: 120 }}
1552
+ />
1553
+ ),
1554
+ children: (
1555
+ <Space vertical style={{ width: "100%" }}>
1556
+ <ChartTypeRadio
1557
+ size="small"
1558
+ optionType="button"
1559
+ buttonStyle="solid"
1560
+ value={parseConfig?.series?.[selectSeries]?.type || "line"}
1561
+ onChange={(e) =>
1562
+ transformReturn({ series: { type: e.target.value } })
1563
+ }
1564
+ options={[
1565
+ {
1566
+ label: (
1567
+ <Flex>
1568
+ <IconFont type="icon-chart-pie" />
1569
+ 饼图
1570
+ </Flex>
1571
+ ),
1572
+ value: "pie",
1573
+ },
1574
+ {
1575
+ label: (
1576
+ <Flex>
1577
+ <IconFont type="icon-chart-line" />
1578
+ 折线图
1579
+ </Flex>
1580
+ ),
1581
+ value: "line",
1582
+ },
1583
+ {
1584
+ label: (
1585
+ <Flex>
1586
+ <IconFont type="icon-chart-bar" />
1587
+ 柱状图
1588
+ </Flex>
1589
+ ),
1590
+ value: "bar",
1591
+ },
1592
+ {
1593
+ label: (
1594
+ <Flex>
1595
+ <IconFont type="icon-chart-scatter" />
1596
+ 散点图
1597
+ </Flex>
1598
+ ),
1599
+ value: "scatter",
1600
+ },
1601
+ {
1602
+ label: (
1603
+ <Flex>
1604
+ <IconFont type="icon-chart-radar" />
1605
+ 雷达图
1606
+ </Flex>
1607
+ ),
1608
+ value: "radar",
1609
+ },
1610
+ {
1611
+ label: (
1612
+ <Flex>
1613
+ <IconFont type="icon-map" />
1614
+ 地图
1615
+ </Flex>
1616
+ ),
1617
+ value: "map",
1618
+ },
1619
+ {
1620
+ label: (
1621
+ <Flex>
1622
+ <IconFont type="icon-chart-gauge" />
1623
+ 仪表盘
1624
+ </Flex>
1625
+ ),
1626
+ value: "gauge",
1627
+ },
1628
+ {
1629
+ label: (
1630
+ <Flex>
1631
+ <IconFont type="icon-chart-funnel" />
1632
+ 漏斗图
1633
+ </Flex>
1634
+ ),
1635
+ value: "funnel",
1636
+ },
1637
+ {
1638
+ label: (
1639
+ <Flex>
1640
+ <IconFont type="icon-chart-treemap" />
1641
+ treemap
1642
+ </Flex>
1643
+ ),
1644
+ value: "treemap",
1645
+ },
1646
+ {
1647
+ label: (
1648
+ <Flex>
1649
+ <IconFont type="icon-chart-sunburst" />
1650
+ 旭日图
1651
+ </Flex>
1652
+ ),
1653
+ value: "sunburst",
1654
+ },
1655
+ {
1656
+ label: (
1657
+ <Flex>
1658
+ <IconFont type="icon-chart-boxplot" />
1659
+ 箱线图
1660
+ </Flex>
1661
+ ),
1662
+ value: "boxplot",
1663
+ },
1664
+ {
1665
+ label: (
1666
+ <Flex>
1667
+ <IconFont type="icon-chart-candlestick" />
1668
+ K线图
1669
+ </Flex>
1670
+ ),
1671
+ value: "candlestick",
1672
+ },
1673
+ {
1674
+ label: (
1675
+ <Flex>
1676
+ <IconFont type="icon-chart-heatmap" />
1677
+ 热力图
1678
+ </Flex>
1679
+ ),
1680
+ value: "heatmap",
1681
+ },
1682
+ {
1683
+ label: (
1684
+ <Flex>
1685
+ <IconFont type="icon-chart-sankey" />
1686
+ 桑基图
1687
+ </Flex>
1688
+ ),
1689
+ value: "sankey",
1690
+ },
1691
+ {
1692
+ label: (
1693
+ <Flex>
1694
+ <IconFont type="icon-chart-theme-river" />
1695
+ 河流图
1696
+ </Flex>
1697
+ ),
1698
+ value: "themeRiver",
1699
+ },
1700
+ {
1701
+ label: (
1702
+ <Flex>
1703
+ <IconFont type="icon-chart-chord" />
1704
+ 和弦图
1705
+ </Flex>
1706
+ ),
1707
+ value: "chord",
1708
+ },
1709
+ ]}
1710
+ />
1711
+ <Form.Item
1712
+ label="系列名称"
1713
+ labelCol={{ span: 6 }}
1714
+ wrapperCol={{ span: 18 }}
1715
+ >
1716
+ <Input
1717
+ size="small"
1718
+ placeholder="请输入系列名称"
1719
+ value={parseConfig?.series?.[selectSeries]?.name || ""}
1720
+ onChange={(e) =>
1721
+ transformReturn({ series: { name: e.target.value } })
1722
+ }
1723
+ style={{ width: 120 }}
1724
+ />
1725
+ </Form.Item>
1726
+ {["line", "bar"].includes(
1727
+ parseConfig?.series?.[selectSeries]?.type || "",
1728
+ ) && (
1729
+ <>
1730
+ <Form.Item
1731
+ label="堆叠组名"
1732
+ labelCol={{ span: 6 }}
1733
+ wrapperCol={{ span: 18 }}
1734
+ >
1735
+ <Input
1736
+ size="small"
1737
+ placeholder="请输入堆叠组名"
1738
+ value={parseConfig?.series?.[selectSeries]?.stack || ""}
1739
+ onChange={(e) =>
1740
+ transformReturn({ series: { stack: e.target.value } })
1741
+ }
1742
+ style={{ width: 120 }}
1743
+ />
1744
+ </Form.Item>
1745
+ <Form.Item
1746
+ label="堆叠计算方式"
1747
+ labelCol={{ span: 8 }}
1748
+ wrapperCol={{ span: 16 }}
1749
+ >
1750
+ <Select
1751
+ size="small"
1752
+ value={
1753
+ parseConfig?.series?.[selectSeries]?.stackStrategy ||
1754
+ "samesign"
1755
+ }
1756
+ onChange={(e) =>
1757
+ transformReturn({
1758
+ series: { stackStrategy: e.target.value },
1759
+ })
1760
+ }
1761
+ options={[
1762
+ { label: "samesign", value: "samesign" },
1763
+ { label: "all", value: "all" },
1764
+ { label: "positive", value: "positive" },
1765
+ { label: "negative", value: "negative" },
1766
+ ]}
1767
+ style={{ width: 120 }}
1768
+ />
1769
+ </Form.Item>
1770
+ <Form.Item
1771
+ label="堆叠顺序"
1772
+ labelCol={{ span: 8 }}
1773
+ wrapperCol={{ span: 16 }}
1774
+ >
1775
+ <Radio.Group
1776
+ size="small"
1777
+ optionType="button"
1778
+ buttonStyle="solid"
1779
+ value={
1780
+ parseConfig?.series?.[selectSeries]?.stackOrder ||
1781
+ "seriesAsc"
1782
+ }
1783
+ onChange={(e) =>
1784
+ transformReturn({
1785
+ series: { stackOrder: e.target.value },
1786
+ })
1787
+ }
1788
+ options={[
1789
+ { label: "顺序", value: "seriesAsc" },
1790
+ { label: "倒序", value: "seriesDesc" },
1791
+ ]}
1792
+ style={{ width: 120 }}
1793
+ />
1794
+ </Form.Item>
1795
+ </>
1796
+ )}
1797
+ {["line", "scatter", "radar"].includes(
1798
+ parseConfig?.series?.[selectSeries]?.type || "",
1799
+ ) && (
1800
+ <>
1801
+ <Form.Item
1802
+ label="显示标记"
1803
+ labelCol={{ span: 12 }}
1804
+ wrapperCol={{ span: 12 }}
1805
+ >
1806
+ <Switch
1807
+ size="small"
1808
+ value={
1809
+ typeof parseConfig?.series?.[selectSeries]
1810
+ ?.showSymbol === "boolean"
1811
+ ? parseConfig?.series?.[selectSeries]?.showSymbol
1812
+ : true
1813
+ }
1814
+ onChange={(v) =>
1815
+ transformReturn({ series: { showSymbol: v } })
1816
+ }
1817
+ />
1818
+ </Form.Item>
1819
+ <Form.Item
1820
+ label="标记图形"
1821
+ labelCol={{ span: 6 }}
1822
+ wrapperCol={{ span: 18 }}
1823
+ >
1824
+ <Select
1825
+ size="small"
1826
+ value={
1827
+ parseConfig?.series?.[selectSeries]?.symbol ||
1828
+ "emptyCircle"
1829
+ }
1830
+ onChange={(v) =>
1831
+ transformReturn({ series: { symbol: v } })
1832
+ }
1833
+ options={[
1834
+ // 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'
1835
+ { label: "空心圆", value: "emptyCircle" },
1836
+ { label: "圆", value: "circle" },
1837
+ { label: "矩形", value: "rect" },
1838
+ { label: "圆角矩形", value: "roundRect" },
1839
+ { label: "三角形", value: "triangle" },
1840
+ { label: "菱形", value: "diamond" },
1841
+ { label: "图钉", value: "pin" },
1842
+ { label: "箭头", value: "arrow" },
1843
+ { label: "无", value: "none" },
1844
+ ]}
1845
+ style={{ width: 120 }}
1846
+ />
1847
+ </Form.Item>
1848
+ <Form.Item
1849
+ label="标记大小"
1850
+ labelCol={{ span: 12 }}
1851
+ wrapperCol={{ span: 12 }}
1852
+ >
1853
+ <InputNumber
1854
+ size="small"
1855
+ value={
1856
+ parseConfig?.series?.[selectSeries]?.symbolSize || 4
1857
+ }
1858
+ min={0}
1859
+ suffix="px"
1860
+ onChange={(v) =>
1861
+ transformReturn({ series: { symbolSize: v } })
1862
+ }
1863
+ />
1864
+ </Form.Item>
1865
+ <Form.Item
1866
+ label="标记角度"
1867
+ labelCol={{ span: 12 }}
1868
+ wrapperCol={{ span: 12 }}
1869
+ >
1870
+ <InputNumber
1871
+ size="small"
1872
+ value={parseConfig?.series?.[selectSeries]?.symbolRotate}
1873
+ min={0}
1874
+ suffix="°"
1875
+ onChange={(v) =>
1876
+ transformReturn({ series: { symbolRotate: v } })
1877
+ }
1878
+ />
1879
+ </Form.Item>
1880
+ </>
1881
+ )}
1882
+ {parseConfig?.series?.[selectSeries]?.type === "line" && (
1883
+ <>
1884
+ <Form.Item
1885
+ label="平滑曲线"
1886
+ labelCol={{ span: 12 }}
1887
+ wrapperCol={{ span: 12 }}
1888
+ >
1889
+ <Switch
1890
+ size="small"
1891
+ value={
1892
+ typeof parseConfig?.series?.[selectSeries]?.smooth ===
1893
+ "boolean"
1894
+ ? parseConfig?.series?.[selectSeries]?.smooth
1895
+ : false
1896
+ }
1897
+ onChange={(v) =>
1898
+ transformReturn({ series: { smooth: v } })
1899
+ }
1900
+ />
1901
+ </Form.Item>
1902
+ <Form.Item
1903
+ label="面积图"
1904
+ labelCol={{ span: 12 }}
1905
+ wrapperCol={{ span: 12 }}
1906
+ >
1907
+ <Switch
1908
+ size="small"
1909
+ value={
1910
+ typeof parseConfig?.series?.[selectSeries]
1911
+ ?.areaStyle === "object"
1912
+ }
1913
+ onChange={(v) =>
1914
+ transformReturn({
1915
+ series: { areaStyle: v ? {} : undefined },
1916
+ })
1917
+ }
1918
+ />
1919
+ </Form.Item>
1920
+ <Form.Item
1921
+ label="面积图填充色"
1922
+ labelCol={{ span: 12 }}
1923
+ wrapperCol={{ span: 12 }}
1924
+ >
1925
+ <ColorPicker
1926
+ size="small"
1927
+ value={
1928
+ parseConfig?.series?.[selectSeries]?.areaStyle?.color ||
1929
+ ""
1930
+ }
1931
+ onChange={(v) =>
1932
+ transformReturn({
1933
+ series: { areaStyle: { color: v.toHexString() } },
1934
+ })
1935
+ }
1936
+ allowClear
1937
+ />
1938
+ </Form.Item>
1939
+ <Form.Item
1940
+ label="面积图透明度"
1941
+ labelCol={{ span: 12 }}
1942
+ wrapperCol={{ span: 12 }}
1943
+ >
1944
+ <Slider
1945
+ min={0}
1946
+ max={1}
1947
+ step={0.1}
1948
+ value={
1949
+ parseConfig?.series?.[selectSeries]?.areaStyle
1950
+ ?.opacity || 0.7
1951
+ }
1952
+ onChange={(v) =>
1953
+ transformReturn({
1954
+ series: { areaStyle: { opacity: v } },
1955
+ })
1956
+ }
1957
+ />
1958
+ </Form.Item>
1959
+ </>
1960
+ )}
1961
+ {parseConfig?.series?.[selectSeries]?.type === "bar" && (
1962
+ <>
1963
+ <Form.Item
1964
+ label="柱条宽度"
1965
+ labelCol={{ span: 12 }}
1966
+ wrapperCol={{ span: 12 }}
1967
+ >
1968
+ <InputNumber
1969
+ size="small"
1970
+ value={parseConfig?.series?.[selectSeries]?.barWidth}
1971
+ min={0}
1972
+ suffix="px"
1973
+ onChange={(v) =>
1974
+ transformReturn({ series: { barWidth: v } })
1975
+ }
1976
+ />
1977
+ </Form.Item>
1978
+ <Form.Item
1979
+ label="柱条最小宽度"
1980
+ labelCol={{ span: 12 }}
1981
+ wrapperCol={{ span: 12 }}
1982
+ >
1983
+ <InputNumber
1984
+ size="small"
1985
+ value={parseConfig?.series?.[selectSeries]?.barMinWidth}
1986
+ min={0}
1987
+ suffix="px"
1988
+ onChange={(v) =>
1989
+ transformReturn({ series: { barMinWidth: v } })
1990
+ }
1991
+ />
1992
+ </Form.Item>
1993
+ <Form.Item
1994
+ label="柱条最大宽度"
1995
+ labelCol={{ span: 12 }}
1996
+ wrapperCol={{ span: 12 }}
1997
+ >
1998
+ <InputNumber
1999
+ size="small"
2000
+ value={parseConfig?.series?.[selectSeries]?.barMaxWidth}
2001
+ min={0}
2002
+ suffix="px"
2003
+ onChange={(v) =>
2004
+ transformReturn({ series: { barMaxWidth: v } })
2005
+ }
2006
+ />
2007
+ </Form.Item>
2008
+ <Form.Item
2009
+ label="柱条最小高度"
2010
+ labelCol={{ span: 12 }}
2011
+ wrapperCol={{ span: 12 }}
2012
+ >
2013
+ <InputNumber
2014
+ size="small"
2015
+ value={parseConfig?.series?.[selectSeries]?.barMinHeight}
2016
+ min={0}
2017
+ suffix="px"
2018
+ onChange={(v) =>
2019
+ transformReturn({ series: { barMinHeight: v } })
2020
+ }
2021
+ />
2022
+ </Form.Item>
2023
+ <Form.Item
2024
+ label="柱条最小角度"
2025
+ labelCol={{ span: 12 }}
2026
+ wrapperCol={{ span: 12 }}
2027
+ >
2028
+ <InputNumber
2029
+ size="small"
2030
+ value={parseConfig?.series?.[selectSeries]?.barMinAngle}
2031
+ min={0}
2032
+ suffix="°"
2033
+ onChange={(v) =>
2034
+ transformReturn({ series: { barMinAngle: v } })
2035
+ }
2036
+ />
2037
+ </Form.Item>
2038
+ <Form.Item
2039
+ label="柱间距离"
2040
+ labelCol={{ span: 12 }}
2041
+ wrapperCol={{ span: 12 }}
2042
+ >
2043
+ <InputNumber
2044
+ size="small"
2045
+ value={
2046
+ parseConfig?.series?.[selectSeries]?.barGap?.length
2047
+ ? parseInt(
2048
+ parseConfig?.series[
2049
+ selectSeries
2050
+ ]?.barGap.replace("%", ""),
2051
+ )
2052
+ : 0
2053
+ }
2054
+ min={0}
2055
+ suffix="%"
2056
+ onChange={(v) =>
2057
+ transformReturn({
2058
+ series: { barGap: v ? v + "%" : "" },
2059
+ })
2060
+ }
2061
+ />
2062
+ </Form.Item>
2063
+ </>
2064
+ )}
2065
+ {parseConfig?.series?.[selectSeries]?.type === "pie" && (
2066
+ <>
2067
+ <Form.Item
2068
+ label="南丁格尔图"
2069
+ labelCol={{ span: 12 }}
2070
+ wrapperCol={{ span: 12 }}
2071
+ >
2072
+ <Radio.Group
2073
+ size="small"
2074
+ optionType="button"
2075
+ buttonStyle="solid"
2076
+ options={[
2077
+ {
2078
+ label: "无",
2079
+ value: "none",
2080
+ },
2081
+ {
2082
+ label: "radius",
2083
+ value: "radius",
2084
+ },
2085
+ {
2086
+ label: "area",
2087
+ value: "area",
2088
+ },
2089
+ ]}
2090
+ value={
2091
+ parseConfig?.series?.[selectSeries]?.roseType || "none"
2092
+ }
2093
+ onChange={(e) =>
2094
+ transformReturn({
2095
+ series: {
2096
+ roseType:
2097
+ e.target.value === "none" ? "" : e.target.value,
2098
+ },
2099
+ })
2100
+ }
2101
+ />
2102
+ </Form.Item>
2103
+ </>
2104
+ )}
2105
+ {["pie", "sunburst", "chord"].includes(
2106
+ parseConfig?.series?.[selectSeries]?.type || "",
2107
+ ) && (
2108
+ <>
2109
+ <Form.Item
2110
+ label="角度"
2111
+ labelCol={{ span: 12 }}
2112
+ wrapperCol={{ span: 12 }}
2113
+ >
2114
+ <Slider
2115
+ value={
2116
+ parseConfig?.series?.[selectSeries]?.startAngle || 90
2117
+ }
2118
+ min={0}
2119
+ max={360}
2120
+ onChange={(v) =>
2121
+ transformReturn({ series: { startAngle: v } })
2122
+ }
2123
+ />
2124
+ </Form.Item>
2125
+ <Form.Item
2126
+ label="半径"
2127
+ labelCol={{ span: 12 }}
2128
+ wrapperCol={{ span: 12 }}
2129
+ >
2130
+ <Slider
2131
+ value={
2132
+ parseConfig?.series?.[selectSeries]?.radius
2133
+ ? parseConfig?.series?.[selectSeries]?.radius.map(
2134
+ (i: string) => parseInt(i.replace("%", "")),
2135
+ )
2136
+ : [0, 100]
2137
+ }
2138
+ min={0}
2139
+ max={100}
2140
+ range={{ draggableTrack: true }}
2141
+ onChange={(v: number[]) =>
2142
+ transformReturn({
2143
+ series: { radius: [v[0] + "%", v[1] + "%"] },
2144
+ })
2145
+ }
2146
+ />
2147
+ </Form.Item>
2148
+ <Form.Item
2149
+ label="中心坐标"
2150
+ labelCol={{ span: 12 }}
2151
+ wrapperCol={{ span: 12 }}
2152
+ >
2153
+ <Slider
2154
+ value={
2155
+ parseConfig?.series?.[selectSeries]?.center
2156
+ ? parseConfig?.series?.[selectSeries]?.center.map(
2157
+ (i: string) => parseInt(i.replace("%", "")),
2158
+ )
2159
+ : [50, 50]
2160
+ }
2161
+ min={0}
2162
+ max={100}
2163
+ range={{ draggableTrack: true }}
2164
+ onChange={(v: number[]) =>
2165
+ transformReturn({
2166
+ series: { center: [v[0] + "%", v[1] + "%"] },
2167
+ })
2168
+ }
2169
+ />
2170
+ </Form.Item>
2171
+ </>
2172
+ )}
2173
+ </Space>
2174
+ ),
2175
+ },
1390
2176
  {
1391
2177
  key: "custom",
1392
2178
  label: "自定义配置",