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.
- package/lib/controls/action/utils.d.ts +1 -1
- package/lib/controls/entity-select/entity-select.d.ts +2 -2
- package/lib/controls/entity-select/entity-select.d.ts.map +1 -1
- package/lib/controls/entity-select/entity-select.js +16 -7
- package/lib/controls/entity-select/entity-select.js.map +1 -1
- package/lib/controls/entry-control.d.ts.map +1 -1
- package/lib/controls/entry-control.js +1 -0
- package/lib/controls/entry-control.js.map +1 -1
- package/lib/controls/select/index.d.ts.map +1 -1
- package/lib/controls/select/index.js +13 -7
- package/lib/controls/select/index.js.map +1 -1
- package/lib/controls/text/index.less +1 -0
- package/lib/controls/view-control.d.ts.map +1 -1
- package/lib/controls/view-control.js +1 -0
- package/lib/controls/view-control.js.map +1 -1
- package/lib/detail/button/edit-button.d.ts.map +1 -1
- package/lib/detail/button/edit-button.js +23 -11
- package/lib/detail/button/edit-button.js.map +1 -1
- package/lib/detail/button/view-button.d.ts.map +1 -1
- package/lib/detail/button/view-button.js +21 -10
- package/lib/detail/button/view-button.js.map +1 -1
- package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/asset-bar/index.js +1 -0
- package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -1
- package/lib/draw-canvas/edit/components/main-header/index.d.ts +5 -0
- package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/main-header/index.js +54 -14
- package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -1
- package/lib/draw-canvas/edit/components/render/index.d.ts +4 -0
- package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/render/index.js +20 -14
- package/lib/draw-canvas/edit/components/render/index.js.map +1 -1
- package/lib/draw-canvas/edit/components/render/types.d.ts +5 -1
- package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts +26 -0
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.d.ts.map +1 -0
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.js +83 -0
- package/lib/draw-canvas/edit/components/setting-form/imag-upload.js.map +1 -0
- package/lib/draw-canvas/edit/components/setting-form/index.d.ts +1 -3
- package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/components/setting-form/index.js +94 -15
- package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -1
- package/lib/draw-canvas/edit/constant.d.ts +7 -0
- package/lib/draw-canvas/edit/constant.d.ts.map +1 -0
- package/lib/draw-canvas/edit/constant.js +7 -0
- package/lib/draw-canvas/edit/constant.js.map +1 -0
- package/lib/draw-canvas/edit/index.d.ts +4 -1
- package/lib/draw-canvas/edit/index.d.ts.map +1 -1
- package/lib/draw-canvas/edit/index.js +63 -10
- package/lib/draw-canvas/edit/index.js.map +1 -1
- package/lib/draw-canvas/edit/index.less +17 -2
- package/lib/draw-canvas/view/index.d.ts +8 -0
- package/lib/draw-canvas/view/index.d.ts.map +1 -0
- package/lib/draw-canvas/view/index.js +50 -0
- package/lib/draw-canvas/view/index.js.map +1 -0
- package/lib/draw-canvas/view/index.less +60 -0
- package/lib/draw-canvas/view/view.d.ts +10 -0
- package/lib/draw-canvas/view/view.d.ts.map +1 -0
- package/lib/draw-canvas/view/view.js +104 -0
- package/lib/draw-canvas/view/view.js.map +1 -0
- package/lib/form/form-Item-group.d.ts.map +1 -1
- package/lib/form/form-Item-group.js +4 -4
- package/lib/form/form-Item-group.js.map +1 -1
- package/lib/lowcode-components/index.d.ts +2 -0
- package/lib/lowcode-components/index.d.ts.map +1 -1
- package/lib/lowcode-components/index.js +2 -1
- package/lib/lowcode-components/index.js.map +1 -1
- package/lib/lowcode-components/lowcode-view/component/assets.d.ts.map +1 -1
- package/lib/lowcode-components/lowcode-view/component/assets.js +8 -0
- package/lib/lowcode-components/lowcode-view/component/assets.js.map +1 -1
- package/lib/lowcode-components/radar-chart/index.d.ts +51 -0
- package/lib/lowcode-components/radar-chart/index.d.ts.map +1 -0
- package/lib/lowcode-components/radar-chart/index.js +276 -0
- package/lib/lowcode-components/radar-chart/index.js.map +1 -0
- package/lib/module/dtmpl-edit-card.d.ts.map +1 -1
- package/lib/module/dtmpl-edit-card.js +18 -1
- package/lib/module/dtmpl-edit-card.js.map +1 -1
- package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
- package/lib/module/dtmpl-edit-page.js +19 -2
- package/lib/module/dtmpl-edit-page.js.map +1 -1
- package/lib/routable/ltmpl-route.d.ts +2 -0
- package/lib/routable/ltmpl-route.d.ts.map +1 -1
- package/lib/routable/ltmpl-route.js +20 -4
- package/lib/routable/ltmpl-route.js.map +1 -1
- package/lib/table/act-table.d.ts +2 -0
- package/lib/table/act-table.d.ts.map +1 -1
- package/lib/table/act-table.js +4 -4
- package/lib/table/act-table.js.map +1 -1
- package/lib/table/column/column-builder.d.ts.map +1 -1
- package/lib/table/column/column-builder.js +23 -8
- package/lib/table/column/column-builder.js.map +1 -1
- package/lib/table/relation-table.d.ts +3 -0
- package/lib/table/relation-table.d.ts.map +1 -1
- package/lib/tmpl/control-type-supportor.d.ts.map +1 -1
- package/lib/tmpl/control-type-supportor.js +1 -0
- package/lib/tmpl/control-type-supportor.js.map +1 -1
- package/lib/tmpl/hcservice-v3.d.ts +2 -0
- package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
- package/lib/tmpl/hcservice-v3.js +34 -0
- package/lib/tmpl/hcservice-v3.js.map +1 -1
- package/lib/tmpl/interface.d.ts +13 -1
- package/lib/tmpl/interface.d.ts.map +1 -1
- package/lib/tmpl/interface.js.map +1 -1
- package/lib/tmpl/tmpl-config-analysis.js +1 -1
- package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
- package/lib/units/index.d.ts +2 -1
- package/lib/units/index.d.ts.map +1 -1
- package/lib/units/index.js +17 -3
- package/lib/units/index.js.map +1 -1
- package/package.json +4 -1
- package/src/aldehyde/controls/entity-select/entity-select.tsx +18 -8
- package/src/aldehyde/controls/entry-control.tsx +1 -0
- package/src/aldehyde/controls/select/index.tsx +7 -6
- package/src/aldehyde/controls/text/index.less +1 -0
- package/src/aldehyde/controls/view-control.tsx +1 -0
- package/src/aldehyde/detail/button/edit-button.tsx +21 -22
- package/src/aldehyde/detail/button/view-button.tsx +23 -21
- package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +3 -1
- package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +59 -13
- package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +130 -65
- package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +33 -15
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +19 -22
- package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +38 -30
- package/src/aldehyde/draw-canvas/edit/components/render/index.ts +17 -9
- package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +40 -58
- package/src/aldehyde/draw-canvas/edit/components/render/types.ts +5 -1
- package/src/aldehyde/draw-canvas/edit/components/setting-form/imag-upload.tsx +118 -0
- package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +111 -16
- package/src/aldehyde/draw-canvas/edit/constant.ts +6 -0
- package/src/aldehyde/draw-canvas/edit/index.less +17 -2
- package/src/aldehyde/draw-canvas/edit/index.tsx +84 -25
- package/src/aldehyde/draw-canvas/view/index.less +60 -0
- package/src/aldehyde/draw-canvas/view/index.tsx +48 -0
- package/src/aldehyde/draw-canvas/view/view.tsx +114 -0
- package/src/aldehyde/form/form-Item-group.tsx +4 -5
- package/src/aldehyde/lowcode-components/index.ts +4 -2
- package/src/aldehyde/lowcode-components/lowcode-view/component/assets.ts +8 -0
- package/src/aldehyde/lowcode-components/radar-chart/index.tsx +323 -0
- package/src/aldehyde/module/dtmpl-edit-card.tsx +18 -1
- package/src/aldehyde/module/dtmpl-edit-page.tsx +19 -2
- package/src/aldehyde/routable/ltmpl-route.tsx +39 -3
- package/src/aldehyde/table/act-table.tsx +7 -4
- package/src/aldehyde/table/column/column-builder.tsx +29 -9
- package/src/aldehyde/tmpl/control-type-supportor.tsx +1 -0
- package/src/aldehyde/tmpl/hcservice-v3.tsx +30 -0
- package/src/aldehyde/tmpl/interface.tsx +13 -1
- package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +1 -1
- 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: "
|
|
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
|
-
|
|
108
|
+
recordCode?: string; // 当前画面关联数据code
|
|
97
109
|
}
|
|
98
110
|
|
|
99
111
|
const Index = (props: Props) => {
|
|
100
|
-
const { pageSettings, onPageSettingsChange, assetCurrent, assetSettings, onAssetSettingsChange, linkCurrent, linkSettings, onLinkSettingsChange,
|
|
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={{
|
|
111
|
-
|
|
177
|
+
return <FormItem label={r.title} layout='vertical' style={{ marginBottom: "12px", paddingInline: "4px" }}>
|
|
178
|
+
{handleFormItemType(r.fields)}
|
|
112
179
|
</FormItem>;
|
|
113
180
|
}
|
|
114
|
-
return
|
|
181
|
+
return handleFormItemType(r.fields, "vertical");
|
|
115
182
|
});
|
|
116
183
|
}
|
|
117
|
-
return
|
|
184
|
+
return handleFormItemType(item.fields, "vertical");
|
|
118
185
|
}
|
|
119
186
|
|
|
120
187
|
// 当前表单配置
|
|
121
188
|
const currentFormConfig = useMemo(() => {
|
|
122
|
-
let temFormConfig =
|
|
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
|
-
|
|
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
|
-
}, [
|
|
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
|
-
|
|
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
|
// 表单数据实时回显更新
|
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
.draw {
|
|
2
2
|
width: 100%;
|
|
3
3
|
height: 100%;
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
<
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
</
|
|
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:
|
|
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,
|
|
235
|
+
<Row gutter={[16, 0]} key={1}>
|
|
237
236
|
{colList}
|
|
238
237
|
</Row>
|
|
239
238
|
);
|