@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 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
- return <Form>
55
- <FormInfo title="标题" subtitle="附标题" list={[<Input name="field_1" label="字段1" rule="REQ"/>,
56
- <Input name="field_2" label="字段2" rule="REQ"/>,
57
- <Input name="field_3" hidden label="隐藏字段" rule="REQ"/>,
58
- <MultiField name="field_4" label="字段4" rule="REQ" field={Input} block/>,
59
- <TextArea name="description" label="描述" block/>]}/>
60
- <List title="列表" name="list-1" itemTitle={({index}) => `项目${index + 1}`}
61
- list={[<Input name="field_1" label="字段1" rule="REQ"/>, <Input name="field_2" label="字段2" rule="REQ"/>,
62
- <TextArea name="description" label="描述" block/>]}/>
63
- <List title="复杂列表" name="list-2" itemTitle={({index}) => `项目${index + 1}`} important maxLength={2}
64
- list={[<Input name="field_1" label="字段1" rule="REQ"/>, <Input name="field_2" label="字段2" rule="REQ"/>,
65
- <TextArea name="description" label="描述" block/>,
66
- <List title="子级列表" itemTitle={({index}) => `子级项目${index + 1}`}
67
- list={[<Input name="field_1" label="字段1" rule="REQ"/>,
68
- <Input name="field_2" label="字段2" rule="REQ"/>,
69
- <TextArea name="description" label="描述" block/>]} block/>]}/>
70
- <TableList title="表格列表" name="list-3" itemTitle={({index}) => `项目${index + 1}`} maxLength={2}
71
- list={[<Input name="field_1" label="字段1" rule="REQ"/>,
72
- <Input name="field_2" label="字段2" rule="REQ"/>,
73
- <Input name="description" label="描述" block/>]}/>
74
- <Flex justify="center" gap={8}>
75
- <SubmitButton>提交</SubmitButton>
76
- <ResetButton>重置</ResetButton>
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
- <Button onClick={() => {
98
- onOpenChange(true);
99
- }}>打开Form弹窗</Button>
100
- <FormModal formProps={{
101
- data: {name: '张三'}
102
- }} open={open} onCancel={() => {
103
- onOpenChange(false);
104
- }}>
105
- <FormInfo title="基本信息" column={1} list={[<Input name="name" label="姓名" rule="REQ"/>,
106
- <Input name="phone" label="电话" rule="REQ TEL"/>, <TextArea name="description" label="描述" block/>]}/>
107
- <List title="工作经历" list={[<Input name="name" label="姓名" rule="REQ"/>,
108
- <Input name="phone" label="电话" rule="REQ TEL"/>, <TextArea name="description" label="描述" block/>]}/>
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
- return <Flex vertical>
126
- <FormSteps items={[{
127
- title: '表单1',
128
- formProps: {},
129
- children: <FormInfo title="基本信息" list={[<Input name="name" label="姓名" rule="REQ"/>,
130
- <Input name="phone" label="电话" rule="REQ TEL"/>, <TextArea name="description" label="描述" block/>,
131
- <Flex block justify="center" gap={8}>
132
- <SubmitButton>提交</SubmitButton>
133
- <CancelButton>取消</CancelButton>
134
- </Flex>]}/>
135
- }, {
136
- title: '表单2', formProps: {}, children: <>
137
- <List title="工作经历" list={[<Input name="name" label="姓名" rule="REQ"/>,
138
- <Input name="phone" label="电话" rule="REQ TEL"/>,
139
- <TextArea name="description" label="描述" block/>]}/>
140
- <Flex justify="center" gap={8}>
141
- <SubmitButton>提交</SubmitButton>
142
- <CancelButton>取消</CancelButton>
143
- </Flex>
144
- </>
145
- }]}/>
146
- <Divider/>
147
- <FormSteps orientation="vertical" items={[{
148
- title: '表单1',
149
- formProps: {},
150
- children: <FormInfo title="基本信息" list={[<Input name="name" label="姓名" rule="REQ"/>,
151
- <Input name="phone" label="电话" rule="REQ TEL"/>, <TextArea name="description" label="描述" block/>,
152
- <Flex block justify="center" gap={8}>
153
- <SubmitButton>提交</SubmitButton>
154
- <CancelButton>取消</CancelButton>
155
- </Flex>]}/>
156
- }, {
157
- title: '表单2', formProps: {}, children: <>
158
- <List title="工作经历" list={[<Input name="name" label="姓名" rule="REQ"/>,
159
- <Input name="phone" label="电话" rule="REQ TEL"/>,
160
- <TextArea name="description" label="描述" block/>]}/>
161
- <Flex justify="center" gap={8}>
162
- <SubmitButton>提交</SubmitButton>
163
- <CancelButton>取消</CancelButton>
164
- </Flex>
165
- </>
166
- }]}/>
167
- </Flex>
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, SubmitButton, CancelButton } = _FormInfo;
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
- 打开StepsForm弹窗
659
+ }}
660
+ >
661
+ 新建项目申请
192
662
  </Button>
663
+
193
664
  <FormStepsModal
194
- modalProps={{ open, title: '多步骤表单', onCancel: () => onOpenChange(false) }}
665
+ modalProps={{
666
+ open,
667
+ title: '项目立项申请',
668
+ onCancel: () => onOpenChange(false),
669
+ width: 900,
670
+ destroyOnClose: false
671
+ }}
195
672
  items={[
196
673
  {
197
- title: '表单1',
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: <FormInfo title="基本信息" list={[<Input name="name" label="姓名" rule="REQ" />, <Input name="phone" label="电话" rule="REQ TEL" />, <TextArea name="description" label="描述" block />]} />
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: '表单2',
748
+ title: '项目详情',
207
749
  formProps: {
208
- data: {
209
- phone: '11939388383'
210
- }
750
+ data: projectData
211
751
  },
212
- children: <List title="工作经历" list={[<Input name="name" label="姓名" rule="REQ" />, <Input name="phone" label="电话" rule="REQ TEL" />, <TextArea name="description" label="描述" block />]} />
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