@kne/form-info 0.1.5 → 0.1.6
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/README.md +690 -100
- package/dist/index.js +13 -6
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +2 -2
- package/dist/index.modern.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,32 +48,116 @@ npm i --save @kne/form-info
|
|
|
48
48
|
|
|
49
49
|
```jsx
|
|
50
50
|
const {default: FormInfo, List, TableList, MultiField, Form, Input, TextArea, SubmitButton, ResetButton} = _FormInfo;
|
|
51
|
-
const {Flex} = antd;
|
|
51
|
+
const {Flex, message, Divider, Switch, Space} = antd;
|
|
52
|
+
const {useState} = React;
|
|
52
53
|
|
|
53
54
|
const BaseExample = () => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
55
|
+
const [loading, setLoading] = useState(false);
|
|
56
|
+
const [formData, setFormData] = useState({
|
|
57
|
+
employeeId: 'EMP20240001',
|
|
58
|
+
name: '张三',
|
|
59
|
+
department: '技术研发部',
|
|
60
|
+
position: '高级前端工程师'
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// 模拟表单提交
|
|
64
|
+
const handleSubmit = async (formData) => {
|
|
65
|
+
setLoading(true);
|
|
66
|
+
console.log('提交的表单数据:', formData);
|
|
67
|
+
|
|
68
|
+
// 模拟API请求
|
|
69
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
70
|
+
|
|
71
|
+
message.success('员工信息提交成功!');
|
|
72
|
+
setLoading(false);
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
return <Form data={formData} onSubmit={handleSubmit}>
|
|
76
|
+
<FormInfo
|
|
77
|
+
title="员工基本信息"
|
|
78
|
+
subtitle="请填写员工的基本个人信息"
|
|
79
|
+
column={2}
|
|
80
|
+
gap={20}
|
|
81
|
+
list={[
|
|
82
|
+
<Input name="employeeId" label="工号" rule="REQ" disabled />,
|
|
83
|
+
<Input name="name" label="姓名" rule="REQ" placeholder="请输入员工姓名" />,
|
|
84
|
+
<Input name="department" label="所属部门" rule="REQ" placeholder="例如:技术研发部" />,
|
|
85
|
+
<Input name="position" label="职位" rule="REQ" placeholder="例如:高级前端工程师" />,
|
|
86
|
+
<Input name="phone" label="联系电话" rule="REQ TEL" placeholder="请输入11位手机号" />,
|
|
87
|
+
<Input name="email" label="邮箱" rule="REQ EMAIL" placeholder="请输入企业邮箱" />,
|
|
88
|
+
<Input name="idCard" label="身份证号" rule="REQ ID_CARD" placeholder="请输入18位身份证号" />,
|
|
89
|
+
<TextArea name="skills" label="技能特长" placeholder="请描述员工的专业技能" block />,
|
|
90
|
+
<MultiField
|
|
91
|
+
name="certificates"
|
|
92
|
+
label="职业证书"
|
|
93
|
+
field={Input}
|
|
94
|
+
block
|
|
95
|
+
addText="添加证书"
|
|
96
|
+
placeholder="例如:PMP项目管理认证"
|
|
97
|
+
/>,
|
|
98
|
+
<TextArea name="remarks" label="备注信息" placeholder="其他需要说明的信息" block />
|
|
99
|
+
]}
|
|
100
|
+
/>
|
|
101
|
+
|
|
102
|
+
<Divider />
|
|
103
|
+
|
|
104
|
+
<List
|
|
105
|
+
title="工作经历"
|
|
106
|
+
name="workExperience"
|
|
107
|
+
itemTitle={({index, data}) => data?.companyName || `工作经历 ${index + 1}`}
|
|
108
|
+
important
|
|
109
|
+
maxLength={5}
|
|
110
|
+
addText="添加工作经历"
|
|
111
|
+
list={[
|
|
112
|
+
<Input name="companyName" label="公司名称" rule="REQ" placeholder="例如:阿里巴巴集团" />,
|
|
113
|
+
<Input name="jobTitle" label="职位名称" rule="REQ" placeholder="例如:高级开发工程师" />,
|
|
114
|
+
<Input name="workYears" label="工作年限" rule="REQ" placeholder="例如:3年" />,
|
|
115
|
+
<TextArea name="workDescription" label="工作描述" placeholder="请描述主要工作内容和成就" block />,
|
|
116
|
+
<List
|
|
117
|
+
title="项目经历"
|
|
118
|
+
name="projects"
|
|
119
|
+
itemTitle={({index, data}) => data?.projectName || `项目 ${index + 1}`}
|
|
120
|
+
list={[
|
|
121
|
+
<Input name="projectName" label="项目名称" rule="REQ" placeholder="例如:双十一活动系统" />,
|
|
122
|
+
<Input name="projectRole" label="担任角色" rule="REQ" placeholder="例如:技术负责人" />,
|
|
123
|
+
<TextArea name="projectDescription" label="项目描述" placeholder="项目背景、职责和成果" block />
|
|
124
|
+
]}
|
|
125
|
+
block
|
|
126
|
+
/>
|
|
127
|
+
]}
|
|
128
|
+
/>
|
|
129
|
+
|
|
130
|
+
<Divider />
|
|
131
|
+
|
|
132
|
+
<TableList
|
|
133
|
+
title="家庭成员信息"
|
|
134
|
+
name="familyMembers"
|
|
135
|
+
itemTitle={({index}) => `家庭成员 ${index + 1}`}
|
|
136
|
+
maxLength={10}
|
|
137
|
+
addText="添加家庭成员"
|
|
138
|
+
list={[
|
|
139
|
+
<Input name="memberName" label="姓名" rule="REQ" placeholder="家庭成员姓名" />,
|
|
140
|
+
<Input name="relationship" label="关系" rule="REQ" placeholder="例如:配偶、子女" />,
|
|
141
|
+
<Input name="memberPhone" label="联系电话" rule="TEL" placeholder="联系电话" />,
|
|
142
|
+
<Input name="workUnit" label="工作单位" placeholder="工作单位名称" />
|
|
143
|
+
]}
|
|
144
|
+
/>
|
|
145
|
+
|
|
146
|
+
<Divider />
|
|
147
|
+
|
|
148
|
+
<FormInfo
|
|
149
|
+
title="紧急联系人"
|
|
150
|
+
column={3}
|
|
151
|
+
list={[
|
|
152
|
+
<Input name="emergencyContact" label="姓名" rule="REQ" placeholder="紧急联系人姓名" />,
|
|
153
|
+
<Input name="emergencyRelation" label="关系" rule="REQ" placeholder="与员工关系" />,
|
|
154
|
+
<Input name="emergencyPhone" label="电话" rule="REQ TEL" placeholder="联系电话" />
|
|
155
|
+
]}
|
|
156
|
+
/>
|
|
157
|
+
|
|
158
|
+
<Flex justify="center" gap={12} style={{marginTop: 24}}>
|
|
159
|
+
<SubmitButton loading={loading}>提交信息</SubmitButton>
|
|
160
|
+
<ResetButton>重置表单</ResetButton>
|
|
77
161
|
</Flex>
|
|
78
162
|
</Form>;
|
|
79
163
|
};
|
|
@@ -87,25 +171,138 @@ render(<BaseExample/>);
|
|
|
87
171
|
- _FormInfo(@kne/current-lib_form-info),antd(antd),(@kne/current-lib_form-info/dist/index.css)
|
|
88
172
|
|
|
89
173
|
```jsx
|
|
90
|
-
const {default: FormInfo, FormModal, List, Input, TextArea} = _FormInfo;
|
|
174
|
+
const {default: FormInfo, FormModal, List, Input, TextArea, SubmitButton} = _FormInfo;
|
|
91
175
|
const {useState} = React;
|
|
92
|
-
const {Button} = antd;
|
|
176
|
+
const {Button, Space, message, Divider, Switch} = antd;
|
|
93
177
|
|
|
94
178
|
const BaseExample = () => {
|
|
95
179
|
const [open, onOpenChange] = useState(false);
|
|
180
|
+
const [autoClose, setAutoClose] = useState(true);
|
|
181
|
+
const [loading, setLoading] = useState(false);
|
|
182
|
+
|
|
183
|
+
// 模拟编辑的员工数据
|
|
184
|
+
const [employeeData, setEmployeeData] = useState({
|
|
185
|
+
id: 'EMP20240001',
|
|
186
|
+
name: '李四',
|
|
187
|
+
employeeNo: 'EMP001',
|
|
188
|
+
department: '产品部',
|
|
189
|
+
position: '产品经理',
|
|
190
|
+
phone: '13800138000',
|
|
191
|
+
email: 'lisi@company.com',
|
|
192
|
+
entryDate: '2024-01-15',
|
|
193
|
+
workExperience: [
|
|
194
|
+
{
|
|
195
|
+
companyName: '腾讯科技',
|
|
196
|
+
jobTitle: '产品经理',
|
|
197
|
+
workYears: '2年',
|
|
198
|
+
workDescription: '负责社交产品的规划与设计'
|
|
199
|
+
}
|
|
200
|
+
]
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// 表单提交处理
|
|
204
|
+
const handleSubmit = async (formData) => {
|
|
205
|
+
setLoading(true);
|
|
206
|
+
console.log('提交的员工数据:', formData);
|
|
207
|
+
|
|
208
|
+
// 模拟API请求
|
|
209
|
+
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
210
|
+
|
|
211
|
+
message.success('员工信息更新成功!');
|
|
212
|
+
setLoading(false);
|
|
213
|
+
|
|
214
|
+
// 如果autoClose为true,会自动关闭,否则需要手动关闭
|
|
215
|
+
if (!autoClose) {
|
|
216
|
+
// 可以在这里执行其他操作后再手动关闭
|
|
217
|
+
setTimeout(() => onOpenChange(false), 500);
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
// 自定义底部按钮
|
|
222
|
+
const customFooter = (submitProps) => (
|
|
223
|
+
<Space>
|
|
224
|
+
<Button onClick={() => onOpenChange(false)}>取消</Button>
|
|
225
|
+
<Button
|
|
226
|
+
type="primary"
|
|
227
|
+
loading={submitProps.loading}
|
|
228
|
+
onClick={submitProps.onSubmit}
|
|
229
|
+
>
|
|
230
|
+
保存并继续编辑
|
|
231
|
+
</Button>
|
|
232
|
+
<Button
|
|
233
|
+
type="primary"
|
|
234
|
+
loading={submitProps.loading}
|
|
235
|
+
onClick={() => {
|
|
236
|
+
submitProps.onSubmit();
|
|
237
|
+
}}
|
|
238
|
+
>
|
|
239
|
+
保存并关闭
|
|
240
|
+
</Button>
|
|
241
|
+
</Space>
|
|
242
|
+
);
|
|
243
|
+
|
|
96
244
|
return <>
|
|
97
|
-
<
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
245
|
+
<Space direction="vertical" size="middle">
|
|
246
|
+
<div>
|
|
247
|
+
<Space>
|
|
248
|
+
<span>自动关闭:</span>
|
|
249
|
+
<Switch checked={autoClose} onChange={setAutoClose} />
|
|
250
|
+
</Space>
|
|
251
|
+
</div>
|
|
252
|
+
<Button type="primary" onClick={() => onOpenChange(true)}>
|
|
253
|
+
编辑员工信息
|
|
254
|
+
</Button>
|
|
255
|
+
</Space>
|
|
256
|
+
|
|
257
|
+
{/* 标准用法 */}
|
|
258
|
+
<FormModal
|
|
259
|
+
title="编辑员工信息"
|
|
260
|
+
open={open}
|
|
261
|
+
onCancel={() => onOpenChange(false)}
|
|
262
|
+
formProps={{
|
|
263
|
+
data: employeeData,
|
|
264
|
+
onSubmit: handleSubmit
|
|
265
|
+
}}
|
|
266
|
+
autoClose={autoClose}
|
|
267
|
+
okText="保存"
|
|
268
|
+
cancelText="取消"
|
|
269
|
+
okType="primary"
|
|
270
|
+
width={800}
|
|
271
|
+
okButtonProps={{
|
|
272
|
+
loading: loading
|
|
273
|
+
}}
|
|
274
|
+
>
|
|
275
|
+
<FormInfo
|
|
276
|
+
title="基本信息"
|
|
277
|
+
column={2}
|
|
278
|
+
list={[
|
|
279
|
+
<Input name="employeeNo" label="工号" rule="REQ" disabled />,
|
|
280
|
+
<Input name="name" label="姓名" rule="REQ" placeholder="请输入员工姓名" />,
|
|
281
|
+
<Input name="department" label="部门" rule="REQ" placeholder="所属部门" />,
|
|
282
|
+
<Input name="position" label="职位" rule="REQ" placeholder="职位名称" />,
|
|
283
|
+
<Input name="phone" label="手机号" rule="REQ TEL" placeholder="11位手机号" />,
|
|
284
|
+
<Input name="email" label="邮箱" rule="EMAIL" placeholder="企业邮箱" />,
|
|
285
|
+
<Input name="entryDate" label="入职日期" placeholder="入职日期" />,
|
|
286
|
+
<TextArea name="remarks" label="备注" placeholder="备注信息" block />
|
|
287
|
+
]}
|
|
288
|
+
/>
|
|
289
|
+
|
|
290
|
+
<Divider />
|
|
291
|
+
|
|
292
|
+
<List
|
|
293
|
+
title="工作经历"
|
|
294
|
+
name="workExperience"
|
|
295
|
+
itemTitle={({index, data}) => data?.companyName || `工作经历 ${index + 1}`}
|
|
296
|
+
important
|
|
297
|
+
maxLength={5}
|
|
298
|
+
addText="添加工作经历"
|
|
299
|
+
list={[
|
|
300
|
+
<Input name="companyName" label="公司名称" rule="REQ" placeholder="公司全称" />,
|
|
301
|
+
<Input name="jobTitle" label="职位" rule="REQ" placeholder="职位名称" />,
|
|
302
|
+
<Input name="workYears" label="工作年限" placeholder="例如:3年" />,
|
|
303
|
+
<TextArea name="workDescription" label="工作描述" placeholder="主要工作内容" block />
|
|
304
|
+
]}
|
|
305
|
+
/>
|
|
109
306
|
</FormModal>
|
|
110
307
|
</>;
|
|
111
308
|
};
|
|
@@ -120,51 +317,269 @@ render(<BaseExample/>);
|
|
|
120
317
|
|
|
121
318
|
```jsx
|
|
122
319
|
const {default: FormInfo, FormSteps, List, Input, TextArea, SubmitButton, CancelButton} = _FormInfo;
|
|
123
|
-
const {Flex, Divider} = antd;
|
|
320
|
+
const {Flex, Divider, message, Button, Space, Card, Switch, Alert} = antd;
|
|
321
|
+
const {useState} = React;
|
|
322
|
+
|
|
124
323
|
const BaseExample = () => {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
324
|
+
const [loading, setLoading] = useState(false);
|
|
325
|
+
const [currentStep, setCurrentStep] = useState(0);
|
|
326
|
+
const [autoStep, setAutoStep] = useState(true);
|
|
327
|
+
|
|
328
|
+
// 员工入职办理流程数据
|
|
329
|
+
const onboardingData = {
|
|
330
|
+
// 第一步:个人信息
|
|
331
|
+
employeeName: '王五',
|
|
332
|
+
employeeId: 'EMP20240023',
|
|
333
|
+
idCard: '110101199001011234',
|
|
334
|
+
gender: '男',
|
|
335
|
+
birthday: '1990-01-01',
|
|
336
|
+
phone: '13900139000',
|
|
337
|
+
email: 'wangwu@company.com',
|
|
338
|
+
education: '本科',
|
|
339
|
+
graduateSchool: '北京大学',
|
|
340
|
+
major: '计算机科学与技术',
|
|
341
|
+
|
|
342
|
+
// 第二步:岗位信息
|
|
343
|
+
department: '技术研发部',
|
|
344
|
+
position: '前端开发工程师',
|
|
345
|
+
level: 'P6',
|
|
346
|
+
entryDate: '2024-03-04',
|
|
347
|
+
probationPeriod: '3个月',
|
|
348
|
+
salary: '面议',
|
|
349
|
+
workLocation: '北京总部',
|
|
350
|
+
|
|
351
|
+
// 第三步:银行账户
|
|
352
|
+
bankName: '中国工商银行',
|
|
353
|
+
bankAccount: '6222021234567890123',
|
|
354
|
+
bankBranch: '北京朝阳支行',
|
|
355
|
+
|
|
356
|
+
// 第四步:紧急联系人
|
|
357
|
+
emergencyContacts: [
|
|
358
|
+
{
|
|
359
|
+
name: '王母',
|
|
360
|
+
relationship: '母亲',
|
|
361
|
+
phone: '13800138001'
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
// 步骤变更回调
|
|
367
|
+
const handleStepChange = (current, formData) => {
|
|
368
|
+
console.log(`切换到第 ${current + 1} 步,表单数据:`, formData);
|
|
369
|
+
setCurrentStep(current);
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
// 流程完成回调
|
|
373
|
+
const handleComplete = async (formData) => {
|
|
374
|
+
setLoading(true);
|
|
375
|
+
console.log('入职办理完成,最终数据:', formData);
|
|
376
|
+
|
|
377
|
+
// 模拟API提交
|
|
378
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
379
|
+
|
|
380
|
+
message.success('入职办理完成!欢迎加入公司!');
|
|
381
|
+
setLoading(false);
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
return (
|
|
385
|
+
<Flex vertical gap={24}>
|
|
386
|
+
{/* 配置面板 */}
|
|
387
|
+
<Card title="配置选项" size="small">
|
|
388
|
+
<Space>
|
|
389
|
+
<span>自动切换步骤:</span>
|
|
390
|
+
<Switch checked={autoStep} onChange={setAutoStep} />
|
|
391
|
+
<Divider type="vertical" />
|
|
392
|
+
<span>当前步骤: 第 {currentStep + 1} 步</span>
|
|
393
|
+
</Space>
|
|
394
|
+
</Card>
|
|
395
|
+
|
|
396
|
+
{/* 水平方向步骤表单 */}
|
|
397
|
+
<Card title="员工入职办理流程(水平布局)">
|
|
398
|
+
<FormSteps
|
|
399
|
+
items={[{
|
|
400
|
+
title: '个人信息',
|
|
401
|
+
formProps: {
|
|
402
|
+
data: onboardingData
|
|
403
|
+
},
|
|
404
|
+
children: (
|
|
405
|
+
<>
|
|
406
|
+
<Alert
|
|
407
|
+
message="请填写员工基本个人信息"
|
|
408
|
+
type="info"
|
|
409
|
+
showIcon
|
|
410
|
+
style={{marginBottom: 16}}
|
|
411
|
+
/>
|
|
412
|
+
<FormInfo
|
|
413
|
+
title="个人资料"
|
|
414
|
+
column={2}
|
|
415
|
+
list={[
|
|
416
|
+
<Input name="employeeName" label="姓名" rule="REQ" placeholder="员工姓名" />,
|
|
417
|
+
<Input name="employeeId" label="工号" rule="REQ" disabled />,
|
|
418
|
+
<Input name="idCard" label="身份证号" rule="REQ ID_CARD" placeholder="18位身份证号" />,
|
|
419
|
+
<Input name="gender" label="性别" rule="REQ" placeholder="男/女" />,
|
|
420
|
+
<Input name="birthday" label="出生日期" placeholder="例如:1990-01-01" />,
|
|
421
|
+
<Input name="phone" label="手机号" rule="REQ TEL" placeholder="11位手机号" />,
|
|
422
|
+
<Input name="email" label="邮箱" rule="EMAIL" placeholder="个人邮箱" />,
|
|
423
|
+
<Input name="education" label="学历" rule="REQ" placeholder="例如:本科、硕士" />,
|
|
424
|
+
<Input name="graduateSchool" label="毕业院校" placeholder="学校名称" />,
|
|
425
|
+
<Input name="major" label="专业" placeholder="所学专业" />
|
|
426
|
+
]}
|
|
427
|
+
/>
|
|
428
|
+
<Flex justify="center" gap={8} style={{marginTop: 16}}>
|
|
429
|
+
<CancelButton>取消</CancelButton>
|
|
430
|
+
<SubmitButton>下一步</SubmitButton>
|
|
431
|
+
</Flex>
|
|
432
|
+
</>
|
|
433
|
+
)
|
|
434
|
+
}, {
|
|
435
|
+
title: '岗位信息',
|
|
436
|
+
formProps: {
|
|
437
|
+
data: onboardingData
|
|
438
|
+
},
|
|
439
|
+
children: (
|
|
440
|
+
<>
|
|
441
|
+
<FormInfo
|
|
442
|
+
title="岗位配置"
|
|
443
|
+
column={2}
|
|
444
|
+
list={[
|
|
445
|
+
<Input name="department" label="所属部门" rule="REQ" placeholder="例如:技术研发部" />,
|
|
446
|
+
<Input name="position" label="职位名称" rule="REQ" placeholder="职位名称" />,
|
|
447
|
+
<Input name="level" label="职级" rule="REQ" placeholder="例如:P6、P7" />,
|
|
448
|
+
<Input name="entryDate" label="入职日期" rule="REQ" placeholder="入职日期" />,
|
|
449
|
+
<Input name="probationPeriod" label="试用期" placeholder="例如:3个月" />,
|
|
450
|
+
<Input name="salary" label="薪资" placeholder="薪资信息" />,
|
|
451
|
+
<Input name="workLocation" label="工作地点" placeholder="工作城市" />,
|
|
452
|
+
<Input name="reportTo" label="汇报对象" placeholder="直属领导" />
|
|
453
|
+
]}
|
|
454
|
+
/>
|
|
455
|
+
<Flex justify="center" gap={8} style={{marginTop: 16}}>
|
|
456
|
+
<CancelButton>取消</CancelButton>
|
|
457
|
+
<SubmitButton>下一步</SubmitButton>
|
|
458
|
+
</Flex>
|
|
459
|
+
</>
|
|
460
|
+
)
|
|
461
|
+
}, {
|
|
462
|
+
title: '银行账户',
|
|
463
|
+
formProps: {
|
|
464
|
+
data: onboardingData
|
|
465
|
+
},
|
|
466
|
+
children: (
|
|
467
|
+
<>
|
|
468
|
+
<Alert
|
|
469
|
+
message="银行账户信息用于工资发放,请仔细核对"
|
|
470
|
+
type="warning"
|
|
471
|
+
showIcon
|
|
472
|
+
style={{marginBottom: 16}}
|
|
473
|
+
/>
|
|
474
|
+
<FormInfo
|
|
475
|
+
title="银行信息"
|
|
476
|
+
column={2}
|
|
477
|
+
list={[
|
|
478
|
+
<Input name="bankName" label="开户银行" rule="REQ" placeholder="例如:中国工商银行" />,
|
|
479
|
+
<Input name="bankBranch" label="开户支行" rule="REQ" placeholder="支行名称" />,
|
|
480
|
+
<Input name="bankAccount" label="银行账号" rule="REQ" placeholder="银行卡号" />,
|
|
481
|
+
<Input name="accountName" label="账户名" rule="REQ" placeholder="持卡人姓名" />
|
|
482
|
+
]}
|
|
483
|
+
/>
|
|
484
|
+
<Flex justify="center" gap={8} style={{marginTop: 16}}>
|
|
485
|
+
<CancelButton>取消</CancelButton>
|
|
486
|
+
<SubmitButton>下一步</SubmitButton>
|
|
487
|
+
</Flex>
|
|
488
|
+
</>
|
|
489
|
+
)
|
|
490
|
+
}, {
|
|
491
|
+
title: '紧急联系人',
|
|
492
|
+
formProps: {
|
|
493
|
+
data: onboardingData
|
|
494
|
+
},
|
|
495
|
+
children: (
|
|
496
|
+
<>
|
|
497
|
+
<List
|
|
498
|
+
title="紧急联系人列表"
|
|
499
|
+
name="emergencyContacts"
|
|
500
|
+
itemTitle={({index, data}) => data?.name || `联系人 ${index + 1}`}
|
|
501
|
+
important
|
|
502
|
+
maxLength={3}
|
|
503
|
+
addText="添加联系人"
|
|
504
|
+
list={[
|
|
505
|
+
<Input name="name" label="姓名" rule="REQ" placeholder="联系人姓名" />,
|
|
506
|
+
<Input name="relationship" label="关系" rule="REQ" placeholder="与员工关系" />,
|
|
507
|
+
<Input name="phone" label="联系电话" rule="REQ TEL" placeholder="联系电话" />,
|
|
508
|
+
<Input name="address" label="联系地址" placeholder="联系地址" />
|
|
509
|
+
]}
|
|
510
|
+
/>
|
|
511
|
+
<Flex justify="center" gap={8} style={{marginTop: 16}}>
|
|
512
|
+
<CancelButton>取消</CancelButton>
|
|
513
|
+
<SubmitButton loading={loading}>完成办理</SubmitButton>
|
|
514
|
+
</Flex>
|
|
515
|
+
</>
|
|
516
|
+
)
|
|
517
|
+
}]}
|
|
518
|
+
autoStep={autoStep}
|
|
519
|
+
onChange={handleStepChange}
|
|
520
|
+
onComplete={handleComplete}
|
|
521
|
+
stepsClassName="custom-steps"
|
|
522
|
+
/>
|
|
523
|
+
</Card>
|
|
524
|
+
|
|
525
|
+
<Divider />
|
|
526
|
+
|
|
527
|
+
{/* 垂直方向步骤表单 */}
|
|
528
|
+
<Card title="员工入职办理流程(垂直布局)">
|
|
529
|
+
<FormSteps
|
|
530
|
+
orientation="vertical"
|
|
531
|
+
items={[{
|
|
532
|
+
title: '个人信息',
|
|
533
|
+
formProps: {
|
|
534
|
+
data: onboardingData
|
|
535
|
+
},
|
|
536
|
+
children: (
|
|
537
|
+
<>
|
|
538
|
+
<FormInfo
|
|
539
|
+
title="个人资料"
|
|
540
|
+
column={2}
|
|
541
|
+
list={[
|
|
542
|
+
<Input name="employeeName" label="姓名" rule="REQ" />,
|
|
543
|
+
<Input name="employeeId" label="工号" rule="REQ" disabled />,
|
|
544
|
+
<Input name="idCard" label="身份证号" rule="REQ ID_CARD" />,
|
|
545
|
+
<Input name="phone" label="手机号" rule="REQ TEL" />
|
|
546
|
+
]}
|
|
547
|
+
/>
|
|
548
|
+
<Flex justify="center" gap={8} style={{marginTop: 16}}>
|
|
549
|
+
<CancelButton>取消</CancelButton>
|
|
550
|
+
<SubmitButton>下一步</SubmitButton>
|
|
551
|
+
</Flex>
|
|
552
|
+
</>
|
|
553
|
+
)
|
|
554
|
+
}, {
|
|
555
|
+
title: '岗位信息',
|
|
556
|
+
formProps: {
|
|
557
|
+
data: onboardingData
|
|
558
|
+
},
|
|
559
|
+
children: (
|
|
560
|
+
<>
|
|
561
|
+
<FormInfo
|
|
562
|
+
title="岗位配置"
|
|
563
|
+
column={2}
|
|
564
|
+
list={[
|
|
565
|
+
<Input name="department" label="部门" rule="REQ" />,
|
|
566
|
+
<Input name="position" label="职位" rule="REQ" />,
|
|
567
|
+
<Input name="entryDate" label="入职日期" rule="REQ" />
|
|
568
|
+
]}
|
|
569
|
+
/>
|
|
570
|
+
<Flex justify="center" gap={8} style={{marginTop: 16}}>
|
|
571
|
+
<CancelButton>取消</CancelButton>
|
|
572
|
+
<SubmitButton>完成</SubmitButton>
|
|
573
|
+
</Flex>
|
|
574
|
+
</>
|
|
575
|
+
)
|
|
576
|
+
}]}
|
|
577
|
+
autoStep={true}
|
|
578
|
+
onComplete={handleComplete}
|
|
579
|
+
/>
|
|
580
|
+
</Card>
|
|
581
|
+
</Flex>
|
|
582
|
+
);
|
|
168
583
|
};
|
|
169
584
|
|
|
170
585
|
render(<BaseExample/>);
|
|
@@ -176,44 +591,219 @@ render(<BaseExample/>);
|
|
|
176
591
|
- _FormInfo(@kne/current-lib_form-info),antd(antd),(@kne/current-lib_form-info/dist/index.css)
|
|
177
592
|
|
|
178
593
|
```jsx
|
|
179
|
-
const { default: FormInfo, FormStepsModal, List, Input, TextArea,
|
|
180
|
-
const { Flex, Button } = antd;
|
|
594
|
+
const { default: FormInfo, FormStepsModal, List, Input, TextArea, Select, DatePicker } = _FormInfo;
|
|
595
|
+
const { Flex, Button, Space, message, Divider, Result } = antd;
|
|
181
596
|
const { useState } = React;
|
|
182
597
|
|
|
183
598
|
const BaseExample = () => {
|
|
184
599
|
const [open, onOpenChange] = useState(false);
|
|
600
|
+
const [loading, setLoading] = useState(false);
|
|
601
|
+
const [currentStep, setCurrentStep] = useState(0);
|
|
602
|
+
|
|
603
|
+
// 模拟项目申请的初始数据
|
|
604
|
+
const projectData = {
|
|
605
|
+
// 第一步:项目基本信息
|
|
606
|
+
projectName: '智能客服系统',
|
|
607
|
+
projectType: 'internal',
|
|
608
|
+
department: '技术研发中心',
|
|
609
|
+
priority: 'high',
|
|
610
|
+
startDate: '2024-03-01',
|
|
611
|
+
endDate: '2024-08-31',
|
|
612
|
+
budget: '500000',
|
|
613
|
+
|
|
614
|
+
// 第二步:项目团队
|
|
615
|
+
teamMembers: [
|
|
616
|
+
{
|
|
617
|
+
name: '张三',
|
|
618
|
+
role: '技术负责人',
|
|
619
|
+
email: 'zhangsan@company.com',
|
|
620
|
+
phone: '13800138000'
|
|
621
|
+
}
|
|
622
|
+
],
|
|
623
|
+
|
|
624
|
+
// 第三步:项目详情
|
|
625
|
+
background: '现有客服系统效率低下,需要引入AI技术提升服务质量',
|
|
626
|
+
objectives: `1. 响应时间缩短50%\n2. 客户满意度提升30%\n3. 人力成本降低40%`,
|
|
627
|
+
deliverables: '智能客服系统一套,包含前端界面、后台管理、AI对话引擎'
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
// 步骤完成回调
|
|
631
|
+
const handleComplete = async (formData) => {
|
|
632
|
+
setLoading(true);
|
|
633
|
+
console.log('提交的项目申请数据:', formData);
|
|
634
|
+
|
|
635
|
+
// 模拟API提交
|
|
636
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
637
|
+
|
|
638
|
+
message.success('项目申请提交成功!');
|
|
639
|
+
setLoading(false);
|
|
640
|
+
onOpenChange(false);
|
|
641
|
+
|
|
642
|
+
// 可以在这里执行提交后的操作,如跳转到列表页
|
|
643
|
+
};
|
|
644
|
+
|
|
645
|
+
// 步骤变更回调
|
|
646
|
+
const handleStepChange = (current, data) => {
|
|
647
|
+
console.log(`切换到第 ${current + 1} 步,当前数据:`, data);
|
|
648
|
+
setCurrentStep(current);
|
|
649
|
+
};
|
|
650
|
+
|
|
185
651
|
return (
|
|
186
|
-
|
|
187
|
-
<Button
|
|
652
|
+
<Space direction="vertical" size="middle">
|
|
653
|
+
<Button
|
|
654
|
+
type="primary"
|
|
655
|
+
size="large"
|
|
188
656
|
onClick={() => {
|
|
657
|
+
setCurrentStep(0);
|
|
189
658
|
onOpenChange(true);
|
|
190
|
-
}}
|
|
191
|
-
|
|
659
|
+
}}
|
|
660
|
+
>
|
|
661
|
+
新建项目申请
|
|
192
662
|
</Button>
|
|
663
|
+
|
|
193
664
|
<FormStepsModal
|
|
194
|
-
modalProps={{
|
|
665
|
+
modalProps={{
|
|
666
|
+
open,
|
|
667
|
+
title: '项目立项申请',
|
|
668
|
+
onCancel: () => onOpenChange(false),
|
|
669
|
+
width: 900,
|
|
670
|
+
destroyOnClose: false
|
|
671
|
+
}}
|
|
195
672
|
items={[
|
|
196
673
|
{
|
|
197
|
-
title: '
|
|
674
|
+
title: '基本信息',
|
|
675
|
+
formProps: {
|
|
676
|
+
data: projectData
|
|
677
|
+
},
|
|
678
|
+
children: (
|
|
679
|
+
<>
|
|
680
|
+
<FormInfo
|
|
681
|
+
title="项目基本信息"
|
|
682
|
+
column={2}
|
|
683
|
+
list={[
|
|
684
|
+
<Input name="projectName" label="项目名称" rule="REQ" placeholder="请输入项目名称" />,
|
|
685
|
+
<Input name="projectType" label="项目类型" rule="REQ" placeholder="例如:内部项目、外部项目" />,
|
|
686
|
+
<Input name="department" label="所属部门" rule="REQ" placeholder="负责部门" />,
|
|
687
|
+
<Input name="priority" label="优先级" rule="REQ" placeholder="高、中、低" />,
|
|
688
|
+
<Input name="startDate" label="开始日期" rule="REQ" placeholder="计划开始时间" />,
|
|
689
|
+
<Input name="endDate" label="结束日期" rule="REQ" placeholder="计划结束时间" />,
|
|
690
|
+
<Input name="budget" label="预算金额" rule="REQ" placeholder="项目预算(元)" />,
|
|
691
|
+
<Input name="projectManager" label="项目经理" rule="REQ" placeholder="项目负责人" />
|
|
692
|
+
]}
|
|
693
|
+
/>
|
|
694
|
+
<Divider />
|
|
695
|
+
<FormInfo
|
|
696
|
+
title="项目背景"
|
|
697
|
+
column={1}
|
|
698
|
+
list={[
|
|
699
|
+
<TextArea
|
|
700
|
+
name="background"
|
|
701
|
+
label="项目背景"
|
|
702
|
+
rule="REQ"
|
|
703
|
+
placeholder="请描述项目背景和必要性"
|
|
704
|
+
block
|
|
705
|
+
rows={4}
|
|
706
|
+
/>
|
|
707
|
+
]}
|
|
708
|
+
/>
|
|
709
|
+
</>
|
|
710
|
+
)
|
|
711
|
+
},
|
|
712
|
+
{
|
|
713
|
+
title: '团队配置',
|
|
198
714
|
formProps: {
|
|
199
|
-
data:
|
|
200
|
-
phone: '10929299202'
|
|
201
|
-
}
|
|
715
|
+
data: projectData
|
|
202
716
|
},
|
|
203
|
-
children:
|
|
717
|
+
children: (
|
|
718
|
+
<>
|
|
719
|
+
<FormInfo
|
|
720
|
+
title="核心成员"
|
|
721
|
+
column={2}
|
|
722
|
+
list={[
|
|
723
|
+
<Input name="sponsor" label="项目发起人" rule="REQ" placeholder="发起人姓名" />,
|
|
724
|
+
<Input name="sponsorDept" label="发起人部门" rule="REQ" placeholder="所属部门" />
|
|
725
|
+
]}
|
|
726
|
+
/>
|
|
727
|
+
<Divider />
|
|
728
|
+
<List
|
|
729
|
+
title="项目团队成员"
|
|
730
|
+
name="teamMembers"
|
|
731
|
+
itemTitle={({index, data}) => data?.name || `成员 ${index + 1}`}
|
|
732
|
+
important
|
|
733
|
+
maxLength={10}
|
|
734
|
+
addText="添加团队成员"
|
|
735
|
+
list={[
|
|
736
|
+
<Input name="name" label="姓名" rule="REQ" placeholder="成员姓名" />,
|
|
737
|
+
<Input name="role" label="角色" rule="REQ" placeholder="例如:开发、测试、产品" />,
|
|
738
|
+
<Input name="email" label="邮箱" rule="EMAIL" placeholder="企业邮箱" />,
|
|
739
|
+
<Input name="phone" label="手机号" rule="TEL" placeholder="联系电话" />,
|
|
740
|
+
<Input name="joinDate" label="参与时间" placeholder="加入项目时间" />,
|
|
741
|
+
<Input name="workload" label="投入比例" placeholder="例如:50%" />
|
|
742
|
+
]}
|
|
743
|
+
/>
|
|
744
|
+
</>
|
|
745
|
+
)
|
|
204
746
|
},
|
|
205
747
|
{
|
|
206
|
-
title: '
|
|
748
|
+
title: '项目详情',
|
|
207
749
|
formProps: {
|
|
208
|
-
data:
|
|
209
|
-
phone: '11939388383'
|
|
210
|
-
}
|
|
750
|
+
data: projectData
|
|
211
751
|
},
|
|
212
|
-
children:
|
|
752
|
+
children: (
|
|
753
|
+
<>
|
|
754
|
+
<FormInfo
|
|
755
|
+
title="项目目标与交付物"
|
|
756
|
+
column={1}
|
|
757
|
+
list={[
|
|
758
|
+
<TextArea
|
|
759
|
+
name="objectives"
|
|
760
|
+
label="项目目标"
|
|
761
|
+
rule="REQ"
|
|
762
|
+
placeholder="请列出项目的主要目标(每行一个)"
|
|
763
|
+
block
|
|
764
|
+
rows={4}
|
|
765
|
+
/>,
|
|
766
|
+
<TextArea
|
|
767
|
+
name="deliverables"
|
|
768
|
+
label="交付物清单"
|
|
769
|
+
rule="REQ"
|
|
770
|
+
placeholder="项目需要交付的成果物"
|
|
771
|
+
block
|
|
772
|
+
rows={3}
|
|
773
|
+
/>,
|
|
774
|
+
<TextArea
|
|
775
|
+
name="risks"
|
|
776
|
+
label="风险与应对"
|
|
777
|
+
placeholder="可能存在的风险及应对措施"
|
|
778
|
+
block
|
|
779
|
+
rows={3}
|
|
780
|
+
/>
|
|
781
|
+
]}
|
|
782
|
+
/>
|
|
783
|
+
<Divider />
|
|
784
|
+
<List
|
|
785
|
+
title="里程碑计划"
|
|
786
|
+
name="milestones"
|
|
787
|
+
itemTitle={({index, data}) => data?.milestoneName || `里程碑 ${index + 1}`}
|
|
788
|
+
addText="添加里程碑"
|
|
789
|
+
list={[
|
|
790
|
+
<Input name="milestoneName" label="里程碑名称" rule="REQ" placeholder="例如:需求确认" />,
|
|
791
|
+
<Input name="plannedDate" label="计划日期" rule="REQ" placeholder="预计完成日期" />,
|
|
792
|
+
<Input name="deliverable" label="交付物" placeholder="该阶段的交付物" />,
|
|
793
|
+
<TextArea name="milestoneDesc" label="说明" placeholder="里程碑说明" block />
|
|
794
|
+
]}
|
|
795
|
+
/>
|
|
796
|
+
</>
|
|
797
|
+
)
|
|
213
798
|
}
|
|
214
799
|
]}
|
|
800
|
+
autoStep={true}
|
|
801
|
+
completeText="提交申请"
|
|
802
|
+
nextText="下一步"
|
|
803
|
+
onComplete={handleComplete}
|
|
804
|
+
onChange={handleStepChange}
|
|
215
805
|
/>
|
|
216
|
-
|
|
806
|
+
</Space>
|
|
217
807
|
);
|
|
218
808
|
};
|
|
219
809
|
|