@hzab/flowlong-designer 1.0.1 → 1.0.3
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/CHANGELOG.md +10 -0
- package/package.json +4 -1
- package/src/components/NodeWrap/Nodes/AddNode/index.tsx +2 -2
- package/src/components/NodeWrap/Nodes/Approver/index.tsx +64 -51
- package/src/components/NodeWrap/Nodes/Branch/components/Field/index.tsx +4 -1
- package/src/components/NodeWrap/Nodes/Branch/components/GroupUserSelectorModal/index.tsx +7 -3
- package/src/components/NodeWrap/Nodes/Branch/index.less +40 -13
- package/src/components/NodeWrap/Nodes/Branch/index.tsx +84 -47
- package/src/components/NodeWrap/Nodes/Promoter/index.tsx +35 -28
- package/src/components/NodeWrap/Nodes/Send/index.tsx +63 -51
- package/src/components/Selector/index.tsx +1 -0
- package/src/index.less +39 -33
- package/src/index.tsx +83 -78
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hzab/flowlong-designer",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "自定义审批流配置组件",
|
|
5
5
|
"main": "src",
|
|
6
6
|
"scripts": {
|
|
@@ -54,5 +54,8 @@
|
|
|
54
54
|
"@hzab/deep-list": ">=0.0.2",
|
|
55
55
|
"@hzab/group-user-selector": ">=0.0.4",
|
|
56
56
|
"nanoid": "^3.3.7"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"react-draggable": "^4.5.0"
|
|
57
60
|
}
|
|
58
61
|
}
|
|
@@ -78,7 +78,7 @@ export function getNodeKey() {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
export const AddNode = (props) => {
|
|
81
|
-
const { modelValue, onChange, disable } = props;
|
|
81
|
+
const { modelValue, onChange, disable, readOnly } = props;
|
|
82
82
|
/**重置nodeKey */
|
|
83
83
|
const resetNodeKey = (item) => {
|
|
84
84
|
if (item?.nodeKey) {
|
|
@@ -122,7 +122,7 @@ export const AddNode = (props) => {
|
|
|
122
122
|
}
|
|
123
123
|
>
|
|
124
124
|
<Button
|
|
125
|
-
disabled={disable}
|
|
125
|
+
disabled={disable || readOnly}
|
|
126
126
|
className="add-node-btn"
|
|
127
127
|
type="primary"
|
|
128
128
|
shape="circle"
|
|
@@ -10,7 +10,7 @@ import { SelectContext } from "../../../Selector/SelectContext";
|
|
|
10
10
|
import "./index.less";
|
|
11
11
|
|
|
12
12
|
export const Approver = (props) => {
|
|
13
|
-
const { modelValue = {}, onChange, disable } = props;
|
|
13
|
+
const { modelValue = {}, onChange, disable, readOnly } = props;
|
|
14
14
|
const [form, setForm] = useState({
|
|
15
15
|
nodeName: "",
|
|
16
16
|
setType: undefined,
|
|
@@ -120,7 +120,7 @@ export const Approver = (props) => {
|
|
|
120
120
|
<div className="title" style={{ background: "#ff943e" }}>
|
|
121
121
|
<UserOutlined />
|
|
122
122
|
<span>{modelValue?.nodeName}</span>
|
|
123
|
-
{!disable && <DeleteOutlined className="node-close-btn" onClick={onNodeDel} />}
|
|
123
|
+
{!disable && !readOnly && <DeleteOutlined className="node-close-btn" onClick={onNodeDel} />}
|
|
124
124
|
</div>
|
|
125
125
|
<div className="content">
|
|
126
126
|
{toText(modelValue) ? <span>{toText(modelValue)}</span> : <span className="placeholder">请选择</span>}
|
|
@@ -152,7 +152,9 @@ export const Approver = (props) => {
|
|
|
152
152
|
) : (
|
|
153
153
|
<div className="drawer-title">
|
|
154
154
|
{form.nodeName || "审批人设置"}
|
|
155
|
-
{!disable &&
|
|
155
|
+
{!disable && !readOnly && (
|
|
156
|
+
<EditOutlined className="node-wrap-drawer__title-edit" onClick={onEditTitle} />
|
|
157
|
+
)}
|
|
156
158
|
</div>
|
|
157
159
|
)}
|
|
158
160
|
</div>
|
|
@@ -162,12 +164,14 @@ export const Approver = (props) => {
|
|
|
162
164
|
destroyOnClose
|
|
163
165
|
getContainer="body"
|
|
164
166
|
footer={
|
|
165
|
-
|
|
166
|
-
<
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
167
|
+
readOnly ? null : (
|
|
168
|
+
<div className="approver-drawer-footer">
|
|
169
|
+
<Button type="primary" onClick={onDrawerSave} disabled={disable}>
|
|
170
|
+
保存
|
|
171
|
+
</Button>
|
|
172
|
+
<Button onClick={onDrawerClose}>取消</Button>
|
|
173
|
+
</div>
|
|
174
|
+
)
|
|
171
175
|
}
|
|
172
176
|
>
|
|
173
177
|
<Form
|
|
@@ -181,6 +185,7 @@ export const Approver = (props) => {
|
|
|
181
185
|
>
|
|
182
186
|
<Form.Item label="审批人员类型" name="setType">
|
|
183
187
|
<Select
|
|
188
|
+
disabled={readOnly}
|
|
184
189
|
options={setTypeOptions}
|
|
185
190
|
value={form.setType}
|
|
186
191
|
onSelect={(val) => {
|
|
@@ -191,38 +196,42 @@ export const Approver = (props) => {
|
|
|
191
196
|
return { ...f };
|
|
192
197
|
});
|
|
193
198
|
}}
|
|
199
|
+
className={`${readOnly ? "readonly-select" : ""}`}
|
|
194
200
|
/>
|
|
195
201
|
</Form.Item>
|
|
196
202
|
|
|
197
203
|
{form.setType === 1 ? (
|
|
198
204
|
<Form.Item label="选择成员" name="nodeAssigneeList">
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
205
|
+
{readOnly ? null : (
|
|
206
|
+
<Button
|
|
207
|
+
type="primary"
|
|
208
|
+
icon={<PlusOutlined />}
|
|
209
|
+
onClick={() =>
|
|
210
|
+
selectorCtx.setSelectHandler(
|
|
211
|
+
1,
|
|
212
|
+
form.nodeAssigneeList,
|
|
213
|
+
(selected) => {
|
|
214
|
+
setForm((f) => {
|
|
215
|
+
// 设置 人员、角色 列表数组
|
|
216
|
+
f.nodeAssigneeList = selected;
|
|
217
|
+
return { ...f };
|
|
218
|
+
});
|
|
219
|
+
},
|
|
220
|
+
2,
|
|
221
|
+
)
|
|
222
|
+
}
|
|
223
|
+
>
|
|
224
|
+
选择人员
|
|
225
|
+
</Button>
|
|
226
|
+
)}
|
|
227
|
+
|
|
219
228
|
<div className="tags-list">
|
|
220
229
|
{form.nodeAssigneeList?.map((user, idx) => {
|
|
221
230
|
return (
|
|
222
231
|
<Tag
|
|
223
232
|
key={user.id || idx}
|
|
224
233
|
className="node-assignee-item"
|
|
225
|
-
closable
|
|
234
|
+
closable={!readOnly}
|
|
226
235
|
onClose={() => {
|
|
227
236
|
onUserDel(idx);
|
|
228
237
|
}}
|
|
@@ -254,33 +263,36 @@ export const Approver = (props) => {
|
|
|
254
263
|
|
|
255
264
|
{form.setType === 3 ? (
|
|
256
265
|
<Form.Item label="选择角色" name="nodeAssigneeList">
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
266
|
+
{readOnly ? null : (
|
|
267
|
+
<Button
|
|
268
|
+
type="primary"
|
|
269
|
+
icon={<PlusOutlined />}
|
|
270
|
+
onClick={() =>
|
|
271
|
+
selectorCtx.setSelectHandler(
|
|
272
|
+
2,
|
|
273
|
+
form.nodeAssigneeList,
|
|
274
|
+
(selected) => {
|
|
275
|
+
setForm((f) => {
|
|
276
|
+
// 设置 人员、角色 列表数组
|
|
277
|
+
f.nodeAssigneeList = selected;
|
|
278
|
+
return { ...f };
|
|
279
|
+
});
|
|
280
|
+
},
|
|
281
|
+
2,
|
|
282
|
+
)
|
|
283
|
+
}
|
|
284
|
+
>
|
|
285
|
+
选择角色
|
|
286
|
+
</Button>
|
|
287
|
+
)}
|
|
288
|
+
|
|
277
289
|
<div className="tags-list">
|
|
278
290
|
{form.nodeAssigneeList?.map((it, idx) => {
|
|
279
291
|
return (
|
|
280
292
|
<Tag
|
|
281
293
|
key={it.id || idx}
|
|
282
294
|
className="node-assignee-item"
|
|
283
|
-
closable
|
|
295
|
+
closable={!readOnly}
|
|
284
296
|
onClose={() => {
|
|
285
297
|
onRoleDel(idx);
|
|
286
298
|
}}
|
|
@@ -384,6 +396,7 @@ export const Approver = (props) => {
|
|
|
384
396
|
<Radio.Group
|
|
385
397
|
options={examineModeOptions}
|
|
386
398
|
value={form.examineMode}
|
|
399
|
+
style={readOnly ? { pointerEvents: "none" } : {}}
|
|
387
400
|
onChange={(e) => {
|
|
388
401
|
setForm((f) => {
|
|
389
402
|
form.examineMode = e.target.value;
|
|
@@ -6,13 +6,15 @@ interface FormMapProps {
|
|
|
6
6
|
onChange?: (v: any) => void;
|
|
7
7
|
value?: any;
|
|
8
8
|
disabled?: boolean;
|
|
9
|
+
readOnly?: boolean;
|
|
9
10
|
}
|
|
10
11
|
const Field = (props: FormMapProps) => {
|
|
11
|
-
const { type, onChange, value, disabled } = props;
|
|
12
|
+
const { type, onChange, value, disabled, readOnly } = props;
|
|
12
13
|
return (
|
|
13
14
|
<>
|
|
14
15
|
{["day", "hour"].includes(type) && (
|
|
15
16
|
<Input
|
|
17
|
+
readOnly={readOnly}
|
|
16
18
|
disabled={disabled}
|
|
17
19
|
value={value}
|
|
18
20
|
placeholder="值"
|
|
@@ -28,6 +30,7 @@ const Field = (props: FormMapProps) => {
|
|
|
28
30
|
onChange={onChange}
|
|
29
31
|
value={value}
|
|
30
32
|
disabled={disabled}
|
|
33
|
+
readOnly={readOnly}
|
|
31
34
|
></GroupUserSelectorModal>
|
|
32
35
|
)}
|
|
33
36
|
</>
|
|
@@ -12,7 +12,7 @@ const titleMap = {
|
|
|
12
12
|
assignee: "用户",
|
|
13
13
|
};
|
|
14
14
|
const GroupUserSelectorModal = (props) => {
|
|
15
|
-
const { type, onChange, value = [], disabled } = props;
|
|
15
|
+
const { type, onChange, value = [], disabled, readOnly } = props;
|
|
16
16
|
const [open, setOpen] = useState(false);
|
|
17
17
|
const groupUserSelectorRef = useRef(null);
|
|
18
18
|
const deptModel = new DataModel({
|
|
@@ -94,12 +94,15 @@ const GroupUserSelectorModal = (props) => {
|
|
|
94
94
|
<Input
|
|
95
95
|
disabled={disabled}
|
|
96
96
|
value={value?.deptUserLabel || null}
|
|
97
|
-
readOnly
|
|
97
|
+
readOnly={readOnly}
|
|
98
98
|
onClick={() => {
|
|
99
|
+
if (readOnly) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
99
102
|
setOpen(true);
|
|
100
103
|
}}
|
|
101
104
|
placeholder="请点击编辑"
|
|
102
|
-
style={
|
|
105
|
+
style={disabled || readOnly ? {} : { cursor: "pointer" }}
|
|
103
106
|
></Input>
|
|
104
107
|
<Modal
|
|
105
108
|
title={titleMap[type]}
|
|
@@ -121,6 +124,7 @@ const GroupUserSelectorModal = (props) => {
|
|
|
121
124
|
model={model}
|
|
122
125
|
searchModel={model}
|
|
123
126
|
{...(type === "assignee" ? userListConfig : {})}
|
|
127
|
+
readOnly={readOnly}
|
|
124
128
|
></GroupUserSelector>
|
|
125
129
|
</div>
|
|
126
130
|
</Modal>
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
flex-shrink: 0;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
.col-box
|
|
20
|
+
.col-box,
|
|
21
|
+
.col-box-custom {
|
|
21
22
|
display: inline-flex;
|
|
22
23
|
flex-direction: column;
|
|
23
24
|
align-items: center;
|
|
@@ -49,6 +50,12 @@
|
|
|
49
50
|
background-color: rgb(202, 202, 202);
|
|
50
51
|
}
|
|
51
52
|
|
|
53
|
+
.branch-box .col-box-custom {
|
|
54
|
+
border-right: 2px solid #ffffff;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
52
59
|
.condition-node {
|
|
53
60
|
display: inline-flex;
|
|
54
61
|
flex-direction: column;
|
|
@@ -81,7 +88,8 @@
|
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
.auto-judge,
|
|
84
|
-
.auto-judge-disable
|
|
91
|
+
.auto-judge-disable,
|
|
92
|
+
.auto-judge-read-only {
|
|
85
93
|
position: relative;
|
|
86
94
|
width: 220px;
|
|
87
95
|
min-height: 72px;
|
|
@@ -92,8 +100,11 @@
|
|
|
92
100
|
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.1);
|
|
93
101
|
}
|
|
94
102
|
|
|
103
|
+
|
|
104
|
+
|
|
95
105
|
.auto-judge::before,
|
|
96
|
-
.auto-judge-disable::before
|
|
106
|
+
.auto-judge-disable::before,
|
|
107
|
+
.auto-judge-read-only::before {
|
|
97
108
|
content: "";
|
|
98
109
|
position: absolute;
|
|
99
110
|
top: -12px;
|
|
@@ -107,17 +118,20 @@
|
|
|
107
118
|
}
|
|
108
119
|
|
|
109
120
|
.auto-judge .title,
|
|
110
|
-
.auto-judge-disable .title
|
|
121
|
+
.auto-judge-disable .title,
|
|
122
|
+
.auto-judge-read-only .title {
|
|
111
123
|
line-height: 16px;
|
|
112
124
|
}
|
|
113
125
|
|
|
114
126
|
.auto-judge .title .node-title,
|
|
115
|
-
.auto-judge-disable .title .node-title
|
|
127
|
+
.auto-judge-disable .title .node-title,
|
|
128
|
+
.auto-judge-read-only .title .node-title {
|
|
116
129
|
color: #15bc83;
|
|
117
130
|
}
|
|
118
131
|
|
|
119
132
|
.auto-judge .title .delete-btn,
|
|
120
|
-
.auto-judge-disable .title .delete-btn
|
|
133
|
+
.auto-judge-disable .title .delete-btn,
|
|
134
|
+
.auto-judge-read-only .title .delete-btn {
|
|
121
135
|
font-size: 15px;
|
|
122
136
|
position: absolute;
|
|
123
137
|
top: 15px;
|
|
@@ -127,7 +141,8 @@
|
|
|
127
141
|
}
|
|
128
142
|
|
|
129
143
|
.auto-judge .title .priority-title,
|
|
130
|
-
.auto-judge-disable .title .priority-title
|
|
144
|
+
.auto-judge-disable .title .priority-title,
|
|
145
|
+
.auto-judge-read-only .title .priority-title {
|
|
131
146
|
position: absolute;
|
|
132
147
|
top: 15px;
|
|
133
148
|
right: 15px;
|
|
@@ -135,13 +150,15 @@
|
|
|
135
150
|
}
|
|
136
151
|
|
|
137
152
|
.auto-judge .content,
|
|
138
|
-
.auto-judge-disable .content
|
|
153
|
+
.auto-judge-disable .content,
|
|
154
|
+
.auto-judge-read-only .content {
|
|
139
155
|
position: relative;
|
|
140
156
|
padding-top: 15px;
|
|
141
157
|
}
|
|
142
158
|
|
|
143
159
|
.auto-judge .content .placeholder,
|
|
144
|
-
.auto-judge-disable .content .placeholder
|
|
160
|
+
.auto-judge-disable .content .placeholder,
|
|
161
|
+
.auto-judge-read-only .content .placeholder {
|
|
145
162
|
color: #999;
|
|
146
163
|
}
|
|
147
164
|
|
|
@@ -166,7 +183,8 @@
|
|
|
166
183
|
}
|
|
167
184
|
|
|
168
185
|
.auto-judge .sort-left,
|
|
169
|
-
.auto-judge-disable .sort-left
|
|
186
|
+
.auto-judge-disable .sort-left,
|
|
187
|
+
.auto-judge-read-only .sort-left {
|
|
170
188
|
position: absolute;
|
|
171
189
|
top: 0;
|
|
172
190
|
bottom: 0;
|
|
@@ -179,7 +197,8 @@
|
|
|
179
197
|
}
|
|
180
198
|
|
|
181
199
|
.auto-judge .sort-right,
|
|
182
|
-
.auto-judge-disable .sort-right
|
|
200
|
+
.auto-judge-disable .sort-right,
|
|
201
|
+
.auto-judge-read-only .sort-right {
|
|
183
202
|
position: absolute;
|
|
184
203
|
top: 0;
|
|
185
204
|
bottom: 0;
|
|
@@ -197,7 +216,8 @@
|
|
|
197
216
|
}
|
|
198
217
|
|
|
199
218
|
.auto-judge:after,
|
|
200
|
-
.auto-judge-disable:after
|
|
219
|
+
.auto-judge-disable:after,
|
|
220
|
+
.auto-judge-read-only:after {
|
|
201
221
|
pointer-events: none;
|
|
202
222
|
content: "";
|
|
203
223
|
position: absolute;
|
|
@@ -210,15 +230,22 @@
|
|
|
210
230
|
transition: all 0.1s;
|
|
211
231
|
}
|
|
212
232
|
|
|
213
|
-
.auto-judge:hover:after
|
|
233
|
+
.auto-judge:hover:after,
|
|
234
|
+
.auto-judge-read-only:hover:after {
|
|
214
235
|
border: 1px solid #3296fa;
|
|
215
236
|
box-shadow: 0 0 6px 0 rgba(50, 150, 250, 0.3);
|
|
237
|
+
|
|
216
238
|
}
|
|
217
239
|
|
|
218
240
|
.auto-judge-disable {
|
|
219
241
|
cursor: not-allowed;
|
|
220
242
|
}
|
|
221
243
|
|
|
244
|
+
.auto-judge-read-only {
|
|
245
|
+
cursor: pointer;
|
|
246
|
+
|
|
247
|
+
}
|
|
248
|
+
|
|
222
249
|
.top-left-cover-line,
|
|
223
250
|
.top-right-cover-line {
|
|
224
251
|
position: absolute;
|
|
@@ -37,7 +37,7 @@ const timeType = ["day", "hour"];
|
|
|
37
37
|
/** 部门或用户 */
|
|
38
38
|
const deptUserType = ["dept", "assignee"];
|
|
39
39
|
export const Branch = (props) => {
|
|
40
|
-
const { modelValue: nodeConfig, onChange, ItemSlot, disable } = props;
|
|
40
|
+
const { modelValue: nodeConfig, onChange, ItemSlot, disable, readOnly } = props;
|
|
41
41
|
const [form, setForm] = useState({
|
|
42
42
|
nodeName: "",
|
|
43
43
|
setType: undefined,
|
|
@@ -67,6 +67,9 @@ export const Branch = (props) => {
|
|
|
67
67
|
return arr;
|
|
68
68
|
}
|
|
69
69
|
function onTermAdd() {
|
|
70
|
+
if (readOnly) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
70
73
|
if (!nodeConfig.conditionNodes) {
|
|
71
74
|
nodeConfig.conditionNodes = [];
|
|
72
75
|
}
|
|
@@ -274,22 +277,42 @@ export const Branch = (props) => {
|
|
|
274
277
|
operatorOptions,
|
|
275
278
|
};
|
|
276
279
|
};
|
|
280
|
+
|
|
281
|
+
const getEvenNumber = (number) => {
|
|
282
|
+
return number % 2 === 0;
|
|
283
|
+
};
|
|
284
|
+
|
|
277
285
|
return (
|
|
278
286
|
<div className="branch-wrap">
|
|
279
287
|
<div className="branch-box-wrap">
|
|
280
288
|
<div className="branch-box">
|
|
281
|
-
<Button
|
|
289
|
+
<Button
|
|
290
|
+
className="add-branch"
|
|
291
|
+
onClick={onTermAdd}
|
|
292
|
+
disabled={disable}
|
|
293
|
+
style={readOnly ? { cursor: "default" } : {}}
|
|
294
|
+
>
|
|
282
295
|
添加条件
|
|
283
296
|
</Button>
|
|
284
297
|
{nodeConfig?.conditionNodes?.map((item, idx) => {
|
|
285
298
|
const conditionDisable = idx == nodeConfig.conditionNodes?.length - 1;
|
|
286
|
-
|
|
299
|
+
let num = 0;
|
|
300
|
+
let autoJudgeClassName = "auto-judge";
|
|
301
|
+
if (getEvenNumber(nodeConfig?.conditionNodes?.length)) {
|
|
302
|
+
num = nodeConfig?.conditionNodes?.length / 2;
|
|
303
|
+
}
|
|
304
|
+
if (conditionDisable) {
|
|
305
|
+
autoJudgeClassName = "auto-judge-disable";
|
|
306
|
+
}
|
|
307
|
+
if (readOnly) {
|
|
308
|
+
autoJudgeClassName = "auto-judge-read-only";
|
|
309
|
+
}
|
|
287
310
|
return (
|
|
288
|
-
<div className="col-box" key={idx}>
|
|
311
|
+
<div className={`col-box ${num - 1 === idx ? "col-box-custom" : ""}`} key={idx}>
|
|
289
312
|
<div className="condition-node">
|
|
290
313
|
<div className="condition-node-box">
|
|
291
314
|
<div
|
|
292
|
-
className={
|
|
315
|
+
className={autoJudgeClassName}
|
|
293
316
|
onClick={() => {
|
|
294
317
|
if (!conditionDisable) {
|
|
295
318
|
onShow(idx);
|
|
@@ -312,16 +335,15 @@ export const Branch = (props) => {
|
|
|
312
335
|
<div className="title">
|
|
313
336
|
<span className="node-title">{item.nodeName}</span>
|
|
314
337
|
<span className="priority-title">优先级{item.priorityLevel}</span>
|
|
315
|
-
{!conditionDisable
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
))}
|
|
338
|
+
{!conditionDisable && !disable && !readOnly && (
|
|
339
|
+
<DeleteOutlined
|
|
340
|
+
className="delete-btn"
|
|
341
|
+
onClick={(e) => {
|
|
342
|
+
e.stopPropagation();
|
|
343
|
+
onTermDel(idx);
|
|
344
|
+
}}
|
|
345
|
+
/>
|
|
346
|
+
)}
|
|
325
347
|
</div>
|
|
326
348
|
<div className="content">
|
|
327
349
|
{toText(nodeConfig, idx) ? (
|
|
@@ -404,17 +426,23 @@ export const Branch = (props) => {
|
|
|
404
426
|
) : (
|
|
405
427
|
<div className="drawer-title">
|
|
406
428
|
{form.nodeName || "条件设置"}
|
|
407
|
-
{!disable &&
|
|
429
|
+
{!disable && !readOnly && (
|
|
430
|
+
<EditOutlined className="node-wrap-drawer__title-edit" onClick={onEditTitle} />
|
|
431
|
+
)}
|
|
408
432
|
</div>
|
|
409
433
|
)}
|
|
410
434
|
</div>
|
|
411
435
|
}
|
|
412
436
|
footer={
|
|
413
437
|
<>
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
438
|
+
{readOnly ? null : (
|
|
439
|
+
<>
|
|
440
|
+
<Button type="primary" onClick={onDrawerSave} disabled={disable}>
|
|
441
|
+
保存
|
|
442
|
+
</Button>
|
|
443
|
+
<Button onClick={onDrawerClose}>取消</Button>
|
|
444
|
+
</>
|
|
445
|
+
)}
|
|
418
446
|
</>
|
|
419
447
|
}
|
|
420
448
|
>
|
|
@@ -426,16 +454,18 @@ export const Branch = (props) => {
|
|
|
426
454
|
<div className="condition-group-editor">
|
|
427
455
|
<div className="header">
|
|
428
456
|
<span>条件组 {conditionGroupIdx + 1}</span>
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
457
|
+
{readOnly ? null : (
|
|
458
|
+
<div
|
|
459
|
+
onClick={() => {
|
|
460
|
+
if (disable) {
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
deleteConditionGroup(conditionGroupIdx);
|
|
464
|
+
}}
|
|
465
|
+
>
|
|
466
|
+
<DeleteOutlined className={`branch-delete-icon ${disable ? "disable-delete-button" : ""}`} />
|
|
467
|
+
</div>
|
|
468
|
+
)}
|
|
439
469
|
</div>
|
|
440
470
|
|
|
441
471
|
<div className="main-content">
|
|
@@ -452,19 +482,21 @@ export const Branch = (props) => {
|
|
|
452
482
|
<div className="condition-content" key={idx}>
|
|
453
483
|
<div className="condition-relation">
|
|
454
484
|
<span>{idx == 0 ? "当" : "且"}</span>
|
|
455
|
-
|
|
456
|
-
<
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
485
|
+
{readOnly ? null : (
|
|
486
|
+
<div onClick={() => deleteConditionList(conditionGroup, idx)}>
|
|
487
|
+
<DeleteOutlined
|
|
488
|
+
className={`branch-delete-icon ${disable ? "disable-delete-button" : ""}`}
|
|
489
|
+
/>
|
|
490
|
+
</div>
|
|
491
|
+
)}
|
|
460
492
|
</div>
|
|
461
493
|
<div className="condition-content">
|
|
462
494
|
<div className="condition-content-box">
|
|
463
495
|
<Select
|
|
464
|
-
disabled={disable}
|
|
496
|
+
disabled={disable || readOnly}
|
|
465
497
|
value={condition.label}
|
|
466
498
|
options={descOption}
|
|
467
|
-
className=
|
|
499
|
+
className={`condition-content-box-item ${readOnly ? "readonly-select" : ""}`}
|
|
468
500
|
onChange={(e) => {
|
|
469
501
|
condition.label = e;
|
|
470
502
|
if (e === "时长") {
|
|
@@ -480,7 +512,7 @@ export const Branch = (props) => {
|
|
|
480
512
|
}}
|
|
481
513
|
></Select>
|
|
482
514
|
<Select
|
|
483
|
-
disabled={disable}
|
|
515
|
+
disabled={disable || readOnly}
|
|
484
516
|
options={conditionOption}
|
|
485
517
|
value={condition.field}
|
|
486
518
|
onChange={(e) => {
|
|
@@ -492,11 +524,11 @@ export const Branch = (props) => {
|
|
|
492
524
|
// 更新数据
|
|
493
525
|
setForm((f) => ({ ...f }));
|
|
494
526
|
}}
|
|
495
|
-
className=
|
|
527
|
+
className={`condition-content-box-item ${readOnly ? "readonly-select" : ""}`}
|
|
496
528
|
placeholder="条件字段"
|
|
497
529
|
/>
|
|
498
530
|
<Select
|
|
499
|
-
disabled={disable}
|
|
531
|
+
disabled={disable || readOnly}
|
|
500
532
|
value={condition.operator}
|
|
501
533
|
onChange={(val) => {
|
|
502
534
|
condition.operator = val;
|
|
@@ -505,9 +537,10 @@ export const Branch = (props) => {
|
|
|
505
537
|
}}
|
|
506
538
|
placeholder="请选择"
|
|
507
539
|
options={operatorOptions}
|
|
508
|
-
className=
|
|
540
|
+
className={`condition-content-box-item ${readOnly ? "readonly-select" : ""}`}
|
|
509
541
|
></Select>
|
|
510
542
|
<Field
|
|
543
|
+
readOnly={readOnly}
|
|
511
544
|
disabled={disable}
|
|
512
545
|
value={fieldValue}
|
|
513
546
|
type={condition.field}
|
|
@@ -530,17 +563,21 @@ export const Branch = (props) => {
|
|
|
530
563
|
})}
|
|
531
564
|
</div>
|
|
532
565
|
<div className="sub-content">
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
566
|
+
{readOnly ? null : (
|
|
567
|
+
<Button type="primary" onClick={() => onConditionAdd(conditionGroup)} disabled={disable}>
|
|
568
|
+
添加条件
|
|
569
|
+
</Button>
|
|
570
|
+
)}
|
|
536
571
|
</div>
|
|
537
572
|
</div>
|
|
538
573
|
</div>
|
|
539
574
|
);
|
|
540
575
|
})}
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
576
|
+
{readOnly ? null : (
|
|
577
|
+
<Button onClick={onConditionGroupAdd} disabled={disable}>
|
|
578
|
+
添加条件组
|
|
579
|
+
</Button>
|
|
580
|
+
)}
|
|
544
581
|
</Drawer>
|
|
545
582
|
</div>
|
|
546
583
|
);
|
|
@@ -9,7 +9,7 @@ import "./index.less";
|
|
|
9
9
|
|
|
10
10
|
export const Promoter = (props) => {
|
|
11
11
|
const selectorCtx = useContext(SelectContext);
|
|
12
|
-
const { modelValue: nodeConfig = {}, onChange, disable } = props;
|
|
12
|
+
const { modelValue: nodeConfig = {}, onChange, disable, readOnly } = props;
|
|
13
13
|
|
|
14
14
|
const [drawer, setDrawer] = useState(false);
|
|
15
15
|
const [isEditTitle, setIsEditTitle] = useState(false);
|
|
@@ -122,48 +122,55 @@ export const Promoter = (props) => {
|
|
|
122
122
|
) : (
|
|
123
123
|
<div className="drawer-title">
|
|
124
124
|
{form.nodeName || "发起人"}
|
|
125
|
-
|
|
125
|
+
{!disable && !readOnly && (
|
|
126
|
+
<EditOutlined className="node-wrap-drawer__title-edit" onClick={onEditTitle} />
|
|
127
|
+
)}
|
|
126
128
|
</div>
|
|
127
129
|
)}
|
|
128
130
|
</div>
|
|
129
131
|
}
|
|
130
132
|
footer={
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
133
|
+
readOnly ? null : (
|
|
134
|
+
<>
|
|
135
|
+
<Button type="primary" onClick={onDrawerSave}>
|
|
136
|
+
保存
|
|
137
|
+
</Button>
|
|
138
|
+
<Button onClick={onDrawerClose}>取消</Button>
|
|
139
|
+
</>
|
|
140
|
+
)
|
|
137
141
|
}
|
|
138
142
|
>
|
|
139
143
|
<Form label-position="top" initialValues={form}>
|
|
140
144
|
<Form.Item label="谁可以发起此审批">
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
145
|
+
{readOnly ? null : (
|
|
146
|
+
<Button
|
|
147
|
+
type="primary"
|
|
148
|
+
onClick={() =>
|
|
149
|
+
selectorCtx.setSelectHandler(
|
|
150
|
+
2,
|
|
151
|
+
form.nodeAssigneeList,
|
|
152
|
+
(selected) => {
|
|
153
|
+
setForm((f) => {
|
|
154
|
+
// 设置 人员、角色 列表数组
|
|
155
|
+
f.nodeAssigneeList = selected;
|
|
156
|
+
return { ...f };
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
1,
|
|
160
|
+
)
|
|
161
|
+
}
|
|
162
|
+
>
|
|
163
|
+
选择人员
|
|
164
|
+
</Button>
|
|
165
|
+
)}
|
|
166
|
+
|
|
160
167
|
<div className="tags-list">
|
|
161
168
|
{form.nodeAssigneeList?.map((it, idx) => {
|
|
162
169
|
return (
|
|
163
170
|
<Tag
|
|
164
171
|
key={idx}
|
|
165
172
|
className="node-assignee-item"
|
|
166
|
-
closable
|
|
173
|
+
closable={!readOnly}
|
|
167
174
|
onClose={(e) => {
|
|
168
175
|
e.preventDefault();
|
|
169
176
|
onRoleDel(idx);
|
|
@@ -10,7 +10,7 @@ import { SelectContext } from "../../../Selector/SelectContext";
|
|
|
10
10
|
import "./index.less";
|
|
11
11
|
|
|
12
12
|
export const Approver = (props) => {
|
|
13
|
-
const { modelValue = {}, onChange, disable } = props;
|
|
13
|
+
const { modelValue = {}, onChange, disable, readOnly } = props;
|
|
14
14
|
const [form, setForm] = useState({
|
|
15
15
|
nodeName: "",
|
|
16
16
|
setType: undefined,
|
|
@@ -122,7 +122,7 @@ export const Approver = (props) => {
|
|
|
122
122
|
<div className="title send-title">
|
|
123
123
|
<UserOutlined />
|
|
124
124
|
<span>{modelValue?.nodeName}</span>
|
|
125
|
-
{!disable && <DeleteOutlined className="node-close-btn" onClick={onNodeDel} />}
|
|
125
|
+
{!disable && !readOnly && <DeleteOutlined className="node-close-btn" onClick={onNodeDel} />}
|
|
126
126
|
</div>
|
|
127
127
|
<div className="content">
|
|
128
128
|
{toText(modelValue) ? <span>{toText(modelValue)}</span> : <span className="placeholder">请选择</span>}
|
|
@@ -154,7 +154,9 @@ export const Approver = (props) => {
|
|
|
154
154
|
) : (
|
|
155
155
|
<div className="drawer-title">
|
|
156
156
|
{form.nodeName || "审批人设置"}
|
|
157
|
-
{!disable &&
|
|
157
|
+
{!disable && !readOnly && (
|
|
158
|
+
<EditOutlined className="node-wrap-drawer__title-edit" onClick={onEditTitle} />
|
|
159
|
+
)}
|
|
158
160
|
</div>
|
|
159
161
|
)}
|
|
160
162
|
</div>
|
|
@@ -164,12 +166,14 @@ export const Approver = (props) => {
|
|
|
164
166
|
destroyOnClose
|
|
165
167
|
getContainer="body"
|
|
166
168
|
footer={
|
|
167
|
-
|
|
168
|
-
<
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
169
|
+
readOnly ? null : (
|
|
170
|
+
<div className="approver-drawer-footer">
|
|
171
|
+
<Button type="primary" onClick={onDrawerSave} disabled={disable}>
|
|
172
|
+
保存
|
|
173
|
+
</Button>
|
|
174
|
+
<Button onClick={onDrawerClose}>取消</Button>
|
|
175
|
+
</div>
|
|
176
|
+
)
|
|
173
177
|
}
|
|
174
178
|
>
|
|
175
179
|
<Form
|
|
@@ -183,6 +187,8 @@ export const Approver = (props) => {
|
|
|
183
187
|
>
|
|
184
188
|
<Form.Item label="审批人员类型" name="setType">
|
|
185
189
|
<Select
|
|
190
|
+
disabled={readOnly}
|
|
191
|
+
className={`${readOnly ? "readonly-select" : ""}`}
|
|
186
192
|
options={setTypeOptions}
|
|
187
193
|
value={form.setType}
|
|
188
194
|
onSelect={(val) => {
|
|
@@ -198,33 +204,36 @@ export const Approver = (props) => {
|
|
|
198
204
|
|
|
199
205
|
{form.setType === 1 ? (
|
|
200
206
|
<Form.Item label="选择成员" name="nodeAssigneeList">
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
207
|
+
{readOnly ? null : (
|
|
208
|
+
<Button
|
|
209
|
+
type="primary"
|
|
210
|
+
icon={<PlusOutlined />}
|
|
211
|
+
onClick={() =>
|
|
212
|
+
selectorCtx.setSelectHandler(
|
|
213
|
+
1,
|
|
214
|
+
form.nodeAssigneeList,
|
|
215
|
+
(selected) => {
|
|
216
|
+
setForm((f) => {
|
|
217
|
+
// 设置 人员、角色 列表数组
|
|
218
|
+
f.nodeAssigneeList = selected;
|
|
219
|
+
return { ...f };
|
|
220
|
+
});
|
|
221
|
+
},
|
|
222
|
+
2,
|
|
223
|
+
)
|
|
224
|
+
}
|
|
225
|
+
>
|
|
226
|
+
选择人员
|
|
227
|
+
</Button>
|
|
228
|
+
)}
|
|
229
|
+
|
|
221
230
|
<div className="tags-list">
|
|
222
231
|
{form.nodeAssigneeList?.map((user, idx) => {
|
|
223
232
|
return (
|
|
224
233
|
<Tag
|
|
225
234
|
key={user.id || idx}
|
|
226
235
|
className="node-assignee-item"
|
|
227
|
-
closable
|
|
236
|
+
closable={!readOnly}
|
|
228
237
|
onClose={() => {
|
|
229
238
|
onUserDel(idx);
|
|
230
239
|
}}
|
|
@@ -256,33 +265,36 @@ export const Approver = (props) => {
|
|
|
256
265
|
|
|
257
266
|
{form.setType === 3 ? (
|
|
258
267
|
<Form.Item label="选择角色" name="nodeAssigneeList">
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
268
|
+
{readOnly ? null : (
|
|
269
|
+
<Button
|
|
270
|
+
type="primary"
|
|
271
|
+
icon={<PlusOutlined />}
|
|
272
|
+
onClick={() =>
|
|
273
|
+
selectorCtx.setSelectHandler(
|
|
274
|
+
2,
|
|
275
|
+
form.nodeAssigneeList,
|
|
276
|
+
(selected) => {
|
|
277
|
+
setForm((f) => {
|
|
278
|
+
// 设置 人员、角色 列表数组
|
|
279
|
+
f.nodeAssigneeList = selected;
|
|
280
|
+
return { ...f };
|
|
281
|
+
});
|
|
282
|
+
},
|
|
283
|
+
2,
|
|
284
|
+
)
|
|
285
|
+
}
|
|
286
|
+
>
|
|
287
|
+
选择角色
|
|
288
|
+
</Button>
|
|
289
|
+
)}
|
|
290
|
+
|
|
279
291
|
<div className="tags-list">
|
|
280
292
|
{form.nodeAssigneeList?.map((it, idx) => {
|
|
281
293
|
return (
|
|
282
294
|
<Tag
|
|
283
295
|
key={it.id || idx}
|
|
284
296
|
className="node-assignee-item"
|
|
285
|
-
closable
|
|
297
|
+
closable={!readOnly}
|
|
286
298
|
onClose={() => {
|
|
287
299
|
onRoleDel(idx);
|
|
288
300
|
}}
|
package/src/index.less
CHANGED
|
@@ -3,40 +3,7 @@
|
|
|
3
3
|
/* 默认白色背景 */
|
|
4
4
|
width: 100%;
|
|
5
5
|
|
|
6
|
-
.designer-affix,
|
|
7
|
-
.designer-affix-isShowJson {
|
|
8
|
-
position: fixed;
|
|
9
|
-
right: 20px;
|
|
10
|
-
bottom: 20px;
|
|
11
|
-
z-index: 9;
|
|
12
|
-
// padding: 12px;
|
|
13
|
-
// border: 1px solid #999;
|
|
14
|
-
width: 132px;
|
|
15
|
-
height: 48px;
|
|
16
|
-
// background: url("./assets/img/control-bg.png") no-repeat;
|
|
17
|
-
background-size: 100% 100%;
|
|
18
|
-
display: flex;
|
|
19
|
-
justify-content: center;
|
|
20
|
-
align-items: center;
|
|
21
|
-
background-position-x: 100%;
|
|
22
|
-
background-position-y: 100%;
|
|
23
6
|
|
|
24
|
-
.action-btn+.action-btn {
|
|
25
|
-
margin-left: 12px;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
.action-img {
|
|
29
|
-
width: 28px;
|
|
30
|
-
height: 28px;
|
|
31
|
-
margin-right: 16px;
|
|
32
|
-
cursor: pointer;
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.action-img:last-child {
|
|
37
|
-
margin-right: 0px;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
7
|
|
|
41
8
|
.designer-affix-isShowJson {
|
|
42
9
|
width: 180px;
|
|
@@ -571,4 +538,43 @@
|
|
|
571
538
|
.ant-btn+.ant-btn {
|
|
572
539
|
margin-left: 12px;
|
|
573
540
|
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
.readonly-select.ant-select:not(.ant-select-customize-input) .ant-select-selector {
|
|
545
|
+
background: none;
|
|
546
|
+
color: rgba(0, 0, 0, .85);
|
|
547
|
+
cursor: default
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
.designer-affix,
|
|
551
|
+
.designer-affix-isShowJson {
|
|
552
|
+
position: fixed;
|
|
553
|
+
right: 20px;
|
|
554
|
+
bottom: 20px;
|
|
555
|
+
z-index: 9;
|
|
556
|
+
width: 180px;
|
|
557
|
+
height: 48px;
|
|
558
|
+
background-size: 100% 100%;
|
|
559
|
+
display: flex;
|
|
560
|
+
justify-content: center;
|
|
561
|
+
align-items: center;
|
|
562
|
+
background-position-x: 100%;
|
|
563
|
+
background-position-y: 100%;
|
|
564
|
+
|
|
565
|
+
.action-btn+.action-btn {
|
|
566
|
+
margin-left: 12px;
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
.action-img {
|
|
570
|
+
width: 28px;
|
|
571
|
+
height: 28px;
|
|
572
|
+
margin-right: 16px;
|
|
573
|
+
cursor: pointer;
|
|
574
|
+
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
.action-img:last-child {
|
|
578
|
+
margin-right: 0px;
|
|
579
|
+
}
|
|
574
580
|
}
|
package/src/index.tsx
CHANGED
|
@@ -12,7 +12,7 @@ import subImg from "./assets/img/sub.png";
|
|
|
12
12
|
import reloadImg from "./assets/img/reload.png";
|
|
13
13
|
import checkJsonImg from "./assets/img/check-json.png";
|
|
14
14
|
import controlBgImg from "./assets/img/control-bg.png";
|
|
15
|
-
|
|
15
|
+
import Draggable from "react-draggable";
|
|
16
16
|
/**
|
|
17
17
|
* 复制指定字符串
|
|
18
18
|
* @param str
|
|
@@ -49,7 +49,7 @@ function copy(str) {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
function FlowlongDesigner(props, ref) {
|
|
52
|
-
const { value, flowName, roleListConfig, listConfig, initiatorListConfig, isShowJson, disable } = props;
|
|
52
|
+
const { value, flowName, roleListConfig, listConfig, initiatorListConfig, isShowJson, disable, readOnly } = props;
|
|
53
53
|
const [drawer, setDrawer] = useState(false);
|
|
54
54
|
const [zoom, setZoom] = useState(1);
|
|
55
55
|
const [data, setData] = useState(Object.keys(value || {}).length > 0 ? value : getInitNodeData({ name: flowName }));
|
|
@@ -92,85 +92,90 @@ function FlowlongDesigner(props, ref) {
|
|
|
92
92
|
};
|
|
93
93
|
|
|
94
94
|
return (
|
|
95
|
-
|
|
96
|
-
<
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
<div
|
|
126
|
-
className={isShowJson ? "designer-affix-isShowJson" : "designer-affix"}
|
|
127
|
-
style={{
|
|
128
|
-
backgroundImage: `url(${controlBgImg})`,
|
|
129
|
-
}}
|
|
130
|
-
>
|
|
131
|
-
{isShowJson && (
|
|
132
|
-
<Tooltip title={"查看 JSON"}>
|
|
133
|
-
<img className="action-img" src={checkJsonImg} onClick={() => setDrawer(true)} alt="" />
|
|
134
|
-
</Tooltip>
|
|
135
|
-
)}
|
|
136
|
-
<Tooltip title={"缩小"}>
|
|
137
|
-
<img className="action-img" src={subImg} onClick={() => setZoom((z) => z - 0.1)} alt="" />
|
|
138
|
-
</Tooltip>
|
|
139
|
-
<Tooltip title={"放大"}>
|
|
140
|
-
<img className="action-img" src={addImg} onClick={() => setZoom((z) => z + 0.1)} alt="" />
|
|
141
|
-
</Tooltip>
|
|
142
|
-
<Tooltip title={"重置"}>
|
|
143
|
-
<img className="action-img" src={reloadImg} onClick={onReset} alt="" />
|
|
144
|
-
</Tooltip>
|
|
145
|
-
</div>
|
|
146
|
-
<div className="affix-container" style={{ transformOrigin: "0 0", transform: `scale(${zoom})` }}>
|
|
147
|
-
<ScWorkflow
|
|
148
|
-
className="workflow"
|
|
149
|
-
id="content-to-capture"
|
|
150
|
-
modelValue={data.nodeConfig}
|
|
151
|
-
disable={disable}
|
|
152
|
-
onChange={(val) => {
|
|
153
|
-
setData((d) => {
|
|
154
|
-
d.nodeConfig = val;
|
|
155
|
-
return { ...d };
|
|
156
|
-
});
|
|
95
|
+
<>
|
|
96
|
+
<Draggable>
|
|
97
|
+
<div className="flowlong-designer">
|
|
98
|
+
<SelectContext.Provider
|
|
99
|
+
value={{
|
|
100
|
+
selectHandler,
|
|
101
|
+
setSelectHandler(type, value, onSave, drawerType) {
|
|
102
|
+
setSelectHandler({
|
|
103
|
+
open: true,
|
|
104
|
+
type,
|
|
105
|
+
drawerType,
|
|
106
|
+
value,
|
|
107
|
+
onSave,
|
|
108
|
+
roleListConfig,
|
|
109
|
+
listConfig,
|
|
110
|
+
initiatorListConfig,
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
onClose() {
|
|
114
|
+
setSelectHandler({
|
|
115
|
+
open: false,
|
|
116
|
+
type: -1,
|
|
117
|
+
drawerType: -1,
|
|
118
|
+
value: [],
|
|
119
|
+
onSave: (s) => {},
|
|
120
|
+
roleListConfig,
|
|
121
|
+
listConfig,
|
|
122
|
+
initiatorListConfig,
|
|
123
|
+
});
|
|
124
|
+
},
|
|
157
125
|
}}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
126
|
+
>
|
|
127
|
+
<div className="affix-container" style={{ transformOrigin: "0 0", transform: `scale(${zoom})` }}>
|
|
128
|
+
<ScWorkflow
|
|
129
|
+
className="workflow"
|
|
130
|
+
id="content-to-capture"
|
|
131
|
+
modelValue={data.nodeConfig}
|
|
132
|
+
disable={disable}
|
|
133
|
+
readOnly={readOnly}
|
|
134
|
+
onChange={(val) => {
|
|
135
|
+
setData((d) => {
|
|
136
|
+
d.nodeConfig = val;
|
|
137
|
+
return { ...d };
|
|
138
|
+
});
|
|
139
|
+
}}
|
|
140
|
+
/>
|
|
141
|
+
<Drawer className="drawer-wrapper" open={drawer} width={720} onClose={onDrawerClose}>
|
|
142
|
+
<div>
|
|
143
|
+
<div className="cp-parse-json-btn" onClick={copyParseJson}>
|
|
144
|
+
复制格式化后的 JSON
|
|
145
|
+
</div>
|
|
146
|
+
<div className="cp-json-btn" onClick={copyJson}>
|
|
147
|
+
复制压缩后的 JSON
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
{/* <json-editor-vue className="editor" language="zh-CN" current-mode="view" v-model="data" /> */}
|
|
151
|
+
<pre className="json-viewer">{JSON.stringify(data, null, 2)}</pre>
|
|
152
|
+
</Drawer>
|
|
167
153
|
</div>
|
|
168
|
-
|
|
169
|
-
<pre className="json-viewer">{JSON.stringify(data, null, 2)}</pre>
|
|
170
|
-
</Drawer>
|
|
154
|
+
</SelectContext.Provider>
|
|
171
155
|
</div>
|
|
172
|
-
</
|
|
173
|
-
|
|
156
|
+
</Draggable>
|
|
157
|
+
<div
|
|
158
|
+
className={isShowJson ? "designer-affix-isShowJson" : "designer-affix"}
|
|
159
|
+
style={{
|
|
160
|
+
backgroundImage: `url(${controlBgImg})`,
|
|
161
|
+
}}
|
|
162
|
+
>
|
|
163
|
+
{isShowJson && (
|
|
164
|
+
<Tooltip title={"查看 JSON"}>
|
|
165
|
+
<img className="action-img" src={checkJsonImg} onClick={() => setDrawer(true)} alt="" />
|
|
166
|
+
</Tooltip>
|
|
167
|
+
)}
|
|
168
|
+
<Tooltip title={"缩小"}>
|
|
169
|
+
<img className="action-img" src={subImg} onClick={() => setZoom((z) => z - 0.1)} alt="" />
|
|
170
|
+
</Tooltip>
|
|
171
|
+
<Tooltip title={"放大"}>
|
|
172
|
+
<img className="action-img" src={addImg} onClick={() => setZoom((z) => z + 0.1)} alt="" />
|
|
173
|
+
</Tooltip>
|
|
174
|
+
<Tooltip title={"重置"}>
|
|
175
|
+
<img className="action-img" src={reloadImg} onClick={onReset} alt="" />
|
|
176
|
+
</Tooltip>
|
|
177
|
+
</div>
|
|
178
|
+
</>
|
|
174
179
|
);
|
|
175
180
|
}
|
|
176
181
|
|