aldehyde 0.2.474 → 0.2.475

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.
Files changed (148) hide show
  1. package/lib/controls/action/utils.d.ts +1 -1
  2. package/lib/controls/entity-select/entity-select.d.ts +2 -2
  3. package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
  4. package/lib/controls/entity-select/entity-select.js +16 -7
  5. package/lib/controls/entity-select/entity-select.js.map +1 -1
  6. package/lib/controls/entry-control.d.ts.map +1 -1
  7. package/lib/controls/entry-control.js +1 -0
  8. package/lib/controls/entry-control.js.map +1 -1
  9. package/lib/controls/select/index.d.ts.map +1 -1
  10. package/lib/controls/select/index.js +13 -7
  11. package/lib/controls/select/index.js.map +1 -1
  12. package/lib/controls/text/index.less +1 -0
  13. package/lib/controls/view-control.d.ts.map +1 -1
  14. package/lib/controls/view-control.js +1 -0
  15. package/lib/controls/view-control.js.map +1 -1
  16. package/lib/detail/button/edit-button.d.ts.map +1 -1
  17. package/lib/detail/button/edit-button.js +23 -11
  18. package/lib/detail/button/edit-button.js.map +1 -1
  19. package/lib/detail/button/view-button.d.ts.map +1 -1
  20. package/lib/detail/button/view-button.js +21 -10
  21. package/lib/detail/button/view-button.js.map +1 -1
  22. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -1
  23. package/lib/draw-canvas/edit/components/asset-bar/index.js +1 -0
  24. package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -1
  25. package/lib/draw-canvas/edit/components/main-header/index.d.ts +5 -0
  26. package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -1
  27. package/lib/draw-canvas/edit/components/main-header/index.js +54 -14
  28. package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -1
  29. package/lib/draw-canvas/edit/components/render/index.d.ts +4 -0
  30. package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -1
  31. package/lib/draw-canvas/edit/components/render/index.js +20 -14
  32. package/lib/draw-canvas/edit/components/render/index.js.map +1 -1
  33. package/lib/draw-canvas/edit/components/render/types.d.ts +5 -1
  34. package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -1
  35. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts +26 -0
  36. package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts.map +1 -0
  37. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js +83 -0
  38. package/lib/draw-canvas/edit/components/setting-form/imag-upload.js.map +1 -0
  39. package/lib/draw-canvas/edit/components/setting-form/index.d.ts +1 -3
  40. package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -1
  41. package/lib/draw-canvas/edit/components/setting-form/index.js +94 -15
  42. package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -1
  43. package/lib/draw-canvas/edit/constant.d.ts +7 -0
  44. package/lib/draw-canvas/edit/constant.d.ts.map +1 -0
  45. package/lib/draw-canvas/edit/constant.js +7 -0
  46. package/lib/draw-canvas/edit/constant.js.map +1 -0
  47. package/lib/draw-canvas/edit/index.d.ts +4 -1
  48. package/lib/draw-canvas/edit/index.d.ts.map +1 -1
  49. package/lib/draw-canvas/edit/index.js +63 -10
  50. package/lib/draw-canvas/edit/index.js.map +1 -1
  51. package/lib/draw-canvas/edit/index.less +17 -2
  52. package/lib/draw-canvas/view/index.d.ts +8 -0
  53. package/lib/draw-canvas/view/index.d.ts.map +1 -0
  54. package/lib/draw-canvas/view/index.js +50 -0
  55. package/lib/draw-canvas/view/index.js.map +1 -0
  56. package/lib/draw-canvas/view/index.less +60 -0
  57. package/lib/draw-canvas/view/view.d.ts +10 -0
  58. package/lib/draw-canvas/view/view.d.ts.map +1 -0
  59. package/lib/draw-canvas/view/view.js +104 -0
  60. package/lib/draw-canvas/view/view.js.map +1 -0
  61. package/lib/form/form-Item-group.d.ts.map +1 -1
  62. package/lib/form/form-Item-group.js +4 -4
  63. package/lib/form/form-Item-group.js.map +1 -1
  64. package/lib/lowcode-components/index.d.ts +2 -0
  65. package/lib/lowcode-components/index.d.ts.map +1 -1
  66. package/lib/lowcode-components/index.js +2 -1
  67. package/lib/lowcode-components/index.js.map +1 -1
  68. package/lib/lowcode-components/lowcode-view/component/assets.d.ts.map +1 -1
  69. package/lib/lowcode-components/lowcode-view/component/assets.js +8 -0
  70. package/lib/lowcode-components/lowcode-view/component/assets.js.map +1 -1
  71. package/lib/lowcode-components/radar-chart/index.d.ts +51 -0
  72. package/lib/lowcode-components/radar-chart/index.d.ts.map +1 -0
  73. package/lib/lowcode-components/radar-chart/index.js +276 -0
  74. package/lib/lowcode-components/radar-chart/index.js.map +1 -0
  75. package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
  76. package/lib/module/dtmpl-edit-card.js +18 -1
  77. package/lib/module/dtmpl-edit-card.js.map +1 -1
  78. package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
  79. package/lib/module/dtmpl-edit-page.js +19 -2
  80. package/lib/module/dtmpl-edit-page.js.map +1 -1
  81. package/lib/routable/ltmpl-route.d.ts +2 -0
  82. package/lib/routable/ltmpl-route.d.ts.map +1 -1
  83. package/lib/routable/ltmpl-route.js +20 -4
  84. package/lib/routable/ltmpl-route.js.map +1 -1
  85. package/lib/table/act-table.d.ts +2 -0
  86. package/lib/table/act-table.d.ts.map +1 -1
  87. package/lib/table/act-table.js +4 -4
  88. package/lib/table/act-table.js.map +1 -1
  89. package/lib/table/column/column-builder.d.ts.map +1 -1
  90. package/lib/table/column/column-builder.js +23 -8
  91. package/lib/table/column/column-builder.js.map +1 -1
  92. package/lib/table/relation-table.d.ts +3 -0
  93. package/lib/table/relation-table.d.ts.map +1 -1
  94. package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
  95. package/lib/tmpl/control-type-supportor.js +1 -0
  96. package/lib/tmpl/control-type-supportor.js.map +1 -1
  97. package/lib/tmpl/hcservice-v3.d.ts +2 -0
  98. package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
  99. package/lib/tmpl/hcservice-v3.js +34 -0
  100. package/lib/tmpl/hcservice-v3.js.map +1 -1
  101. package/lib/tmpl/interface.d.ts +13 -1
  102. package/lib/tmpl/interface.d.ts.map +1 -1
  103. package/lib/tmpl/interface.js.map +1 -1
  104. package/lib/tmpl/tmpl-config-analysis.js +1 -1
  105. package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
  106. package/lib/units/index.d.ts +2 -1
  107. package/lib/units/index.d.ts.map +1 -1
  108. package/lib/units/index.js +17 -3
  109. package/lib/units/index.js.map +1 -1
  110. package/package.json +4 -1
  111. package/src/aldehyde/controls/entity-select/entity-select.tsx +18 -8
  112. package/src/aldehyde/controls/entry-control.tsx +1 -0
  113. package/src/aldehyde/controls/select/index.tsx +7 -6
  114. package/src/aldehyde/controls/text/index.less +1 -0
  115. package/src/aldehyde/controls/view-control.tsx +1 -0
  116. package/src/aldehyde/detail/button/edit-button.tsx +21 -22
  117. package/src/aldehyde/detail/button/view-button.tsx +23 -21
  118. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +3 -1
  119. package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +59 -13
  120. package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +130 -65
  121. package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +33 -15
  122. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +19 -22
  123. package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +38 -30
  124. package/src/aldehyde/draw-canvas/edit/components/render/index.ts +17 -9
  125. package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +40 -58
  126. package/src/aldehyde/draw-canvas/edit/components/render/types.ts +5 -1
  127. package/src/aldehyde/draw-canvas/edit/components/setting-form/imag-upload.tsx +118 -0
  128. package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +111 -16
  129. package/src/aldehyde/draw-canvas/edit/constant.ts +6 -0
  130. package/src/aldehyde/draw-canvas/edit/index.less +17 -2
  131. package/src/aldehyde/draw-canvas/edit/index.tsx +84 -25
  132. package/src/aldehyde/draw-canvas/view/index.less +60 -0
  133. package/src/aldehyde/draw-canvas/view/index.tsx +48 -0
  134. package/src/aldehyde/draw-canvas/view/view.tsx +114 -0
  135. package/src/aldehyde/form/form-Item-group.tsx +4 -5
  136. package/src/aldehyde/lowcode-components/index.ts +4 -2
  137. package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +8 -0
  138. package/src/aldehyde/lowcode-components/radar-chart/index.tsx +323 -0
  139. package/src/aldehyde/module/dtmpl-edit-card.tsx +18 -1
  140. package/src/aldehyde/module/dtmpl-edit-page.tsx +19 -2
  141. package/src/aldehyde/routable/ltmpl-route.tsx +39 -3
  142. package/src/aldehyde/table/act-table.tsx +7 -4
  143. package/src/aldehyde/table/column/column-builder.tsx +29 -9
  144. package/src/aldehyde/tmpl/control-type-supportor.tsx +1 -0
  145. package/src/aldehyde/tmpl/hcservice-v3.tsx +30 -0
  146. package/src/aldehyde/tmpl/interface.tsx +13 -1
  147. package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +1 -1
  148. package/src/aldehyde/units/index.tsx +17 -4
