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
@@ -1,12 +1,24 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
- import { Form as AntdForm, Collapse } from "antd";
2
+ import { Form as AntdForm, Collapse, Row, Col } from "antd";
3
3
  import _ from "lodash";
4
4
  import FormItemGroup from "../../../../form/form-Item-group";
5
+ import { FieldConfig } from "../../../../tmpl/interface";
5
6
  import { PageSettings, AssetSettings, LinkSettings } from '../render/types';
6
7
  import type Konva from 'konva';
8
+ import { ProgramConfig } from "../../../../index";
9
+ import { useLocale } from "../../../../locale/useLocale";
10
+ import ImageUpload from "./imag-upload";
7
11
 
8
12
  const FormItem = AntdForm.Item;
9
13
 
14
+ // 基本配置
15
+ const baseSetting = [
16
+ { title: "ID", id: "id", extControlType: "text", disabled: true, style: { width: "100%" } },
17
+ ];
18
+
19
+ // 数据源配置
20
+ const defDataSourceSetting = { title: "数据源", id: "dataSource", extControlType: "select", options: [], style: { width: "100%" } };
21
+
10
22
  // 坐标配置
11
23
  const positionSetting = {
12
24
  title: "坐标",
@@ -74,9 +86,9 @@ const defFormConfig = {
74
86
  groups: [
75
87
  {
76
88
  fields: [
77
- { title: "文本", id: "text", extControlType: "textarea", style: { width: "100%" } },
89
+ { title: "默认文本", id: "text", extControlType: "textarea", style: { width: "100%" } },
78
90
  { title: "文本颜色", id: "textFill", extControlType: "color", style: { width: "100%" } },
79
- { title: "字体大小", id: "fontSize", extControlType: "int", min: 1, style: { width: "100%" } },
91
+ { title: "字体大小", id: "fontSize", extControlType: "int", min: 1, style: { width: "100%" } }
80
92
  ]
81
93
  },
82
94
  positionSetting
@@ -93,50 +105,120 @@ interface Props {
93
105
  linkCurrent?: Konva.Line; // 当前选中连线
94
106
  linkSettings?: LinkSettings; // 当前选中连线配置
95
107
  onLinkSettingsChange: (s: LinkSettings) => void; // 更新当前选中连线配置
96
- formConfig?: { [key: string]: any }; // 表单配置
108
+ recordCode?: string; // 当前画面关联数据code
97
109
  }
98
110
 
99
111
  const Index = (props: Props) => {
100
- const { pageSettings, onPageSettingsChange, assetCurrent, assetSettings, onAssetSettingsChange, linkCurrent, linkSettings, onLinkSettingsChange, formConfig } = props;
112
+ const { pageSettings, onPageSettingsChange, assetCurrent, assetSettings, onAssetSettingsChange, linkCurrent, linkSettings, onLinkSettingsChange, recordCode } = props;
101
113
  const formData = assetCurrent ? assetSettings : (linkCurrent ? linkSettings : pageSettings);
102
114
  const [form] = AntdForm.useForm();
103
115
  const [formConfigs, setFormConfigs] = useState<{ [key: string]: any }>([]);
116
+ const { translate } = useLocale();
117
+
118
+ // 自定义表单项
119
+ const customFormItem = (items: { [key: string]: any }[], layout?: "vertical" | "horizontal") => {
120
+ const entryControls = items.map(item => {
121
+ const { extControlType } = item || {};
122
+ if (!extControlType) {
123
+ return null;
124
+ }
125
+ let entryControl;
126
+ switch (extControlType) {
127
+ case "picture":
128
+ entryControl = <ImageUpload recordCode={recordCode} />;
129
+ break;
130
+ default:
131
+ break;
132
+ }
133
+ if (!entryControl) {
134
+ return null;
135
+ }
136
+ const colSpan = item.colSpan || 2;
137
+ return <Col key={item.id} span={12 * colSpan} style={{ width: "stretch" }}>
138
+ <FormItem
139
+ layout={layout}
140
+ label={translate("${" + item.title + "}")}
141
+ noStyle={item.noStyle || false}
142
+ hidden={item.hidden}
143
+ name={item.id}
144
+ key={item.id}
145
+ labelCol={{ span: 24 }}
146
+ wrapperCol={{ span: 24 }}
147
+ tooltip={!item.tip ? undefined : item.tip}
148
+ style={{ margin: "4px 4px 12px" }}
149
+ >{entryControl}</FormItem>
150
+ </Col>;
151
+ }).filter(Boolean);
152
+ return <Row gutter={[16, 0]} key={1}>{entryControls}</Row>;
153
+ }
154
+
155
+ // 处理表单组件使用公共组件or自定义组件
156
+ const handleFormItemType = (fields: FieldConfig[], layout?: "vertical" | "horizontal") => {
157
+ const customTypes = ["picture"]; // 自定义组件类型
158
+ const temArr = fields?.reduce((total, item) => {
159
+ const isCustom = customTypes.includes(item.extControlType || "");
160
+ const lastItem = total[total.length - 1];
161
+ if (lastItem && ((lastItem.type === "custom" && isCustom) || (lastItem.type === "default" && !isCustom))) {
162
+ lastItem.fields.push(item);
163
+ total[total.length - 1] = lastItem;
164
+ } else {
165
+ total.push({ type: isCustom ? "custom" : "default", fields: [item] });
166
+ }
167
+ return total;
168
+ }, []) || [];
169
+ return temArr.map(item => item.type === "default" ? <FormItemGroup layout={layout} fields={item.fields || undefined} valueMap={undefined} /> : customFormItem(item.fields, layout));
170
+ }
104
171
 
105
172
  // FormItem渲染
106
173
  const renderFormItem = (item: { [key: string]: any }) => {
107
174
  if (item.groups) {
108
175
  return item.groups.map(r => {
109
176
  if (r?.isGroup) { // 表单分组显示
110
- return <FormItem label={r.title} layout='vertical' style={{ margin: "12px 0", paddingInline: "8px" }}>
111
- <FormItemGroup fields={r.fields || undefined} valueMap={undefined} />
177
+ return <FormItem label={r.title} layout='vertical' style={{ marginBottom: "12px", paddingInline: "4px" }}>
178
+ {handleFormItemType(r.fields)}
112
179
  </FormItem>;
113
180
  }
114
- return <FormItemGroup layout='vertical' fields={r.fields || undefined} valueMap={undefined} />;
181
+ return handleFormItemType(r.fields, "vertical");
115
182
  });
116
183
  }
117
- return <FormItemGroup layout='vertical' fields={item.fields || undefined} valueMap={undefined} />;
184
+ return handleFormItemType(item.fields, "vertical");
118
185
  }
119
186
 
120
187
  // 当前表单配置
121
188
  const currentFormConfig = useMemo(() => {
122
- let temFormConfig = formConfig || (linkCurrent ? defFormConfig["linkSetting"] : defFormConfig["pageSetting"]);
189
+ let temFormConfig: any = linkCurrent ? defFormConfig["linkSetting"] : defFormConfig["pageSetting"];
123
190
  if (assetCurrent) {
124
191
  const assetType = assetCurrent.getAttr("assetType");
125
192
  const graphType = assetCurrent.getAttr("graphType");
126
- temFormConfig = defFormConfig[assetType === "Text" ? "Text" : graphType] || temFormConfig;
193
+ const componentType = assetCurrent.getAttr("componentType"); // 组件类型-用于匹配表单等
194
+ temFormConfig = defFormConfig[assetType === "Text" ? "Text" : graphType];
195
+ if (!temFormConfig) { // 默认表单不存在配置则获取组件中的表单配置
196
+ const currentItem: any = ProgramConfig.get2DComponentByType(componentType);
197
+ const { config, dataSource, alterDataSources } = currentItem || {};
198
+ temFormConfig = JSON.parse(config || "[]");
199
+ if (dataSource || alterDataSources) { // 数据源配置
200
+ const temArr = [dataSource, ...(alterDataSources || [])].filter(Boolean).map(r => {
201
+ const [key, label] = r.split("@R@");
202
+ return { label, value: key };
203
+ });
204
+ const dataSourceSetting = { title: "数据", fields: [{ ...defDataSourceSetting, options: temArr, defValue: dataSource ? temArr[0]?.value : undefined }] };
205
+ temFormConfig = [dataSourceSetting, ...temFormConfig];
206
+ }
207
+ }
127
208
  }
128
209
  const configArr = temFormConfig.map(r => r.groups ? r.groups.map(i => i.fields) : r.fields).flat(Infinity);
129
210
  setFormConfigs(configArr);
130
211
  return temFormConfig;
131
- }, [formConfig, linkCurrent, assetCurrent]);
212
+ }, [assetCurrent, linkCurrent]);
132
213
 
133
214
  const fieldGroupList = () => {
215
+ const renderId = handleFormItemType(baseSetting, "vertical");
134
216
  const items = currentFormConfig?.map((item, index) => ({
135
217
  key: index,
136
218
  label: item.title,
137
- children: renderFormItem(item)
219
+ children: assetCurrent && item.title === "基本信息" ? [renderId, ...renderFormItem(item)] : renderFormItem(item)
138
220
  }));
139
- return <Collapse bordered={false} size="small" defaultActiveKey={0} items={items} />;
221
+ return <Collapse bordered={false} size="small" defaultActiveKey={[0, 1]} items={items} />;
140
222
  };
141
223
 
142
224
  // 更新数据
@@ -161,12 +243,21 @@ const Index = (props: Props) => {
161
243
  onLinkSettingsChange({ ...linkSettings, ...temVal });
162
244
  return;
163
245
  }
246
+ // 画布背景图片颜色-只能设置一个
247
+ let background = pageSettings.background;
248
+ let backgroundImg = pageSettings.backgroundImg;
249
+ if (val.background || val.backgroundImg) {
250
+ background = null;
251
+ backgroundImg = null;
252
+ }
253
+ form.setFieldsValue({ background, backgroundImg, ...temVal });
164
254
  // 默认画布配置
165
- onPageSettingsChange({ ...pageSettings, ...temVal });
255
+ onPageSettingsChange({ ...pageSettings, background, backgroundImg, ...temVal });
166
256
  }
167
257
 
168
258
  // 表单数据实时回显更新
169
259
  const formSetFieldsValue = () => {
260
+ const nodeId = assetCurrent?.getAttr("id");
170
261
  const temVal = _.cloneDeep(formData);
171
262
  Object.keys(temVal).forEach((key) => { // 使用公共表单组件,转换指定类型值
172
263
  const extControlType = formConfigs.find((item: any) => item.id === key)?.extControlType;
@@ -175,7 +266,11 @@ const Index = (props: Props) => {
175
266
  return;
176
267
  }
177
268
  });
178
- form.setFieldsValue(temVal);
269
+ const dataSourceConfig = formConfigs.find((item: any) => item.id === "dataSource");
270
+ if (dataSourceConfig) { // 数据源-无配置设置默认值
271
+ temVal["dataSource"] = temVal["dataSource"] || dataSourceConfig.defValue;
272
+ }
273
+ form.setFieldsValue({ ...temVal, id: nodeId });
179
274
  }
180
275
 
181
276
  // 表单数据实时回显更新
@@ -0,0 +1,6 @@
1
+ export const fileUpload = {
2
+ name: '文件模型上传',
3
+ sourceId: '505356896556589056',
4
+ serverKey: "localDevopsServer",
5
+ type: 'dtmpl',
6
+ };
@@ -1,8 +1,19 @@
1
1
  .draw {
2
2
  width: 100%;
3
3
  height: 100%;
4
- display: flex;
5
- flex-direction: column;
4
+
5
+ .ant-spin,
6
+ .ant-spin-container {
7
+ width: 100%;
8
+ height: 100%;
9
+ }
10
+
11
+ .draw-main {
12
+ width: 100%;
13
+ height: 100%;
14
+ display: flex;
15
+ flex-direction: column;
16
+ }
6
17
 
7
18
  *:focus-visible {
8
19
  outline: none;
@@ -29,6 +40,10 @@
29
40
  width: 220px;
30
41
  background-color: #f5f5f5;
31
42
  border-left: 1px solid #ccc;
43
+
44
+ .ant-input-disabled .ant-input-suffix {
45
+ display: none;
46
+ }
32
47
  }
33
48
  }
34
49
  }
