@hzab/flowlong-designer 0.0.2 → 0.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/package.json +1 -1
- package/src/components/NodeWrap/Nodes/Approver/index.tsx +32 -20
- package/src/components/NodeWrap/Nodes/Approver/options.ts +5 -4
- package/src/components/NodeWrap/Nodes/Send/index.less +3 -0
- package/src/components/NodeWrap/Nodes/Send/index.tsx +152 -124
- package/src/components/NodeWrap/Nodes/Send/options.ts +5 -4
- package/src/components/Selector/index.tsx +9 -196
- package/src/index.tsx +14 -15
package/package.json
CHANGED
|
@@ -51,7 +51,7 @@ export const Approver = (props) => {
|
|
|
51
51
|
return false;
|
|
52
52
|
}
|
|
53
53
|
} else if (nodeConf.setType == 2) {
|
|
54
|
-
return nodeConf.examineLevel == 1 ? "
|
|
54
|
+
return nodeConf.examineLevel == 1 ? "直接部门经理" : `发起人的第${nodeConf.examineLevel}级部门经理`;
|
|
55
55
|
} else if (nodeConf.setType == 3) {
|
|
56
56
|
if (nodeConf.nodeAssigneeList && nodeConf.nodeAssigneeList.length > 0) {
|
|
57
57
|
const roles = nodeConf.nodeAssigneeList.map((item) => item.name).join("、");
|
|
@@ -65,6 +65,8 @@ export const Approver = (props) => {
|
|
|
65
65
|
return "发起人自己";
|
|
66
66
|
} else if (nodeConf.setType == 7) {
|
|
67
67
|
return "连续多级主管";
|
|
68
|
+
} else if (nodeConf.setType == 9) {
|
|
69
|
+
return "驻点队长";
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
|
|
@@ -193,13 +195,18 @@ export const Approver = (props) => {
|
|
|
193
195
|
type="primary"
|
|
194
196
|
icon={<PlusOutlined />}
|
|
195
197
|
onClick={() =>
|
|
196
|
-
selectorCtx.setSelectHandler(
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
198
|
+
selectorCtx.setSelectHandler(
|
|
199
|
+
1,
|
|
200
|
+
form.nodeAssigneeList,
|
|
201
|
+
(selected) => {
|
|
202
|
+
setForm((f) => {
|
|
203
|
+
// 设置 人员、角色 列表数组
|
|
204
|
+
f.nodeAssigneeList = selected;
|
|
205
|
+
return { ...f };
|
|
206
|
+
});
|
|
207
|
+
},
|
|
208
|
+
2,
|
|
209
|
+
)
|
|
203
210
|
}
|
|
204
211
|
>
|
|
205
212
|
选择人员
|
|
@@ -223,7 +230,7 @@ export const Approver = (props) => {
|
|
|
223
230
|
</Form.Item>
|
|
224
231
|
) : null}
|
|
225
232
|
|
|
226
|
-
{form.setType === 2 ? (
|
|
233
|
+
{/* {form.setType === 2 ? (
|
|
227
234
|
<Form.Item label="指定主管" name="aaa">
|
|
228
235
|
发起人的第
|
|
229
236
|
<InputNumber
|
|
@@ -238,7 +245,7 @@ export const Approver = (props) => {
|
|
|
238
245
|
/>
|
|
239
246
|
级主管
|
|
240
247
|
</Form.Item>
|
|
241
|
-
) : null}
|
|
248
|
+
) : null} */}
|
|
242
249
|
|
|
243
250
|
{form.setType === 3 ? (
|
|
244
251
|
<Form.Item label="选择角色" name="nodeAssigneeList">
|
|
@@ -246,13 +253,18 @@ export const Approver = (props) => {
|
|
|
246
253
|
type="primary"
|
|
247
254
|
icon={<PlusOutlined />}
|
|
248
255
|
onClick={() =>
|
|
249
|
-
selectorCtx.setSelectHandler(
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
+
selectorCtx.setSelectHandler(
|
|
257
|
+
2,
|
|
258
|
+
form.nodeAssigneeList,
|
|
259
|
+
(selected) => {
|
|
260
|
+
setForm((f) => {
|
|
261
|
+
// 设置 人员、角色 列表数组
|
|
262
|
+
f.nodeAssigneeList = selected;
|
|
263
|
+
return { ...f };
|
|
264
|
+
});
|
|
265
|
+
},
|
|
266
|
+
2,
|
|
267
|
+
)
|
|
256
268
|
}
|
|
257
269
|
>
|
|
258
270
|
选择角色
|
|
@@ -276,7 +288,7 @@ export const Approver = (props) => {
|
|
|
276
288
|
</Form.Item>
|
|
277
289
|
) : null}
|
|
278
290
|
|
|
279
|
-
{form.setType === 4 ? (
|
|
291
|
+
{/* {form.setType === 4 ? (
|
|
280
292
|
<Form.Item label="指定主管" name="selectMode">
|
|
281
293
|
<Radio.Group
|
|
282
294
|
options={selectModeOptions}
|
|
@@ -318,7 +330,7 @@ export const Approver = (props) => {
|
|
|
318
330
|
});
|
|
319
331
|
}}
|
|
320
332
|
/>{" "}
|
|
321
|
-
|
|
333
|
+
级主管级主管
|
|
322
334
|
</Form.Item>
|
|
323
335
|
) : null}
|
|
324
336
|
|
|
@@ -374,7 +386,7 @@ export const Approver = (props) => {
|
|
|
374
386
|
});
|
|
375
387
|
}}
|
|
376
388
|
/>
|
|
377
|
-
</Form.Item>
|
|
389
|
+
</Form.Item> */}
|
|
378
390
|
</Form>
|
|
379
391
|
</Drawer>
|
|
380
392
|
</div>
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const setTypeOptions = [
|
|
5
5
|
{ label: "指定成员", value: 1 },
|
|
6
|
-
{ label: "
|
|
6
|
+
{ label: "部门经理", value: 2 },
|
|
7
7
|
{ label: "角色", value: 3 },
|
|
8
|
-
{ label: "发起人自选", value: 4 },
|
|
9
|
-
{ label: "发起人自己", value: 5 },
|
|
10
|
-
{ label: "连续多级主管", value: 7 },
|
|
8
|
+
// { label: "发起人自选", value: 4 },
|
|
9
|
+
// { label: "发起人自己", value: 5 },
|
|
10
|
+
// { label: "连续多级主管", value: 7 },
|
|
11
|
+
{ label: "驻点队长", value: 9 },
|
|
11
12
|
];
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
import { useRef, useState, useContext } from "react";
|
|
2
|
-
import { Drawer,
|
|
3
|
-
import {
|
|
2
|
+
import { Drawer, Input, Button, Form, Select, Tag, InputNumber, Radio, Checkbox, Switch } from "antd";
|
|
3
|
+
import { UserOutlined, DeleteOutlined, EditOutlined, PlusOutlined } from "@ant-design/icons";
|
|
4
4
|
|
|
5
5
|
import AddNode from "../AddNode";
|
|
6
|
-
import { SelectContext } from "../../../Selector/SelectContext";
|
|
7
6
|
import { setTypeOptions, selectModeOptions, directorModeOptions, termModeOptions, examineModeOptions } from "./options";
|
|
8
7
|
|
|
9
|
-
import "
|
|
10
|
-
|
|
11
|
-
export const Send = (props) => {
|
|
12
|
-
const selectorCtx = useContext(SelectContext);
|
|
13
|
-
const { modelValue: nodeConfig = {}, onChange } = props;
|
|
8
|
+
import { SelectContext } from "../../../Selector/SelectContext";
|
|
14
9
|
|
|
15
|
-
|
|
16
|
-
const [isEditTitle, setIsEditTitle] = useState(false);
|
|
10
|
+
import "./index.less";
|
|
17
11
|
|
|
12
|
+
export const Approver = (props) => {
|
|
13
|
+
const { modelValue = {}, onChange } = props;
|
|
18
14
|
const [form, setForm] = useState({
|
|
19
15
|
nodeName: "",
|
|
20
16
|
setType: undefined,
|
|
@@ -27,29 +23,55 @@ export const Send = (props) => {
|
|
|
27
23
|
term: undefined,
|
|
28
24
|
termMode: undefined,
|
|
29
25
|
examineMode: undefined,
|
|
30
|
-
conditionList: [],
|
|
31
|
-
userSelectFlag: undefined,
|
|
32
26
|
});
|
|
27
|
+
const [drawer, setDrawer] = useState(false);
|
|
28
|
+
const [isEditTitle, setIsEditTitle] = useState(false);
|
|
29
|
+
|
|
30
|
+
const selectorCtx = useContext(SelectContext);
|
|
33
31
|
|
|
32
|
+
const formRef = useRef();
|
|
34
33
|
const nodeTitleRef = useRef();
|
|
35
34
|
|
|
36
35
|
function onShow() {
|
|
37
|
-
setForm(JSON.parse(JSON.stringify(nodeConfig)));
|
|
38
|
-
setIsEditTitle(false);
|
|
39
36
|
setDrawer(true);
|
|
37
|
+
setForm(JSON.parse(JSON.stringify(modelValue)));
|
|
40
38
|
}
|
|
41
39
|
|
|
42
|
-
function
|
|
43
|
-
|
|
40
|
+
function onNodeDel(e) {
|
|
41
|
+
e.stopPropagation();
|
|
42
|
+
onChange && onChange(modelValue.childNode);
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
function
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
function toText(nodeConf) {
|
|
46
|
+
if (nodeConf.setType == 1) {
|
|
47
|
+
if (nodeConf.nodeAssigneeList && nodeConf.nodeAssigneeList.length > 0) {
|
|
48
|
+
const users = nodeConf.nodeAssigneeList.map((item) => item.name).join("、");
|
|
49
|
+
return users;
|
|
50
|
+
} else {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
} else if (nodeConf.setType == 2) {
|
|
54
|
+
return nodeConf.examineLevel == 1 || !nodeConf.examineLevel
|
|
55
|
+
? "直接部门经理"
|
|
56
|
+
: `发起人的第${nodeConf.examineLevel}级部门经理`;
|
|
57
|
+
} else if (nodeConf.setType == 3) {
|
|
58
|
+
if (nodeConf.nodeAssigneeList && nodeConf.nodeAssigneeList.length > 0) {
|
|
59
|
+
const roles = nodeConf.nodeAssigneeList.map((item) => item.name).join("、");
|
|
60
|
+
return "角色-" + roles;
|
|
61
|
+
} else {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
} else if (nodeConf.setType == 4) {
|
|
65
|
+
return "发起人自选";
|
|
66
|
+
} else if (nodeConf.setType == 5) {
|
|
67
|
+
return "发起人自己";
|
|
68
|
+
} else if (nodeConf.setType == 7) {
|
|
69
|
+
return "连续多级主管";
|
|
70
|
+
} else if (nodeConf.setType == 9) {
|
|
71
|
+
return "驻点队长";
|
|
51
72
|
}
|
|
52
73
|
}
|
|
74
|
+
|
|
53
75
|
function onSaveTitle(e) {
|
|
54
76
|
setForm((f) => {
|
|
55
77
|
// @ts-ignore
|
|
@@ -58,33 +80,22 @@ export const Send = (props) => {
|
|
|
58
80
|
});
|
|
59
81
|
setIsEditTitle(false);
|
|
60
82
|
}
|
|
83
|
+
function onEditTitle() {
|
|
84
|
+
setIsEditTitle(true);
|
|
85
|
+
if (nodeTitleRef.current) {
|
|
86
|
+
// @ts-ignore
|
|
87
|
+
nodeTitleRef.current?.focus();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
61
90
|
|
|
62
91
|
function onDrawerSave() {
|
|
63
|
-
//
|
|
64
|
-
onChange && onChange(
|
|
92
|
+
// 强制更新数据
|
|
93
|
+
onChange && onChange(form);
|
|
65
94
|
onDrawerClose();
|
|
66
95
|
}
|
|
67
96
|
|
|
68
|
-
function
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function toText(nodeConfig) {
|
|
73
|
-
if (nodeConfig.nodeAssigneeList && nodeConfig.nodeAssigneeList.length > 0) {
|
|
74
|
-
const users = nodeConfig.nodeAssigneeList.map((item) => item.name).join("、");
|
|
75
|
-
return users;
|
|
76
|
-
} else {
|
|
77
|
-
if (nodeConfig.userSelectFlag) {
|
|
78
|
-
return "发起人自选";
|
|
79
|
-
} else {
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function delUser(index) {
|
|
86
|
-
form.nodeAssigneeList.splice(index, 1);
|
|
87
|
-
setForm((f) => ({ ...f }));
|
|
97
|
+
function onDrawerClose() {
|
|
98
|
+
setDrawer(false);
|
|
88
99
|
}
|
|
89
100
|
|
|
90
101
|
function onUserDel(idx) {
|
|
@@ -101,40 +112,30 @@ export const Send = (props) => {
|
|
|
101
112
|
});
|
|
102
113
|
}
|
|
103
114
|
|
|
104
|
-
|
|
105
115
|
return (
|
|
106
|
-
<div className="
|
|
116
|
+
<div className="approver-wrap">
|
|
107
117
|
<div className="node-wrap">
|
|
108
118
|
<div className="node-wrap-box" onClick={onShow}>
|
|
109
|
-
<div className="title">
|
|
110
|
-
<
|
|
111
|
-
<span>{
|
|
112
|
-
<DeleteOutlined
|
|
113
|
-
className="close"
|
|
114
|
-
onClick={(e) => {
|
|
115
|
-
e.stopPropagation();
|
|
116
|
-
delNode();
|
|
117
|
-
}}
|
|
118
|
-
/>
|
|
119
|
+
<div className="title send-title">
|
|
120
|
+
<UserOutlined />
|
|
121
|
+
<span>{modelValue?.nodeName}</span>
|
|
122
|
+
<DeleteOutlined className="node-close-btn" onClick={onNodeDel} />
|
|
119
123
|
</div>
|
|
120
124
|
<div className="content">
|
|
121
|
-
{toText(
|
|
125
|
+
{toText(modelValue) ? <span>{toText(modelValue)}</span> : <span className="placeholder">请选择</span>}
|
|
122
126
|
</div>
|
|
123
127
|
</div>
|
|
128
|
+
|
|
124
129
|
<AddNode
|
|
125
|
-
modelValue={
|
|
130
|
+
modelValue={modelValue?.childNode}
|
|
126
131
|
onChange={(val) => {
|
|
127
|
-
|
|
128
|
-
|
|
132
|
+
modelValue.childNode = val;
|
|
133
|
+
// 强制更新数据
|
|
134
|
+
onChange && onChange({ ...modelValue });
|
|
129
135
|
}}
|
|
130
136
|
></AddNode>
|
|
131
137
|
|
|
132
138
|
<Drawer
|
|
133
|
-
v-model="drawer"
|
|
134
|
-
open={drawer}
|
|
135
|
-
onClose={onDrawerClose}
|
|
136
|
-
destroyOnClose
|
|
137
|
-
getContainer="body"
|
|
138
139
|
width={600}
|
|
139
140
|
title={
|
|
140
141
|
<div className="node-wrap-drawer-title">
|
|
@@ -148,23 +149,34 @@ export const Send = (props) => {
|
|
|
148
149
|
/>
|
|
149
150
|
) : (
|
|
150
151
|
<div className="drawer-title">
|
|
151
|
-
{form.nodeName || "
|
|
152
|
+
{form.nodeName || "审批人设置"}
|
|
152
153
|
<EditOutlined className="node-wrap-drawer__title-edit" onClick={onEditTitle} />
|
|
153
154
|
</div>
|
|
154
155
|
)}
|
|
155
156
|
</div>
|
|
156
157
|
}
|
|
158
|
+
open={drawer}
|
|
159
|
+
onClose={onDrawerClose}
|
|
160
|
+
destroyOnClose
|
|
161
|
+
getContainer="body"
|
|
157
162
|
footer={
|
|
158
|
-
|
|
163
|
+
<div className="approver-drawer-footer">
|
|
159
164
|
<Button type="primary" onClick={onDrawerSave}>
|
|
160
165
|
保存
|
|
161
166
|
</Button>
|
|
162
167
|
<Button onClick={onDrawerClose}>取消</Button>
|
|
163
|
-
|
|
168
|
+
</div>
|
|
164
169
|
}
|
|
165
170
|
>
|
|
166
|
-
<Form
|
|
167
|
-
|
|
171
|
+
<Form
|
|
172
|
+
ref={formRef}
|
|
173
|
+
name="approverForm"
|
|
174
|
+
labelCol={{ span: 8 }}
|
|
175
|
+
wrapperCol={{ span: 16 }}
|
|
176
|
+
initialValues={form}
|
|
177
|
+
autoComplete="off"
|
|
178
|
+
>
|
|
179
|
+
<Form.Item label="审批人员类型" name="setType">
|
|
168
180
|
<Select
|
|
169
181
|
options={setTypeOptions}
|
|
170
182
|
value={form.setType}
|
|
@@ -189,14 +201,14 @@ export const Send = (props) => {
|
|
|
189
201
|
1,
|
|
190
202
|
form.nodeAssigneeList,
|
|
191
203
|
(selected) => {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
204
|
+
setForm((f) => {
|
|
205
|
+
// 设置 人员、角色 列表数组
|
|
206
|
+
f.nodeAssigneeList = selected;
|
|
207
|
+
return { ...f };
|
|
208
|
+
});
|
|
209
|
+
},
|
|
210
|
+
2,
|
|
211
|
+
)
|
|
200
212
|
}
|
|
201
213
|
>
|
|
202
214
|
选择人员
|
|
@@ -220,7 +232,7 @@ export const Send = (props) => {
|
|
|
220
232
|
</Form.Item>
|
|
221
233
|
) : null}
|
|
222
234
|
|
|
223
|
-
{form.setType === 2 ? (
|
|
235
|
+
{/* {form.setType === 2 ? (
|
|
224
236
|
<Form.Item label="指定主管" name="aaa">
|
|
225
237
|
发起人的第
|
|
226
238
|
<InputNumber
|
|
@@ -235,7 +247,7 @@ export const Send = (props) => {
|
|
|
235
247
|
/>
|
|
236
248
|
级主管
|
|
237
249
|
</Form.Item>
|
|
238
|
-
) : null}
|
|
250
|
+
) : null} */}
|
|
239
251
|
|
|
240
252
|
{form.setType === 3 ? (
|
|
241
253
|
<Form.Item label="选择角色" name="nodeAssigneeList">
|
|
@@ -243,13 +255,18 @@ export const Send = (props) => {
|
|
|
243
255
|
type="primary"
|
|
244
256
|
icon={<PlusOutlined />}
|
|
245
257
|
onClick={() =>
|
|
246
|
-
selectorCtx.setSelectHandler(
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
258
|
+
selectorCtx.setSelectHandler(
|
|
259
|
+
2,
|
|
260
|
+
form.nodeAssigneeList,
|
|
261
|
+
(selected) => {
|
|
262
|
+
setForm((f) => {
|
|
263
|
+
// 设置 人员、角色 列表数组
|
|
264
|
+
f.nodeAssigneeList = selected;
|
|
265
|
+
return { ...f };
|
|
266
|
+
});
|
|
267
|
+
},
|
|
268
|
+
2,
|
|
269
|
+
)
|
|
253
270
|
}
|
|
254
271
|
>
|
|
255
272
|
选择角色
|
|
@@ -273,7 +290,7 @@ export const Send = (props) => {
|
|
|
273
290
|
</Form.Item>
|
|
274
291
|
) : null}
|
|
275
292
|
|
|
276
|
-
{form.setType === 4 ? (
|
|
293
|
+
{/* {form.setType === 4 ? (
|
|
277
294
|
<Form.Item label="指定主管" name="selectMode">
|
|
278
295
|
<Radio.Group
|
|
279
296
|
options={selectModeOptions}
|
|
@@ -315,51 +332,62 @@ export const Send = (props) => {
|
|
|
315
332
|
});
|
|
316
333
|
}}
|
|
317
334
|
/>{" "}
|
|
318
|
-
|
|
335
|
+
级主管级主管
|
|
319
336
|
</Form.Item>
|
|
320
337
|
) : null}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
type="primary"
|
|
324
|
-
onClick={() => {
|
|
325
|
-
selectorCtx.setSelectHandler(1, form.nodeAssigneeList, (selected) => {
|
|
326
|
-
setForm((f) => {
|
|
327
|
-
// 设置 人员、角色 列表数组
|
|
328
|
-
f.nodeAssigneeList = selected;
|
|
329
|
-
return { ...f };
|
|
330
|
-
});
|
|
331
|
-
});
|
|
332
|
-
}}
|
|
333
|
-
>
|
|
334
|
-
选择人员
|
|
335
|
-
</Button>
|
|
336
|
-
<div className="tags-list">
|
|
337
|
-
{form.nodeAssigneeList?.map((it, idx) => {
|
|
338
|
-
return (
|
|
339
|
-
<Tag
|
|
340
|
-
key={it.id ?? idx}
|
|
341
|
-
className="node-assignee-item"
|
|
342
|
-
closable
|
|
343
|
-
onClose={() => {
|
|
344
|
-
delUser(idx);
|
|
345
|
-
}}
|
|
346
|
-
>
|
|
347
|
-
{it.name}
|
|
348
|
-
</Tag>
|
|
349
|
-
);
|
|
350
|
-
})}
|
|
351
|
-
</div>
|
|
352
|
-
</Form.Item>
|
|
353
|
-
<Form.Item label="允许发起人自选抄送人">
|
|
338
|
+
|
|
339
|
+
<Form.Item label="超时自动审批" name="termAuto">
|
|
354
340
|
<Switch
|
|
355
|
-
checked={form.
|
|
341
|
+
checked={form.termAuto}
|
|
356
342
|
onChange={(val) => {
|
|
357
343
|
setForm((f) => {
|
|
358
|
-
form.
|
|
344
|
+
form.termAuto = val;
|
|
359
345
|
return { ...f };
|
|
360
346
|
});
|
|
361
347
|
}}
|
|
362
348
|
></Switch>
|
|
349
|
+
</Form.Item>
|
|
350
|
+
|
|
351
|
+
{form.termAuto ? (
|
|
352
|
+
<>
|
|
353
|
+
<Form.Item label="审批期限(为 0 则不生效)" name="term">
|
|
354
|
+
<InputNumber
|
|
355
|
+
min={0}
|
|
356
|
+
value={form.term}
|
|
357
|
+
onChange={(val) => {
|
|
358
|
+
setForm((f) => {
|
|
359
|
+
form.term = val;
|
|
360
|
+
return { ...f };
|
|
361
|
+
});
|
|
362
|
+
}}
|
|
363
|
+
/>
|
|
364
|
+
</Form.Item>
|
|
365
|
+
<Form.Item label="审批期限超时后执行" name="termMode">
|
|
366
|
+
<Radio.Group
|
|
367
|
+
options={termModeOptions}
|
|
368
|
+
value={form.termMode}
|
|
369
|
+
onChange={(e) => {
|
|
370
|
+
setForm((f) => {
|
|
371
|
+
form.termMode = e.target.value;
|
|
372
|
+
return { ...f };
|
|
373
|
+
});
|
|
374
|
+
}}
|
|
375
|
+
/>
|
|
376
|
+
</Form.Item>
|
|
377
|
+
</>
|
|
378
|
+
) : null}
|
|
379
|
+
|
|
380
|
+
<Form.Item label="多人审批时审批方式" name="examineMode">
|
|
381
|
+
<Radio.Group
|
|
382
|
+
options={examineModeOptions}
|
|
383
|
+
value={form.examineMode}
|
|
384
|
+
onChange={(e) => {
|
|
385
|
+
setForm((f) => {
|
|
386
|
+
form.examineMode = e.target.value;
|
|
387
|
+
return { ...f };
|
|
388
|
+
});
|
|
389
|
+
}}
|
|
390
|
+
/>
|
|
363
391
|
</Form.Item> */}
|
|
364
392
|
</Form>
|
|
365
393
|
</Drawer>
|
|
@@ -368,4 +396,4 @@ export const Send = (props) => {
|
|
|
368
396
|
);
|
|
369
397
|
};
|
|
370
398
|
|
|
371
|
-
export default
|
|
399
|
+
export default Approver;
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const setTypeOptions = [
|
|
5
5
|
{ label: "指定成员", value: 1 },
|
|
6
|
-
{ label: "
|
|
6
|
+
{ label: "部门经理", value: 2 },
|
|
7
7
|
{ label: "角色", value: 3 },
|
|
8
|
-
{ label: "发起人自选", value: 4 },
|
|
9
|
-
{ label: "发起人自己", value: 5 },
|
|
10
|
-
{ label: "连续多级主管", value: 7 },
|
|
8
|
+
// { label: "发起人自选", value: 4 },
|
|
9
|
+
// { label: "发起人自己", value: 5 },
|
|
10
|
+
// { label: "连续多级主管", value: 7 },
|
|
11
|
+
{ label: "驻点队长", value: 9 },
|
|
11
12
|
];
|
|
12
13
|
|
|
13
14
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useRef, useState, useContext, useEffect } from "react";
|
|
2
2
|
import { Modal, Input, Button, Tree, Checkbox, Pagination, Avatar } from "antd";
|
|
3
3
|
import { RightOutlined, DeleteOutlined } from "@ant-design/icons";
|
|
4
|
-
import GroupUserSelector from
|
|
4
|
+
import GroupUserSelector from "@hzab/group-user-selector";
|
|
5
5
|
import { SelectContext } from "./SelectContext";
|
|
6
6
|
|
|
7
7
|
import "./index.less";
|
|
@@ -11,166 +11,27 @@ const titleMap = ["人员选择", "角色选择"];
|
|
|
11
11
|
|
|
12
12
|
export const Selector = (props) => {
|
|
13
13
|
const selectorCtx = useContext(SelectContext);
|
|
14
|
-
const { open, type, value, onSave, roleListConfig, listConfig, initiatorListConfig, drawerType } =
|
|
15
|
-
|
|
16
|
-
// {
|
|
17
|
-
// title: "Group-111",
|
|
18
|
-
// key: "g-111",
|
|
19
|
-
// },
|
|
20
|
-
// {
|
|
21
|
-
// title: "Group-222",
|
|
22
|
-
// key: "g-222",
|
|
23
|
-
// },
|
|
24
|
-
// {
|
|
25
|
-
// title: "Group-333",
|
|
26
|
-
// key: "g-333",
|
|
27
|
-
// },
|
|
28
|
-
// ]);
|
|
29
|
-
// const [options, setOptions] = useState([
|
|
14
|
+
const { open, type, value, onSave, roleListConfig, listConfig, initiatorListConfig, drawerType } =
|
|
15
|
+
selectorCtx.selectHandler;
|
|
30
16
|
|
|
31
|
-
// ]);
|
|
32
|
-
|
|
33
|
-
// const [roleOptions, setRoleOptions] = useState([
|
|
34
|
-
// {
|
|
35
|
-
// title: "Role-111",
|
|
36
|
-
// key: "r-111",
|
|
37
|
-
// },
|
|
38
|
-
// {
|
|
39
|
-
// title: "Role-222",
|
|
40
|
-
// key: "r-222",
|
|
41
|
-
// },
|
|
42
|
-
// {
|
|
43
|
-
// title: "Role-333",
|
|
44
|
-
// key: "r-333",
|
|
45
|
-
// },
|
|
46
|
-
// ]);
|
|
47
|
-
// const [selected, setSelected] = useState(Array.isArray(value) ? value?.map((it) => it.id || it.key) : []);
|
|
48
|
-
// const selectedRef = useRef(
|
|
49
|
-
// Array.isArray(value)
|
|
50
|
-
// ? value?.map((it) => ({
|
|
51
|
-
// ...it,
|
|
52
|
-
// title: it.name,
|
|
53
|
-
// key: it.id,
|
|
54
|
-
// }))
|
|
55
|
-
// : [],
|
|
56
|
-
// );
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
// const handleGetTree = () => {
|
|
60
|
-
// // treeModel?.get()
|
|
61
|
-
// // .then((res) => {
|
|
62
|
-
// // setGroupOptions(res);
|
|
63
|
-
// // })
|
|
64
|
-
// };
|
|
65
|
-
|
|
66
|
-
// const handleGetList = (data?: any) => {
|
|
67
|
-
// // (type == 2 ? roleListModel :listModel)?.get(data || {})
|
|
68
|
-
// // .then((res) => {
|
|
69
|
-
// // setOptions(roleOptions);
|
|
70
|
-
// // })
|
|
71
|
-
// };
|
|
72
|
-
|
|
73
|
-
// useEffect(() => {
|
|
74
|
-
// if (type == 2) {
|
|
75
|
-
// handleGetList();
|
|
76
|
-
// } else if (type == 1) {
|
|
77
|
-
// handleGetTree();
|
|
78
|
-
// }
|
|
79
|
-
// }, [type]);
|
|
80
|
-
|
|
81
|
-
// useEffect(() => {
|
|
82
|
-
|
|
83
|
-
// setSelected(Array.isArray(value) ? value?.map((it) => it.id || it.key) : []);
|
|
84
|
-
// selectedRef.current = Array.isArray(value)
|
|
85
|
-
// ? value?.map((it) => ({
|
|
86
|
-
// ...it,
|
|
87
|
-
// title: it.name,
|
|
88
|
-
// key: it.id,
|
|
89
|
-
// }))
|
|
90
|
-
// : [];
|
|
91
|
-
// }, [value]);
|
|
92
|
-
|
|
93
|
-
// const pageRef = useRef(1);
|
|
94
|
-
// const keywordRef = useRef("");
|
|
95
|
-
const keyIdRef = useRef(undefined);
|
|
96
|
-
const groupTreeRef = useRef();
|
|
97
17
|
const selectorRef = useRef(undefined);
|
|
98
18
|
|
|
99
19
|
function onModalSave() {
|
|
100
|
-
console.log(selectorRef.current?.selectedList);
|
|
101
|
-
|
|
102
20
|
onSave && onSave(selectorRef.current?.selectedList || []);
|
|
103
21
|
onModalClose();
|
|
104
22
|
}
|
|
105
23
|
|
|
106
24
|
function onModalClose() {
|
|
107
|
-
// setSelected([]);
|
|
108
|
-
// selectedRef.current = [];
|
|
109
25
|
selectorCtx.onClose();
|
|
110
26
|
}
|
|
111
27
|
|
|
112
|
-
// function onSearch(value, event) {
|
|
113
|
-
// // keywordRef.current = value;
|
|
114
|
-
// handleGetList({orgId:keyIdRef.current, name:value});
|
|
115
|
-
|
|
116
|
-
// }
|
|
117
|
-
|
|
118
|
-
// function groupClick(value, node) {
|
|
119
|
-
// handleGetList({orgId:value});
|
|
120
|
-
// keyIdRef.current = value;
|
|
121
|
-
|
|
122
|
-
// // keywordRef.current = "";
|
|
123
|
-
// // pageRef.current = 1;
|
|
124
|
-
// // getUserOptions(value);
|
|
125
|
-
// }
|
|
126
|
-
|
|
127
|
-
// function getUserOptions(id) {
|
|
128
|
-
// // TODO: 请求并设置用户列表
|
|
129
|
-
// setTimeout(() => {
|
|
130
|
-
// const list = [];
|
|
131
|
-
// for (let i = 0; i < 10; i++) {
|
|
132
|
-
// list.push({
|
|
133
|
-
// title: "User-" + id + "-" + list.length,
|
|
134
|
-
// key: "u-" + id + "-" + list.length,
|
|
135
|
-
// });
|
|
136
|
-
// }
|
|
137
|
-
// console.log(list);
|
|
138
|
-
|
|
139
|
-
// // pageRef.current
|
|
140
|
-
// setOptions(list);
|
|
141
|
-
// }, 100);
|
|
142
|
-
// }
|
|
143
|
-
|
|
144
|
-
// function onUserCheck(key) {
|
|
145
|
-
|
|
146
|
-
// const is = selected.includes(key);
|
|
147
|
-
// if (!is) {
|
|
148
|
-
// setSelected([...selected, key])
|
|
149
|
-
// const item = options.find((it) => it.key === key);
|
|
150
|
-
// selectedRef.current = [...selectedRef.current, {
|
|
151
|
-
// ...item,
|
|
152
|
-
// id: item.key,
|
|
153
|
-
// name: item.title,
|
|
154
|
-
// }]
|
|
155
|
-
// } else {
|
|
156
|
-
// setSelected(selected.filter((it) => it !== key));
|
|
157
|
-
// selectedRef.current = selectedRef.current.filter((it) => it.key !== key);
|
|
158
|
-
// }
|
|
159
|
-
// }
|
|
160
|
-
|
|
161
|
-
// function deleteSelected(key) {
|
|
162
|
-
// setSelected(selected.filter((it) => it !== key));
|
|
163
|
-
// selectedRef.current = selectedRef.current.filter((it) => it.key !== key);
|
|
164
|
-
// }
|
|
165
|
-
|
|
166
|
-
|
|
167
28
|
return (
|
|
168
29
|
<div className="selector">
|
|
169
30
|
<Modal
|
|
170
31
|
wrapClassName="selector-modal"
|
|
171
32
|
open={open}
|
|
172
33
|
title={titleMap[type - 1]}
|
|
173
|
-
width={
|
|
34
|
+
width={850}
|
|
174
35
|
destroyOnClose
|
|
175
36
|
getContainer="body"
|
|
176
37
|
onCancel={onModalClose}
|
|
@@ -183,59 +44,11 @@ export const Selector = (props) => {
|
|
|
183
44
|
</div>
|
|
184
45
|
}
|
|
185
46
|
>
|
|
186
|
-
<GroupUserSelector
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
</div>
|
|
192
|
-
<div className="sc-user-select__select">
|
|
193
|
-
{type == 1 ? <div className="sc-user-select__tree" v-loading="showGrouploading">
|
|
194
|
-
<Tree className="menu" ref={groupTreeRef} treeData={groupOptions} onSelect={groupClick} />
|
|
195
|
-
</div> : null}
|
|
196
|
-
<div className="sc-user-select__user" v-loading="showUserloading">
|
|
197
|
-
<div className="sc-user-select__user__list">
|
|
198
|
-
{options?.map((item) => {
|
|
199
|
-
return (
|
|
200
|
-
<div className="sc-user-select__user__item" key={item.key}>
|
|
201
|
-
<Checkbox
|
|
202
|
-
checked={selected.includes(item.key)}
|
|
203
|
-
onChange={(e) => onUserCheck(item.key)}
|
|
204
|
-
>
|
|
205
|
-
{item.title}
|
|
206
|
-
</Checkbox>
|
|
207
|
-
</div>
|
|
208
|
-
)
|
|
209
|
-
})}
|
|
210
|
-
</div>
|
|
211
|
-
<footer>
|
|
212
|
-
<Pagination simple size="small" total={50} showSizeChanger showQuickJumper></Pagination>
|
|
213
|
-
</footer>
|
|
214
|
-
</div>
|
|
215
|
-
</div>
|
|
216
|
-
</div>
|
|
217
|
-
<div className="sc-user-select__toicon">
|
|
218
|
-
<RightOutlined />
|
|
219
|
-
</div>
|
|
220
|
-
<div className="sc-user-select__selected">
|
|
221
|
-
<header>已选 ({selected?.length ?? 0})</header>
|
|
222
|
-
<ul className="sc-user-select__selected-list">
|
|
223
|
-
{selectedRef.current?.map((item, idx) => {
|
|
224
|
-
return (
|
|
225
|
-
<li key={item.id ?? item.key}>
|
|
226
|
-
<span className="name">
|
|
227
|
-
<Avatar size="small">{item.title?.substring(0, 1)}</Avatar>
|
|
228
|
-
<label>{item.title}</label>
|
|
229
|
-
</span>
|
|
230
|
-
<span className="delete">
|
|
231
|
-
<DeleteOutlined onClick={() => deleteSelected(item.id ?? item.key)}></DeleteOutlined>
|
|
232
|
-
</span>
|
|
233
|
-
</li>
|
|
234
|
-
);
|
|
235
|
-
})}
|
|
236
|
-
</ul>
|
|
237
|
-
</div>
|
|
238
|
-
</div> */}
|
|
47
|
+
<GroupUserSelector
|
|
48
|
+
ref={selectorRef}
|
|
49
|
+
{...(drawerType == 1 ? initiatorListConfig : type == 2 ? roleListConfig : listConfig)}
|
|
50
|
+
value={value}
|
|
51
|
+
/>
|
|
239
52
|
</Modal>
|
|
240
53
|
</div>
|
|
241
54
|
);
|
package/src/index.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect,
|
|
1
|
+
import { useEffect, useImperativeHandle, forwardRef, useState } from "react";
|
|
2
2
|
import { Button, Drawer } from "antd";
|
|
3
3
|
|
|
4
4
|
import ScWorkflow from "./components/ScWorkflow";
|
|
@@ -43,14 +43,8 @@ function copy(str) {
|
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
function FlowlongDesigner(props) {
|
|
47
|
-
const {
|
|
48
|
-
value,
|
|
49
|
-
flowName,
|
|
50
|
-
roleListConfig,
|
|
51
|
-
listConfig,
|
|
52
|
-
initiatorListConfig
|
|
53
|
-
} = props;
|
|
46
|
+
function FlowlongDesigner(props, ref) {
|
|
47
|
+
const { value, flowName, roleListConfig, listConfig, initiatorListConfig } = props;
|
|
54
48
|
const [drawer, setDrawer] = useState(false);
|
|
55
49
|
const [zoom, setZoom] = useState(1);
|
|
56
50
|
const [data, setData] = useState(Object.keys(value || {}).length > 0 ? value : getInitNodeData({ name: flowName }));
|
|
@@ -59,17 +53,22 @@ function FlowlongDesigner(props) {
|
|
|
59
53
|
type: -1,
|
|
60
54
|
drawerType: -1,
|
|
61
55
|
value: [],
|
|
62
|
-
onSave: (s) => {
|
|
56
|
+
onSave: (s) => {},
|
|
63
57
|
roleListConfig: {},
|
|
64
58
|
listConfig: {},
|
|
65
59
|
initiatorListConfig: {},
|
|
66
60
|
});
|
|
67
61
|
|
|
62
|
+
// 通过useImperativeHandle定义要抛出的值或方法
|
|
63
|
+
useImperativeHandle(ref, () => ({
|
|
64
|
+
data,
|
|
65
|
+
}));
|
|
66
|
+
|
|
68
67
|
useEffect(() => {
|
|
69
68
|
value && setData(value);
|
|
70
69
|
}, [value]);
|
|
71
70
|
|
|
72
|
-
function saveAsPng() {
|
|
71
|
+
function saveAsPng() {}
|
|
73
72
|
function copyParseJson() {
|
|
74
73
|
copy(JSON.stringify(data, null, 2));
|
|
75
74
|
}
|
|
@@ -95,7 +94,7 @@ function FlowlongDesigner(props) {
|
|
|
95
94
|
onSave,
|
|
96
95
|
roleListConfig,
|
|
97
96
|
listConfig,
|
|
98
|
-
initiatorListConfig
|
|
97
|
+
initiatorListConfig,
|
|
99
98
|
});
|
|
100
99
|
},
|
|
101
100
|
onClose() {
|
|
@@ -104,10 +103,10 @@ function FlowlongDesigner(props) {
|
|
|
104
103
|
type: -1,
|
|
105
104
|
drawerType: -1,
|
|
106
105
|
value: [],
|
|
107
|
-
onSave: (s) => {
|
|
106
|
+
onSave: (s) => {},
|
|
108
107
|
roleListConfig,
|
|
109
108
|
listConfig,
|
|
110
|
-
initiatorListConfig
|
|
109
|
+
initiatorListConfig,
|
|
111
110
|
});
|
|
112
111
|
},
|
|
113
112
|
}}
|
|
@@ -156,4 +155,4 @@ function FlowlongDesigner(props) {
|
|
|
156
155
|
);
|
|
157
156
|
}
|
|
158
157
|
|
|
159
|
-
export default FlowlongDesigner;
|
|
158
|
+
export default forwardRef(FlowlongDesigner);
|