@@ -53,6 +53,7 @@ import PlaceholderComponent from "./placeholder-component";
53
53
  import Carousel from "./carousel";
54
54
  import SearchForm from "./search-form";
55
55
  import BaseRadio from "./base-radio";
56
+ import RadarChart from "./radar-chart";
56
57
 
57
58
 
58
59
  type CompoundedComponent = {
@@ -110,7 +111,8 @@ type CompoundedComponent = {
110
111
  PlaceholderComponent?: typeof PlaceholderComponent,
111
112
  Carousel?: typeof Carousel,
112
113
  SearchForm?: typeof SearchForm,
113
- BaseRadio?: typeof BaseRadio
114
+ BaseRadio?: typeof BaseRadio,
115
+ RadarChart?: typeof RadarChart
114
116
  };
115
117
 
116
118
  const LowcodeComponents: CompoundedComponent = {
@@ -123,7 +125,7 @@ const LowcodeComponents: CompoundedComponent = {
123
125
  Decoration6, Decoration7, Decoration8, Decoration9, Decoration10, Decoration11,
124
126
  BaseTable, TextScroller, CapsuleBarChart, CircularProgressChart, ActTable, ProgressChart,
125
127
  LineBarChart, Column3dChart, StrokeAnimation, EffectScatterMap3D, BaseButton, BaseTabs,
126
- PlaceholderComponent, Carousel, SearchForm, BaseRadio
128
+ PlaceholderComponent, Carousel, SearchForm, BaseRadio, RadarChart
127
129
  };
128
130
 
129
131
  export default LowcodeComponents;
@@ -54,6 +54,7 @@ import PlaceholderComponent from "../../placeholder-component";
54
54
  import Carousel from "../../carousel";
55
55
  import SearchForm from "../../search-form";
56
56
  import BaseRadio from "../../base-radio";
57
+ import RadarChart from "../../radar-chart";
57
58
 
58
59
  interface ComponentItemConfig {
59
60
  baseInfo: BaseInfoType, // 基础信息
@@ -467,5 +468,12 @@ export const compsConfig: { [key: string]: ComponentItemConfig } = {
467
468
  compName: "单选框",
468
469
  compKey: "BaseRadio"
469
470
  }
471
+ },
472
+ RadarChart: {
473
+ componentNode: RadarChart,
474
+ baseInfo: {
475
+ compName: "雷达图",
476
+ compKey: "RadarChart"
477
+ }
470
478
  }
471
479
  };
@@ -0,0 +1,323 @@
1
+ import * as echarts from 'echarts';
2
+ import React, { useEffect, useRef, useState, ForwardedRef, forwardRef, useImperativeHandle } from 'react';
3
+ import _ from 'lodash';
4
+ import { Spin } from "antd";
5
+ import { useLocale } from "../../locale/useLocale";
6
+ import HydrocarbonService from "../../tmpl/hcservice-v3";
7
+ import { DataConfigProps } from "../data";
8
+
9
+
10
+ const defOption = {
11
+ title: {
12
+ text: '暂无数据',
13
+ left: 'center',
14
+ top: 'middle',
15
+ show: false, // 无数据时显示
16
+ },
17
+ tooltip: {},
18
+ grid: { top: 30, let: 30, right: 30, bottom: 30 },
19
+ legend: { show: false },
20
+ shape: "polygon",
21
+ radar: {
22
+ indicator: [
23
+ { name: 'A', max: 6500 },
24
+ { name: 'B', max: 16000 },
25
+ { name: 'C', max: 30000 },
26
+ { name: 'D', max: 38000 },
27
+ { name: 'E', max: 52000 },
28
+ { name: 'F', max: 25000 }
29
+ ],
30
+ splitArea: {
31
+ areaStyle: {
32
+ color: 'transparent',
33
+ },
34
+ },
35
+ axisName: {
36
+ color: '#afb6d3',
37
+ fontsize: 12,
38
+ fontWeight: "normal",
39
+ },
40
+ axisLine: {
41
+ lineStyle: {
42
+ color: '#384278',
43
+ },
44
+ },
45
+ splitLine: {
46
+ lineStyle: {
47
+ color: '#384278',
48
+ },
49
+ },
50
+ },
51
+ series: [
52
+ {
53
+ type: 'radar',
54
+ data: [{ value: [4200, 3000, 20000, 35000, 50000, 18000], name: 'A' }, { value: [5000, 14000, 28000, 26000, 42000, 21000], name: 'B' }]
55
+ }
56
+ ]
57
+ };
58
+
59
+ const legends = {
60
+ top: { top: 0 },
61
+ bottom: { bottom: 0 },
62
+ left: { left: 5, top: "center" },
63
+ right: { right: 5, top: "center" },
64
+ leftTop: { left: 5 },
65
+ rightTop: { right: 5 },
66
+ leftBottom: { left: 5, bottom: 0 },
67
+ rightBottom: { right: 5, bottom: 0 },
68
+ };
69
+
70
+ // 处理数据格式
71
+ const handleData = (data: { config: { [key: string]: string }, value: { [key: string]: any }[] }[]) => {
72
+ if (!data?.length) {
73
+ return [];
74
+ }
75
+ const temData = data.map((r) => {
76
+ const { config, value } = r;
77
+ const isD = Object.keys(config).some(r => r.includes("d"));
78
+ // 过滤只有v1、v2等数据
79
+ const vNames = Object.keys(config).filter((r) => r.startsWith("v") && !r.includes("-")).sort((a, b) => parseInt(a.substring(1)) - parseInt(b.substring(1)));
80
+ return isD ? {
81
+ name: config.d1,
82
+ data: vNames.map((r) => ({
83
+ name: config[r],
84
+ data: value.map((v) => [v["d1"], v[r]]),
85
+ }))
86
+ } : {
87
+ data: value.map((r, index) => ({ name: `数值${index || ""}`, data: vNames.map(v => [config[v], r[v]]) }))
88
+ };
89
+ });
90
+ return temData[0]?.data || [];
91
+ };
92
+
93
+ export interface ComponentStyle {
94
+ tooltip?: boolean;
95
+ color?: string[];
96
+ grid?: { top: number, let: number, right: number, bottom: number };
97
+ legend?: { [key: string]: any };
98
+ renderer?: "canvas" | "svg";
99
+ lineStyle?: { width: number };
100
+ shape?: string;
101
+ isArea?: boolean;
102
+ areaStyle?: { opacity: number };
103
+ splitAreaColor?: string;
104
+ axisName?: {
105
+ color: string,
106
+ fontsize: number,
107
+ fontWeight: string,
108
+ },
109
+ axisLineColor?: string,
110
+ splitLineColor?: string,
111
+ }
112
+
113
+ export interface ComponentProps {
114
+ style?: ComponentStyle;
115
+ base: { width: number, height: number };
116
+ data?: DataConfigProps;
117
+ isDesignMode?: boolean; // 是否编辑模式
118
+ initSearchParams?: { [key: string]: any }; // 全局初始化外部参数,例:传参包含设备id,则在查询时带上设备id
119
+ }
120
+
121
+ export interface ComponentRef {
122
+ updateConfig: (newConfig: ComponentProps) => void;
123
+ destroy: () => void;
124
+ }
125
+
126
+ const Index = forwardRef((props: ComponentProps, ref: ForwardedRef<ComponentRef>) => {
127
+ const { style, data: propsData, isDesignMode } = props;
128
+ const [config, setConfig] = useState<ComponentStyle>(style || {});
129
+ const [renderType, setRenderType] = useState<"canvas" | "svg">(style?.renderer || "svg"); // 渲染模式
130
+ const [size, setSize] = useState<{ width: number, height: number }>();
131
+ const [dataConfig, setDataConfig] = useState<DataConfigProps>({ ...propsData }); // 数据源配置
132
+ const [data, setData] = useState<{ name: string, data: any }[]>([]);
133
+ const [searchParams, setSearchParams] = useState<{ [key: string]: any }>();
134
+ const [initSearchParams, setInitSearchParams] = useState<{ [key: string]: any }>();
135
+ const [loading, setLoading] = useState<boolean>(false);
136
+ const chartRef = useRef<HTMLDivElement>(null);
137
+ const chart = useRef<any>(null);
138
+ const pollingIntervalRef = useRef<number | NodeJS.Timeout>(null);
139
+ const { translate } = useLocale();
140
+
141
+ const handleDestroy = () => {
142
+ pollingIntervalRef.current && clearInterval(pollingIntervalRef.current);
143
+ window.removeEventListener('resize', handleResize);
144
+ chart.current && chart.current.dispose();
145
+ };
146
+
147
+ // 全局初始化请求数据处理
148
+ const handleInitData = (val: DataConfigProps) => {
149
+ if (val.sourceType === "sourceId" && val.isInit && val.initData) {
150
+ const { config: dataConfig, value } = val.initData;
151
+ const temData = handleData(value);
152
+ setData(temData);
153
+ if (dataConfig?.requestMode === "polling") {
154
+ pollingIntervalRef.current = setInterval(() => { getData() }, dataConfig?.pollingInterval || 60000);
155
+ }
156
+ }
157
+ }
158
+
159
+ // ws订阅数据更新
160
+ const handleWSData = (val: DataConfigProps) => {
161
+ if (val.sourceType === "sourceId" && val.wsData) {
162
+ const { value } = val.initData;
163
+ const temData = handleData(value);
164
+ setData(temData);
165
+ }
166
+ }
167
+
168
+ useImperativeHandle(ref, () => ({
169
+ updateConfig: (newConfig) => {
170
+ const { base, style: newStyle, data: newDataConfig, initSearchParams: newISParams } = newConfig;
171
+ setConfig({ ...(newStyle || {}) });
172
+ setSize({ width: base.width, height: base.height });
173
+ setDataConfig(newDataConfig);
174
+ setRenderType(newStyle?.renderer || "svg");
175
+ handleInitData(newDataConfig);
176
+ setSearchParams(newDataConfig.searchParams);
177
+ setInitSearchParams(newISParams);
178
+ handleWSData(newDataConfig);
179
+ },
180
+ destroy: handleDestroy,
181
+ }));
182
+
183
+ // 窗口大小变化时重新调整图表大小
184
+ const handleResize = () => {
185
+ chart.current.resize({ animation: { duration: 500 } });
186
+ };
187
+
188
+ useEffect(() => {
189
+ return () => {
190
+ handleDestroy();
191
+ }
192
+ }, []);
193
+
194
+ useEffect(() => {
195
+ handleDestroy();
196
+ chart.current = echarts.init(chartRef.current, null, { renderer: renderType });
197
+ window.addEventListener('resize', handleResize);
198
+ }, [renderType]);
199
+
200
+ // 请求数据
201
+ const getData = async (params?: object) => {
202
+ setLoading(true);
203
+ const { data } = await HydrocarbonService.requestChartData(null, dataConfig?.sourceId, params) || {};
204
+ setLoading(false);
205
+ const temData = handleData(data?.value);
206
+ setData(temData);
207
+ return data?.config;
208
+ };
209
+
210
+ // 初始化请求数据
211
+ const getInitData = async (params?: object) => {
212
+ pollingIntervalRef.current && clearInterval(pollingIntervalRef.current);
213
+ const config = await getData(params);
214
+ if (config?.requestMode === "polling") {
215
+ pollingIntervalRef.current = setInterval(() => getData(params), config?.pollingInterval || 60000);
216
+ }
217
+ };
218
+
219
+ // 静态数据处理
220
+ useEffect(() => {
221
+ if (dataConfig?.sourceType === 'staticData') {
222
+ setData(handleData(dataConfig.staticData));
223
+ }
224
+ }, [dataConfig?.sourceType, dataConfig?.staticData]);
225
+
226
+ /**
227
+ * 数据源数据请求
228
+ * 1、编辑态不请求数据
229
+ */
230
+ useEffect(() => {
231
+ if (!isDesignMode && dataConfig?.sourceType === 'sourceId' && dataConfig?.sourceId && !dataConfig?.isInit && dataConfig?.isDefRequest !== false) {
232
+ if (dataConfig?.isInitParams) { // 组件数据源接收外部参数
233
+ initSearchParams && getInitData(initSearchParams);
234
+ } else {
235
+ getInitData();
236
+ }
237
+ } else if (dataConfig?.sourceType === 'sourceId') {
238
+ setData([]);
239
+ }
240
+ }, [dataConfig?.sourceType, dataConfig?.sourceId, initSearchParams]);
241
+
242
+ // 搜索参数变化时重新请求数据
243
+ useEffect(() => {
244
+ if (searchParams) {
245
+ const params = { ...(initSearchParams || {}), ...searchParams };
246
+ if (dataConfig?.isInitParams) { // 数据源接收外部参数,则参数存在再请求
247
+ initSearchParams && getInitData(params);
248
+ } else {
249
+ getInitData(params);
250
+ }
251
+ }
252
+ }, [searchParams, initSearchParams]);
253
+
254
+ const renderChart = () => {
255
+ const { grid, legend, tooltip, color, lineStyle, isArea, areaStyle, shape, splitAreaColor, axisName, axisLineColor, splitLineColor } = config;
256
+ const option = _.cloneDeep(defOption);
257
+ // 编辑态无数据显示默认数据
258
+ const temData = isDesignMode ? option.series : data;
259
+ const temMax = Math.max(...data.map(r => r.data?.map(item => item[1]) || []).flat());
260
+ const temIndicator = data?.[0]?.data?.map(r => ({ name: r[0], max: temMax }));
261
+ option.shape = shape;
262
+ option.grid = grid;
263
+ option.legend = { ...legend, ...legends[legend?.position] };
264
+ option.tooltip = tooltip ? {} : undefined;
265
+ option.title.text = translate("${暂无数据}");
266
+ option.title.show = !temData?.length;
267
+ option.radar = isDesignMode ? option.radar : {
268
+ ...option.radar,
269
+ splitArea: {
270
+ areaStyle: {
271
+ color: splitAreaColor || 'transparent',
272
+ },
273
+ },
274
+ axisName: axisName || {
275
+ color: '#afb6d3',
276
+ fontsize: 12,
277
+ fontWeight: "normal",
278
+ },
279
+ axisLine: {
280
+ lineStyle: {
281
+ color: axisLineColor || '#384278',
282
+ },
283
+ },
284
+ splitLine: {
285
+ lineStyle: {
286
+ color: splitLineColor || '#384278',
287
+ },
288
+ },
289
+ indicator: temIndicator
290
+ };
291
+ option.series = temData.map((r, index) => ({
292
+ name: r.name,
293
+ type: "radar",
294
+ lineStyle: { ...lineStyle, color: color[index] },
295
+ itemStyle: { color: color[index] },
296
+ areaStyle: isArea ? areaStyle : undefined,
297
+ data: [{ name: r.name, value: r.data?.map(item => item[1]) }]
298
+ }));
299
+ chart.current.setOption(option, true);
300
+ };
301
+
302
+ useEffect(() => {
303
+ if (config) {
304
+ renderChart();
305
+ }
306
+ }, [config, data]);
307
+
308
+ useEffect(() => {
309
+ if (size) {
310
+ handleResize();
311
+ }
312
+ }, [size]);
313
+
314
+ const renderChartDom = () => <div ref={chartRef} style={{ width: '100%', height: '100%' }} />;
315
+
316
+ if (isDesignMode) {
317
+ return renderChartDom();
318
+ }
319
+
320
+ return <Spin spinning={loading}>{renderChartDom()}</Spin>;
321
+ });
322
+
323
+ export default Index;
@@ -235,7 +235,7 @@ export default class DtmplEditCard extends React.PureComponent<
235
235
 
236
236
  getSecondCriteria = async (field) => {
237
237
  const { parentFormInstance } = this.props;
238
- const { relValueField, baseCriteria = {} } = field;
238
+ const { relValueField, relValueField3, baseCriteria = {} } = field;
239
239
  const temForm = parentFormInstance || this.formRef.current;
240
240
  if (relValueField && temForm) {
241
241
  let relValueData = temForm.getFieldValue(relValueField.id);
@@ -245,6 +245,14 @@ export default class DtmplEditCard extends React.PureComponent<
245
245
  field.baseCriteria = { ...(baseCriteria || {}), "secondCriteria": relValueData };
246
246
  field.configChanged = true;
247
247
  }
248
+ if (relValueField3 && temForm) {
249
+ let relValueData = temForm.getFieldValue(relValueField3.id);
250
+ if (relValueField3.subRelValueField && relValueData) {
251
+ relValueData = await this.getSubDtmplData(relValueField3, relValueData);
252
+ }
253
+ field.baseCriteria = { ...(field.baseCriteria || {}), "thirdCriteria": relValueData };
254
+ field.configChanged = true;
255
+ }
248
256
  return field;
249
257
  }
250
258
  // 表单关联项secondCriteria处理end
@@ -267,6 +275,15 @@ export default class DtmplEditCard extends React.PureComponent<
267
275
  total[field.relValueField.id] = [...temArr, temField];
268
276
  }
