@hzab/flowlong-designer 0.0.2 → 0.0.4

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 CHANGED
@@ -1,5 +1,15 @@
1
+ # @hzab/flowlong-designer@0.0.4
2
+
3
+ 条件选择数据兼容
4
+
5
+ # @hzab/flowlong-designer@0.0.3
6
+
7
+ 完善类型选择、抛出值
8
+
1
9
  # @hzab/flowlong-designer@0.0.2
10
+
2
11
  重构人员选择
3
12
 
4
13
  # @hzab/flowlong-designer@0.0.1
14
+
5
15
  组件初始化
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hzab/flowlong-designer",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "自定义审批流配置组件",
5
5
  "main": "src",
6
6
  "scripts": {
@@ -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 ? "直接主管" : `发起人的第${nodeConf.examineLevel}级主管`;
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(1, form.nodeAssigneeList, (selected) => {
197
- setForm((f) => {
198
- // 设置 人员、角色 列表数组
199
- f.nodeAssigneeList = selected;
200
- return { ...f };
201
- });
202
- },2)
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(2, form.nodeAssigneeList, (selected) => {
250
- setForm((f) => {
251
- // 设置 人员、角色 列表数组
252
- f.nodeAssigneeList = selected;
253
- return { ...f };
254
- });
255
- },2)
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: "主管", value: 2 },
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
  /**
@@ -100,10 +100,10 @@ export const Branch = (props) => {
100
100
  .map((conditionGroup) =>
101
101
  conditionGroup.map((item) => {
102
102
  if (item?.field === "dept") {
103
- return `${item.label}${item.operator}${item.value?.map((el) => el?.label)}`;
103
+ return `${item.label}${item.operator}${item.values?.map((el) => el?.label)}`;
104
104
  }
105
105
  if (item?.field === "useId") {
106
- return `${item.label}${item.operator}${item.value?.map((el) => el?.userName)}`;
106
+ return `${item.label}${item.operator}${item.values?.map((el) => el?.userName)}`;
107
107
  }
108
108
  return `${item.label}${item.operator}${item.value}`;
109
109
  }),
@@ -380,10 +380,11 @@ export const Branch = (props) => {
380
380
  className="condition-content-box-item"
381
381
  ></Select>
382
382
  <Field
383
- value={condition.value}
383
+ value={condition?.values || []}
384
384
  type={condition.field}
385
385
  onChange={(e) => {
386
- condition.value = e;
386
+ condition.value = e?.map((item) => item?.value)?.join(",");
387
+ condition.values = e;
387
388
  // 更新数据
388
389
  setForm((f) => ({ ...f }));
389
390
  }}
@@ -5,3 +5,6 @@
5
5
  }
6
6
  }
7
7
  }
8
+ .send-title {
9
+ background-color: #3296fa;
10
+ }
@@ -1,20 +1,16 @@
1
1
  import { useRef, useState, useContext } from "react";
2
- import { Drawer, Button, Input, Form, Tag, Switch, Select, Radio, InputNumber } from "antd";
3
- import { EditOutlined, SendOutlined, DeleteOutlined, PlusOutlined } from "@ant-design/icons";
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 "./index.less";
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
- const [drawer, setDrawer] = useState(false);
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 onDrawerClose() {
43
- setDrawer(false);
40
+ function onNodeDel(e) {
41
+ e.stopPropagation();
42
+ onChange && onChange(modelValue.childNode);
44
43
  }
45
44
 
46
- function onEditTitle() {
47
- setIsEditTitle(true);
48
- if (nodeTitleRef.current) {
49
- // @ts-ignore
50
- nodeTitleRef.current?.focus();
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
- // nodeConfig.conditionNodes[curIdxRef.current] = form;
64
- onChange && onChange({ ...form });
92
+ // 强制更新数据
93
+ onChange && onChange(form);
65
94
  onDrawerClose();
66
95
  }
67
96
 
68
- function delNode() {
69
- onChange && onChange({ ...nodeConfig.childNode });
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="send">
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
- <SendOutlined className="icon" />
111
- <span>{nodeConfig.nodeName || "抄送人"}</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(nodeConfig) ? <span>{toText(nodeConfig)}</span> : <span className="placeholder">请选择人员</span>}
125
+ {toText(modelValue) ? <span>{toText(modelValue)}</span> : <span className="placeholder">请选择</span>}
122
126
  </div>
123
127
  </div>
128
+
124
129
  <AddNode
125
- modelValue={nodeConfig.childNode}
130
+ modelValue={modelValue?.childNode}
126
131
  onChange={(val) => {
127
- nodeConfig.childNode = val;
128
- onChange && onChange({ ...nodeConfig });
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 label-position="top" initialValues={form}>
167
- <Form.Item label="抄送人类型" name="setType">
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
- setForm((f) => {
193
- // 设置 人员、角色 列表数组
194
- f.nodeAssigneeList = selected;
195
- return { ...f };
196
- });
197
- },
198
- 2
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(2, form.nodeAssigneeList, (selected) => {
247
- setForm((f) => {
248
- // 设置 人员、角色 列表数组
249
- f.nodeAssigneeList = selected;
250
- return { ...f };
251
- });
252
- },2)
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
- {/* <Form.Item label="选择要抄送的人员">
322
- <Button
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.userSelectFlag}
341
+ checked={form.termAuto}
356
342
  onChange={(val) => {
357
343
  setForm((f) => {
358
- form.userSelectFlag = val;
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 Send;
399
+ export default Approver;
@@ -3,11 +3,12 @@
3
3
  */
4
4
  export const setTypeOptions = [
5
5
  { label: "指定成员", value: 1 },
6
- { label: "主管", value: 2 },
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 '@hzab/group-user-selector'
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 } = selectorCtx.selectHandler;
15
- // const [groupOptions, setGroupOptions] = useState([
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={800}
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 ref={selectorRef} {...(drawerType == 1 ? initiatorListConfig : type == 2 ? roleListConfig : listConfig)} value={value}/>
187
- {/* <div className="sc-user-select">
188
- <div className="sc-user-select__left">
189
- <div className="sc-user-select__search">
190
- <Input.Search onSearch={onSearch} enterButton placeholder="搜索成员" />
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, useRef, useState } from "react";
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);