@@ -1,4 +1,8 @@
1
1
  import React, { useEffect, useRef, useState, useCallback } from 'react';
2
+ import { gunzipSync, strFromU8 } from 'fflate';
3
+ import { Spin } from "antd";
4
+ import { hexToUint8Array } from 'uint8array-extras';
5
+ import HcserviceV3 from "../../tmpl/hcservice-v3";
2
6
  import { Render } from './components/render';
3
7
  import { GraphType, PageSettings, AssetSettings, LinkSettings } from './components/render/types';
4
8
  import MainHeader from './components/main-header';
@@ -7,7 +11,12 @@ import SettingForm from "./components/setting-form";
7
11
  import type Konva from 'konva';
8
12
  import './index.less';
9
13
 
10
- const Index = () => {
14
+ interface Props {
15
+ recordCode: string
16
+ }
17
+
18
+ const Index = (props: Props) => {
19
+ const { recordCode } = props;
11
20
  const boardRef = useRef<HTMLDivElement>(null); // 画布边框
12
21
  const stageRef = useRef<HTMLDivElement>(null); // 画布
13
22
  const renderRef = useRef<Render | null>(null); // 渲染器实例
@@ -19,7 +28,35 @@ const Index = () => {
19
28
  const [assetCurrent, setAssetCurrent] = useState<Konva.Node>(); // 当前选中组件
20
29
  const [linkCurrent, setLinkCurrent] = useState<Konva.Line>(); // 当前选中连线
21
30
  const [texting, setTexting] = useState<boolean>(false); // 添加文本状态
31
+ const [showGrid, setShowGrid] = useState<boolean>(true); // 是否显示网格
32
+ const [showAttract, setShowAttract] = useState<boolean>(true); // 是否显示磁吸
22
33
  const assetCurrentRef = useRef<Konva.Node>(null); // 当前选中组件Ref
34
+ const [loading, setLoading] = useState<boolean>(false);
35
+
36
+ // 获取视图数据
37
+ const getViewData = async () => {
38
+ setLoading(true);
39
+ const data = await HcserviceV3.getDiagram2DConfig(recordCode);
40
+ const content = data?.[0]?.content;
41
+ if (!content) {
42
+ setLoading(false);
43
+ return;
44
+ }
45
+ const temByteArray = hexToUint8Array(content.replace(/^0x/i, ""));
46
+ // 1. 将压缩的 ByteArray 解压回原始的 Uint8Array
47
+ const decompressedBuffer = gunzipSync(temByteArray);
48
+ // 2. 将 Uint8Array 转换回普通字符串
49
+ const originalData = strFromU8(decompressedBuffer);
50
+ setLoading(false);
51
+ // 重置画面数据
52
+ await renderRef.current.importExportTool.restore(originalData as string);
53
+ }
54
+
55
+ useEffect(() => {
56
+ if (recordCode) {
57
+ getViewData();
58
+ }
59
+ }, [recordCode]);
23
60
 
24
61
  // 初始化渲染器
25
62
  const initRender = useCallback((width: number, height: number) => {
@@ -27,7 +64,7 @@ const Index = () => {
27
64
  const render = new Render(stageRef.current, {
28
65
  width, height,
29
66
  showBg: true, showRuler: true, showRefLine: true,
30
- showPreview: true, showContextmenu: true,
67
+ showPreview: false, showContextmenu: true,
31
68
  attractResize: true, attractBg: true, attractNode: true,
32
69
  });
33
70
  renderRef.current = render;
@@ -104,33 +141,55 @@ const Index = () => {
104
141
  renderRef.current.setLinkSettings(linkCurrent, { ...linkSettings, ...val }, true);
105
142
  }
106
143
 
144
+ // 更改磁吸显示
145
+ const handleShowAttract = (val: boolean) => {
146
+ setShowAttract(val);
147
+ renderRef.current.changeShowAttract(val);
148
+ }
149
+
150
+ // 更改网格显示
151
+ const handleShowGrid = (val: boolean) => {
152
+ setShowGrid(val);
153
+ renderRef.current.changeShowGrid(val);
154
+ }
155
+
107
156
  return (
108
157
  <div className="draw">
109
- <MainHeader
110
- render={renderRef.current}
111
- graphType={graphType}
112
- texting={texting}
113
- onGraphTypeChange={(val) => renderRef.current.changeGraphType(val)}
114
- onTexting={() => renderRef.current.changeTexting(true)}
115
- />
116
- <div className='draw-content'>
117
- <div className='left'><AssetBar /></div>
118
- <div className='center' ref={boardRef} >
119
- <div ref={stageRef} />
120
- </div>
121
- <div className='right'>
122
- <SettingForm
123
- pageSettings={pageSettings}
124
- onPageSettingsChange={handlePageSetting}
125
- assetCurrent={assetCurrent}
126
- assetSettings={assetSettings}
127
- onAssetSettingsChange={handleAssetSettings}
128
- linkCurrent={linkCurrent}
129
- linkSettings={linkSettings}
130
- onLinkSettingsChange={handleLinkSettings}
158
+ <Spin spinning={loading}>
159
+ <div className='draw-main'>
160
+ <MainHeader
161
+ render={renderRef.current}
162
+ graphType={graphType}
163
+ texting={texting}
164
+ onGraphTypeChange={(val) => renderRef.current.changeGraphType(val)}
165
+ onTexting={() => renderRef.current.changeTexting(true)}
166
+ recordCode={recordCode}
167
+ setShowGrid={handleShowGrid}
168
+ showGrid={showGrid}
169
+ setShowAttract={handleShowAttract}
170
+ showAttract={showAttract}
131
171
  />
172
+ <div className='draw-content'>
173
+ <div className='left'><AssetBar /></div>
174
+ <div className='center' ref={boardRef} >
175
+ <div ref={stageRef} />
176
+ </div>
177
+ <div className='right'>
178
+ <SettingForm
179
+ pageSettings={pageSettings}
180
+ onPageSettingsChange={handlePageSetting}
181
+ assetCurrent={assetCurrent}
182
+ assetSettings={assetSettings}
183
+ onAssetSettingsChange={handleAssetSettings}
184
+ linkCurrent={linkCurrent}
185
+ linkSettings={linkSettings}
186
+ onLinkSettingsChange={handleLinkSettings}
187
+ recordCode={recordCode}
188
+ />
189
+ </div>
190
+ </div>
132
191
  </div>
133
- </div>
192
+ </Spin>
134
193
  </div>
135
194
  )
136
195
  }
@@ -0,0 +1,60 @@
1
+ .view-loading {
2
+ width: 100%;
3
+ height: 100%;
4
+ display: flex;
5
+ align-items: center;
6
+ justify-content: center;
7
+ }
8
+
9
+ .draw-viewer {
10
+ width: 100%;
11
+ height: 100%;
12
+ display: flex;
13
+ flex-direction: column;
14
+ border-radius: 8px;
15
+ overflow: hidden;
16
+ position: relative;
17
+
18
+ *:focus-visible {
19
+ outline: none;
20
+ }
21
+
22
+ // 工具栏
23
+ .draw-viewer-toolbar {
24
+ position: absolute;
25
+ top: 20px;
26
+ right: 20px;
27
+ z-index: 9;
28
+ display: none;
29
+
30
+ .fit {
31
+ font-size: 20px;
32
+ cursor: pointer;
33
+ }
34
+ }
35
+
36
+ // 画布区域
37
+ .draw-viewer-content {
38
+ width: 100%;
39
+ flex-grow: 1;
40
+ background-color: var(--ant-layout-body-bg);
41
+ position: relative;
42
+ overflow: hidden;
43
+
44
+ // Konva canvas 容器
45
+ >div {
46
+ width: 100% !important;
47
+ height: 100% !important;
48
+
49
+ canvas {
50
+ display: block;
51
+ }
52
+ }
53
+ }
54
+ }
55
+
56
+ .draw-viewer:hover {
57
+ .draw-viewer-toolbar {
58
+ display: block;
59
+ }
60
+ }
@@ -0,0 +1,48 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { gunzipSync, strFromU8 } from 'fflate';
3
+ import { Spin } from "antd";
4
+ import { hexToUint8Array } from 'uint8array-extras';
5
+ import HcserviceV3 from "../../tmpl/hcservice-v3";
6
+ import Viewer from './view';
7
+ import './index.less';
8
+
9
+ interface Props {
10
+ recordCode: string
11
+ }
12
+
13
+ const Index = (props: Props) => {
14
+ const { recordCode } = props;
15
+ const [jsonData, setJsonData] = useState("{}"); // 画面数据
16
+ const [loading, setLoading] = useState(false); // 加载状态
17
+
18
+ // 获取视图数据
19
+ const getViewData = async () => {
20
+ setLoading(true);
21
+ const data = await HcserviceV3.getDiagram2DConfig(recordCode);
22
+ const content = data?.[0]?.content;
23
+ if (!content) {
24
+ return;
25
+ }
26
+ const temByteArray = hexToUint8Array(content.replace(/^0x/i, ""));
27
+ // 1. 将压缩的 ByteArray 解压回原始的 Uint8Array
28
+ const decompressedBuffer = gunzipSync(temByteArray);
29
+ // 2. 将 Uint8Array 转换回普通字符串
30
+ const originalData = strFromU8(decompressedBuffer);
31
+ setLoading(false);
32
+ setJsonData(originalData);
33
+ }
34
+
35
+ useEffect(() => {
36
+ if (recordCode) {
37
+ getViewData();
38
+ }
39
+ }, [recordCode])
40
+
41
+ if (loading) {
42
+ return <div className="view-loading"><Spin /></div>;
43
+ }
44
+
45
+ return <Viewer data={jsonData} />;
46
+ };
47
+
48
+ export default Index;
@@ -0,0 +1,114 @@
1
+ import React, { useEffect, useRef, useCallback } from 'react';
2
+ import { Space, Button } from "antd";
3
+ import { ExpandOutlined } from '@ant-design/icons';
4
+ import { Render } from '../edit/components/render';
5
+ import './index.less';
6
+
7
+ interface ViewerProps {
8
+ data?: string; // 画布 JSON 数据
9
+ width?: number | string;
10
+ height?: number | string;
11
+ }
12
+
13
+ const Index: React.FC<ViewerProps> = (props) => {
14
+ const { data, width = '100%', height = '100%' } = props;
15
+ const boardRef = useRef<HTMLDivElement>(null);
16
+ const stageRef = useRef<HTMLDivElement>(null);
17
+ const renderRef = useRef<Render | null>(null);
18
+ const observerRef = useRef<ResizeObserver | null>(null);
19
+
20
+ // 初始化渲染器(只读模式)
21
+ const initRender = useCallback(
22
+ (width: number, height: number) => {
23
+ if (renderRef.current || !stageRef.current) return;
24
+ const render = new Render(stageRef.current, {
25
+ width,
26
+ height,
27
+ showRuler: false, // 不需要标尺
28
+ showRefLine: false, // 不需要参考线
29
+ showPreview: false, // 不需要预览框
30
+ showContextmenu: false, // 不需要右键菜单
31
+ showBg: true,
32
+ readonly: true // ★ 只读模式
33
+ });
34
+ renderRef.current = render;
35
+ // 如果有数据,恢复画布
36
+ if (data) {
37
+ loadData(render, data);
38
+ }
39
+ },
40
+ [data]
41
+ );
42
+
43
+ // 加载画布数据
44
+ const loadData = useCallback(async (render: Render, jsonData: string) => {
45
+ try {
46
+ await render.importExportTool.restore(jsonData);
47
+ // 数据加载完成后自适应居中
48
+ render.positionTool.positionFit();
49
+ } catch (e) {
50
+ console.error('Failed to load canvas data:', e);
51
+ }
52
+ }, []);
53
+
54
+ // 监听容器尺寸变化
55
+ useEffect(() => {
56
+ if (!boardRef.current) return;
57
+ const observer = new ResizeObserver(() => {
58
+ const { width, height } = boardRef.current!.getBoundingClientRect();
59
+ if (renderRef.current) {
60
+ renderRef.current.resize(width, height); // 更新尺寸
61
+ renderRef.current.positionTool.positionFit(); // 自适应居中
62
+ } else {
63
+ initRender(width, height);
64
+ }
65
+ });
66
+ observer.observe(boardRef.current);
67
+ observerRef.current = observer;
68
+ return () => {
69
+ observer.disconnect();
70
+ };
71
+ }, []);
72
+
73
+ // 当外部 data 更新时,重新加载
74
+ useEffect(() => {
75
+ if (renderRef.current && data) {
76
+ loadData(renderRef.current, data);
77
+ }
78
+ }, [data, loadData]);
79
+
80
+ const handleFit = useCallback(() => {
81
+ if (!renderRef.current) return;
82
+ renderRef.current.positionTool.positionFit();
83
+ }, []);
84
+
85
+ // 清理
86
+ useEffect(() => {
87
+ return () => {
88
+ if (renderRef.current) {
89
+ renderRef.current.stage.destroy();
90
+ renderRef.current = null;
91
+ }
92
+ if (observerRef.current) {
93
+ observerRef.current.disconnect();
94
+ observerRef.current = null;
95
+ }
96
+ };
97
+ }, []);
98
+
99
+ return (
100
+ <div className="draw-viewer" style={{ width, height }}>
101
+ <div className="draw-viewer-toolbar">
102
+ <Space>
103
+ <Button type="text" className='fit' onClick={handleFit} icon={<ExpandOutlined />} />
104
+ </Space>
105
+ </div>
106
+ {/* 画布区域 */}
107
+ <div className="draw-viewer-content" ref={boardRef}>
108
+ <div ref={stageRef} />
109
+ </div>
110
+ </div>
111
+ );
112
+ };
113
+
114
+ export default Index;
@@ -149,7 +149,7 @@ export default class FormItemGroup extends React.PureComponent<
149
149
  wrapperCol={{ span: wrapperColSpan }}
150
150
  tooltip={(!item.tip || item.tip == "") ? undefined : item.tip}
151
151
  initialValue={fieldValue}
152
- style={{ margin: 4 }}
152
+ style={{ margin: "4px 4px 12px" }}
153
153
  rules={TmplConfigAnalysis.getRules(item, translate)}
154
154
  >
155
155
  <RenderEntryControl
@@ -201,7 +201,6 @@ export default class FormItemGroup extends React.PureComponent<
201
201
  </FormItem>
202
202
  );
203
203
  } else {
204
-
205
204
  formItem = item.shouldUpdate ? (
206
205
  <FormItem noStyle shouldUpdate={item.shouldUpdate}>
207
206
  {() => this.initFormItem(item, fieldValue)}
@@ -219,13 +218,13 @@ export default class FormItemGroup extends React.PureComponent<
219
218
  for (let i = 0; i < formItemList.length; i = i + 1) {
220
219
  let colSpan = fields[i].colSpan;
221
220
 
222
- if (fields[i].extControlType == "hidden") {
221
+ if (fields[i].extControlType == "hidden" || fields[i].hidden) {
223
222
  colSpan = 0;
224
223
  } else if (maxColsOnRow && maxColsOnRow == 1) {
225
224
  colSpan = 2;
226
225
  }
227
226
  let col = (
228
- <Col key={i} span={12 * colSpan} >
227
+ <Col key={i} span={12 * colSpan} style={{ width: "stretch" }}>
229
228
  {formItemList[i]}
230
229
  </Col>
231
230
  );
@@ -233,7 +232,7 @@ export default class FormItemGroup extends React.PureComponent<
233
232
  }
234
233
 
235
234
  const row = (
236
- <Row gutter={[16, 8]} key={1}>
235
+ <Row gutter={[16, 0]} key={1}>
237
236
  {colList}
238
237
  </Row>
239
238
  );