269
277
  }
278
+ if (field.relValueField3) {
279
+ const temArr = total[field.relValueField3.id] || [];
280
+ const isSameGroup = item.fields.some(f => f.id === field.relValueField3.id);
281
+ const temField = isSameGroup ? field : item;
282
+ const isItem = temArr.find(r => r.id === temField.id);
283
+ if (!isItem) {
284
+ total[field.relValueField3.id] = [...temArr, temField];
285
+ }
286
+ }
270
287
  })
271
288
  }
272
289
  return total;
@@ -178,7 +178,7 @@ export default class DtmplEditPage extends React.PureComponent<
178
178
 
179
179
  getSecondCriteria = async (field) => {
180
180
  const { parentFormInstance } = this.props;
181
- const { relValueField, baseCriteria = {} } = field;
181
+ const { relValueField, relValueField3, baseCriteria = {} } = field;
182
182
  const temForm = parentFormInstance || this.formRef.current;
183
183
  if (relValueField && temForm) {
184
184
  let relValueData = temForm.getFieldValue(relValueField.id);
@@ -188,6 +188,14 @@ export default class DtmplEditPage extends React.PureComponent<
188
188
  field.baseCriteria = { ...(baseCriteria || {}), "secondCriteria": relValueData };
189
189
  field.configChanged = true;
190
190
  }
191
+ if (relValueField3 && temForm) {
192
+ let relValueData = temForm.getFieldValue(relValueField3.id);
193
+ if (relValueField3.subRelValueField && relValueData) {
194
+ relValueData = await this.getSubDtmplData(relValueField3, relValueData);
195
+ }
196
+ field.baseCriteria = { ...(field.baseCriteria || {}), "thirdCriteria": relValueData };
197
+ field.configChanged = true;
198
+ }
191
199
  return field;
192
200
  }
193
201
  // 表单关联项secondCriteria处理end
@@ -279,7 +287,7 @@ export default class DtmplEditPage extends React.PureComponent<
279
287
  const valueFieldMap = groups.reduce((total, item) => {
280
288
  if (item.fields) {
281
289
  item.fields.forEach(field => {
282
- if (field.relValueField) {
290
+ if (field.relValueField) { // 关联取值字段
283
291
  const temArr = total[field.relValueField.id] || [];
284
292
  const isSameGroup = item.fields.some(f => f.id === field.relValueField.id);
285
293
  const temField = isSameGroup ? field : item;
@@ -288,6 +296,15 @@ export default class DtmplEditPage extends React.PureComponent<
288
296
  total[field.relValueField.id] = [...temArr, temField];
289
297
  }
290
298
  }
299
+ if (field.relValueField3) { // 关联取值字段扩1
300
+ const temArr = total[field.relValueField3.id] || [];
301
+ const isSameGroup = item.fields.some(f => f.id === field.relValueField3.id);
302
+ const temField = isSameGroup ? field : item;
303
+ const isItem = temArr.find(r => r.id === temField.id);
304
+ if (!isItem) {
305
+ total[field.relValueField3.id] = [...temArr, temField];
306
+ }
307
+ }
291
308
  })
292
309
  }
293
310
  return total;
@@ -18,6 +18,8 @@ import DtmplCustomEditModalPage from "../custom-page/dtmpl-custom-edit-modal-pag
18
18
  import CustomDetailModalPage from "../custom-page/custom-detail-modal-page";
19
19
  import DtmplEditPage from "../module/dtmpl-edit-page";
20
20
  import DtmplViewModal from "../module/dtmpl-view-modal";
21
+ import Edit2D from "../draw-canvas/edit"; // 编辑2D图
22
+ import View2D from "../draw-canvas/view"; // 查看2D图
21
23
 
22
24
  export interface LtmplRouteProps extends RouterCompProps {
23
25
  layoutRootPath?: string;
@@ -45,6 +47,8 @@ export interface LtmplRouteState {
45
47
  themeConfig?: ThemeConfig;
46
48
  pageSizeOptions?: number[]; // 分页条数
47
49
  drawerSize?: number | string; // 抽屉组件
50
+ showEdit2D?: boolean; // 编辑2D图
51
+ showView2D?: boolean; // 查看2D图
48
52
  }
49
53
 
50
54
  class LtmplRoute extends React.PureComponent<LtmplRouteProps, LtmplRouteState> {
@@ -75,7 +79,9 @@ class LtmplRoute extends React.PureComponent<LtmplRouteProps, LtmplRouteState> {
75
79
  userPageConfigLoading: true,
76
80
  themeConfig: undefined,
77
81
  pageSizeOptions: [],
78
- drawerSize: "92vw"
82
+ drawerSize: "92vw",
83
+ showEdit2D: false,
84
+ showView2D: false
79
85
  };
80
86
 
81
87
  async componentDidMount() {
@@ -300,6 +306,16 @@ class LtmplRoute extends React.PureComponent<LtmplRouteProps, LtmplRouteState> {
300
306
  }
301
307
  };
302
308
 
309
+ // 2D图编辑
310
+ doEdit2D = (val: string) => {
311
+ this.setState({ showEdit2D: true, selectedCode: val });
312
+ }
313
+
314
+ // 2D图查看
315
+ doView2D = (val: string) => {
316
+ this.setState({ showView2D: true, selectedCode: val });
317
+ }
318
+
303
319
  pathMark = () => {
304
320
  const { tableType } = this.props;
305
321
  return tableType && tableType == "report" ? "report-table" : "act-table";
@@ -376,7 +392,7 @@ class LtmplRoute extends React.PureComponent<LtmplRouteProps, LtmplRouteState> {
376
392
  const {
377
393
  ltmplConfigRes, showDraw, showWindowType, ractionId, selectedCode,
378
394
  showViewDrawer, showViewModal, showEdit, editSourceId, viewSourceId, toCustomPage, userPageConfig,
379
- themeConfig, pageSizeOptions, userPageConfigLoading, drawerSize
395
+ themeConfig, pageSizeOptions, userPageConfigLoading, drawerSize, showEdit2D, showView2D
380
396
  } = this.state;
381
397
  const { location, params, tableType, rowOperatable, defShowType } = this.props;
382
398
  const { sourceId } = params;
@@ -423,7 +439,7 @@ class LtmplRoute extends React.PureComponent<LtmplRouteProps, LtmplRouteState> {
423
439
  criteriaData={criteriaData} ltmplConfig={ltmplConfig} doRAction={this.doRAction}
424
440
  defShowType={defShowType} userPageConfig={userPageConfig} setUserPageConfig={this.setUserPageConfig}
425
441
  resetUserPageConfig={this.resetUserPageConfig} allowUserConfig={themeConfig?.allowUserConfig}
426
- onUpdatePageSizeOptions={this.onUpdatePageSizeOptions}
442
+ onUpdatePageSizeOptions={this.onUpdatePageSizeOptions} doEdit2D={this.doEdit2D} doView2D={this.doView2D}
427
443
  />
428
444
  {showDraw ? (
429
445
  <Drawer
@@ -494,6 +510,26 @@ class LtmplRoute extends React.PureComponent<LtmplRouteProps, LtmplRouteState> {
494
510
  />
495
511
  )
496
512
  ) : null}
513
+ {showEdit2D && selectedCode ? <Drawer
514
+ placement={"left"} title={translate("${编辑}")} closable={true} mask={false} onClose={() => this.setState({ showEdit2D: false, selectedCode: undefined })}
515
+ open={showEdit2D}
516
+ resizable={{ onResize: (newSize => this.setState({ drawerSize: newSize })) }}
517
+ size={drawerSize}
518
+ styles={{ body: { minWidth: "720px", padding: 0 } }}
519
+ >
520
+ <Edit2D recordCode={selectedCode} />
521
+ </Drawer> : null
522
+ }
523
+ {showView2D && selectedCode ? <Drawer
524
+ placement={"left"} title={translate("${查看}")} closable={true} mask={false} onClose={() => this.setState({ showView2D: false, selectedCode: undefined })}
525
+ open={showView2D}
526
+ resizable={{ onResize: (newSize => this.setState({ drawerSize: newSize })) }}
527
+ size={drawerSize}
528
+ styles={{ body: { minWidth: "720px", padding: 0 } }}
529
+ >
530
+ <View2D recordCode={selectedCode} />
531
+ </Drawer> : null
532
+ }
497
533
  </>
498
534
  );
499
535
  }
@@ -83,6 +83,8 @@ interface ActTableProps extends TmplBaseProps {
83
83
  onUpdatePageSizeOptions?: (val: number[]) => void; // 更新分页数数组
84
84
  showEmpty?: boolean; // 空数据是否显示空状态,默认显示
85
85
  loadDataCallback?: (val: object[]) => void; // 请求数据回调函数
86
+ doEdit2D?: (val: string) => void; // 2D图编辑
87
+ doView2D?: (val: string) => void; // 2D图查看
86
88
  }
87
89
 
88
90
  interface ActTableStat {
@@ -1047,7 +1049,7 @@ class ActTable extends React.PureComponent<ActTableProps, ActTableStat> {
1047
1049
  </Tooltip>
1048
1050
  </Popover>
1049
1051
  ) : (
1050
- <Tooltip title={translate("${创建}")}>
1052
+ <Tooltip title={translate("${" + (ltmplConfig.createBtnTitle || "创建") + "}")}>
1051
1053
  <Button onClick={() => doCreate(null, false)}>
1052
1054
  <PlusOutlined />
1053
1055
  </Button>
@@ -1059,7 +1061,7 @@ class ActTable extends React.PureComponent<ActTableProps, ActTableStat> {
1059
1061
  {(buttons.includes("dtmplCustomAdd") || customCreatable) &&
1060
1062
  doCreate &&
1061
1063
  !readOnly ? (
1062
- <Tooltip title={translate("${创建}")}>
1064
+ <Tooltip title={translate("${" + (ltmplConfig.createBtnTitle || "创建") + "}")}>
1063
1065
  <Button onClick={() => doCreate(null, true)}>
1064
1066
  <PlusCircleOutlined />
1065
1067
  </Button>
@@ -1512,7 +1514,8 @@ class ActTable extends React.PureComponent<ActTableProps, ActTableStat> {
1512
1514
  mainCode, sourceId, ltmplConfig, funcMode, operatable,
1513
1515
  title, collapsible,
1514
1516
  onChangePage, serverKey, criteriaData, showEmpty, loadDataCallback,
1515
- showView, doEdit, doRAction, customEditable, readOnly, tableType, showPagination, showAggregates, userPageConfig
1517
+ showView, doEdit, doRAction, customEditable, readOnly, tableType, showPagination, showAggregates, userPageConfig,
1518
+ doEdit2D, doView2D
1516
1519
  } = this.props;
1517
1520
  const { translate } = this.context;
1518
1521
 
@@ -1538,7 +1541,7 @@ class ActTable extends React.PureComponent<ActTableProps, ActTableStat> {
1538
1541
  doRowAction: this.doRowAction, doDeleteByCode: this.doDeleteByCode, sortColumns: criteriaData["sortColIds"],
1539
1542
  editings, editRowEdit: this.editRowEdit, cancelRowEdit: this.cancelRowEdit, saveRowData: this.saveRowData,
1540
1543
  doDelModalOpen: this.doDelModalOpen, mainCode, criteriaData: userCriteriaData, actTableDoSearch: this.actTableDoSearch,
1541
- columnResize: userPageConfig?.colResize
1544
+ columnResize: userPageConfig?.colResize, doEdit2D, doView2D
1542
1545
  }
1543
1546
  );
1544
1547
 
@@ -11,7 +11,8 @@ import {
11
11
  EyeOutlined,
12
12
  FormOutlined,
13
13
  KeyOutlined,
14
- MenuOutlined, QuestionCircleOutlined,
14
+ MenuOutlined, QuestionCircleOutlined, PlaySquareOutlined,
15
+ SettingOutlined
15
16
  } from "@ant-design/icons";
16
17
  import ActionUtils from "../../controls/action/utils";
17
18
  import ViewButton from "../../detail/button/view-button";
@@ -539,8 +540,10 @@ export default {
539
540
  serverKey,
540
541
  readOnly,
541
542
  sourceId, translate, doCustomButton, doRowJump, blockMenuTreeDrawerOpen,
542
- doRowAction, doDeleteByCode, editRowEdit, editings, cancelRowEdit, saveRowData, doDelModalOpen } = props;
543
- const { buttons, builtInButtons, defShowRowActionCount, strongDeleteConfirmText } = ltmplConfig;
543
+ doRowAction, doDeleteByCode, editRowEdit, editings, cancelRowEdit, saveRowData, doDelModalOpen,
544
+ doView2D, doEdit2D
545
+ } = props;
546
+ const { buttons, builtInButtons, defShowRowActionCount, strongDeleteConfirmText, edit2DBtnTitle, view2DBtnTitle, deleteBtnTitle } = ltmplConfig;
544
547
 
545
548
  let actionButtons: any[] = [];
546
549
 
@@ -573,6 +576,19 @@ export default {
573
576
  ></EditButton>)
574
577
  )
575
578
  };
579
+
580
+ // 2D图编辑
581
+ if (buttons.includes("edit2D") && doEdit2D && !readOnly) {
582
+ actionButtons.push((!edit2DBtnTitle || edit2DBtnTitle?.length < 4) ? <Button size="small" onClick={() => doEdit2D(record.code)}>{edit2DBtnTitle || <SettingOutlined />}</Button> :
583
+ <Tooltip title={edit2DBtnTitle}><Button size="small" onClick={() => doEdit2D(record.code)} icon={<SettingOutlined />} /></Tooltip>)
584
+ }
585
+
586
+ // 2D图查看
587
+ if (buttons.includes("view2D") && doView2D && !readOnly) {
588
+ actionButtons.push((!view2DBtnTitle || view2DBtnTitle?.length < 4) ? <Button size="small" onClick={() => doView2D(record.code)}>{ltmplConfig.view2DBtnTitle || <PlaySquareOutlined />}</Button> :
589
+ <Tooltip title={edit2DBtnTitle}><Button size="small" onClick={() => doView2D(record.code)} icon={<PlaySquareOutlined />} /></Tooltip>)
590
+ }
591
+
576
592
  // 行内编辑
577
593
  if (buttons.includes("rowEdit") && !buttons.includes("multiRowEdit")) {
578
594
  actionButtons.push(<InlineEditButton
@@ -804,9 +820,13 @@ export default {
804
820
  )) {
805
821
  actionButtons.push(
806
822
  strongDeleteConfirmText ?
807
- <Button size="small" type="dashed" danger onClick={() => doDelModalOpen(record)}>
808
- <DeleteOutlined />
809
- </Button> :
823
+ ((!deleteBtnTitle || deleteBtnTitle?.length < 4) ?
824
+ <Button size="small" type="dashed" danger onClick={() => doDelModalOpen(record)}>
825
+ {deleteBtnTitle || <DeleteOutlined />}
826
+ </Button> : <Tooltip title={deleteBtnTitle}>
827
+ <Button size="small" type="dashed" danger onClick={() => doDelModalOpen(record)} icon={<DeleteOutlined />} />
828
+ </Tooltip>)
829
+ :
810
830
  <Popconfirm
811
831
  placement="rightBottom"
812
832
  title={translate("${确定要[删除]此数据吗}?")}
@@ -815,9 +835,9 @@ export default {
815
835
  cancelText={translate("${取消}")}
816
836
  okType={"danger"}
817
837
  >
818
- <Button size="small" type="dashed" danger>
819
- <DeleteOutlined />
820
- </Button>
838
+ {(!deleteBtnTitle || deleteBtnTitle?.length < 4) ?
839
+ <Button size="small" type="dashed" danger >{deleteBtnTitle || <DeleteOutlined />}</Button> :
840
+ <Tooltip title={deleteBtnTitle}><Button size="small" type="dashed" danger icon={<DeleteOutlined />} /></Tooltip>}
821
841
  </Popconfirm>
822
842
  )
823
843
  }
@@ -30,6 +30,7 @@ SupportInputTypes.add('timerange-unorder');
30
30
  SupportInputTypes.add('text');
31
31
  SupportInputTypes.add('textarea');
32
32
  SupportInputTypes.add('text-view');
33
+ SupportInputTypes.add('scan-code');
33
34
  SupportInputTypes.add('html');
34
35
  SupportInputTypes.add('steps');
35
36
  SupportInputTypes.add('progress');